Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Truyền dữ liệu giữa các Form

  1. #1
    Ngày gia nhập
    02 2008
    Bài viết
    3

    Thumbs down Truyền dữ liệu giữa các Form

    Chào các bác Pro có vấn đề này tìm chưa ra mong giúp đỡ
    Mình tạo 2 form A và B
    Form A gồm có 1 editbox và có nút gọi Form B
    Form B gồm có 1 editbox, 1 nút OK , 1 nút Cancel
    Khi form A chạy gọi form B nhập 1 giá trị bất kỳ vào editbox của form B, nếu ta nhấn OK ở Form B thì giá trị text trong form B sẽ hiển thị trong ô edit text trong form A và form B tắt, còn ấn phím Cancel thì thoát khỏi form B ko lấy giá trị trong EditBox
    code mình làm trong form A như sau nhưng nó báo lỗi

    void CFormA::OnBnClickedOk()
    {
    // TODO: Add your control notification handler code here

    CFormB *p_formB = new CFormB();
    if(p_p_formB->DoModal() == IDOK)
    {
    CString str;
    str = p_formB->GetDlgItemTextW(IDC_EDIT1, str);//IDC_EDIT1 la EditBox của form B
    this->SetDlgItemTextW(IDD_EDIT1,str);//IDC_EDIT1 là EditBox của form A
    MessageBox(_T("OKey"));
    return;
    }

    }
    biên dịch thì ko có lỗi nhưng chạy thì ko lấy được dữ liệu như yêu cầu

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Bạn làm mfc thì chịu khó đem project lên mới sửa lỗi được. Đưa code như thế thì khác gì mò kim đáy biển.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    04 2007
    Bài viết
    12

    Theo mình nghĩ thì lỗi là ở câu lệnh:
    [CODE]str = p_formB->GetDlgItemTextW(IDC_EDIT1, str);[CODE]
    Câu lệnh này mới nhìn thì không có lỗi, và biên dịch cũng vậy. Tuy nhiên nếu nghĩ sâu hơn, bạn sẽ thấy là sau lệnh DoModal và đóng form B cửa sổ hộp thoại đã bị destroy=> thì tất cả các dữ liệu và các control gắn trên nó cũng bị free => editbox IDC_EDIT1 đã bị destroy => không thể lấy được text trước đó.
    Điểm quan trọng ở đây là cần phân biệt: đối tượng bao cửa sổ và cửa sổ:
    + Đối tượng cửa sổ p_formB vẫn còn tồn tại cho đến khi bạn dùng toán tử delete để free nó.
    + Cửa sổ: cái mà bạn nhìn thấy khi gọi hàm DoModal của đối tượng bao cửa sổ. Cửa sổ này sẽ bị destroy khi thoát khỏi DoModal.
    Theo như trên bạn sẽ thấy: để lấy được text của editor trên formB sau khi đóng thì không thể thông qua control của cửa sổ được (vì đã bị free cùng với cửa sổ) mà phải thông qua biến gắn với đối tượng bao cửa sổ.
    Sau đây là cách thực hiện đơn giản nhất:
    1. Khai báo 1 biến kiểu CString trong lớp CFormB.
    2. Viết lại hàm OnOK trong lớp CFormB
    Trong file FormB.h
    Code:
     //add prototype
    public:
    CString m_strText;
    protected:
    virtual void OnOK();
    Trong FormB.cpp
    Code:
    void CFormB::OnOK()
    {
    m_strText = p_formB->GetDlgItemTextW(IDC_EDIT1, m_strText );
    CDialog::OnOK();
    }
    Trong lớp CFormA
    Code:
    void CFormA::OnBnClickedOk()
    {
    // TODO: Add your control notification handler code here
    
    CFormB *p_formB = new CFormB();
    if(p_formB->DoModal() == IDOK)
    {
    CString str;
    str = p_formB->m_strText;
    this->SetDlgItemTextW(IDD_EDIT1,str);//IDC_EDIT1 là EditBox của form A
    MessageBox(_T("OKey"));
    return;
    }
    }
    Trong cách này mình sử dụng 1 biến public m_strText để làm trung gian. Bạn có thể cho nó private và viết 1 hàm public GetTextXX() trong lớp CFormB để lấy lại m_strText.
    Ngoài ra bạn có thể tìm hiểu thêm về cơ chế DDX/DDV trong CDialog.

  4. #4
    Ngày gia nhập
    02 2008
    Bài viết
    3

    Trích dẫn Nguyên bản được gửi bởi tienthanh_tn Xem bài viết
    Theo mình nghĩ thì lỗi là ở câu lệnh:
    [CODE]str = p_formB->GetDlgItemTextW(IDC_EDIT1, str);[CODE]
    Câu lệnh này mới nhìn thì không có lỗi, và biên dịch cũng vậy. Tuy nhiên nếu nghĩ sâu hơn, bạn sẽ thấy là sau lệnh DoModal và đóng form B cửa sổ hộp thoại đã bị destroy=> thì tất cả các dữ liệu và các control gắn trên nó cũng bị free => editbox IDC_EDIT1 đã bị destroy => không thể lấy được text trước đó.
    Điểm quan trọng ở đây là cần phân biệt: đối tượng bao cửa sổ và cửa sổ:
    + Đối tượng cửa sổ p_formB vẫn còn tồn tại cho đến khi bạn dùng toán tử delete để free nó.
    + Cửa sổ: cái mà bạn nhìn thấy khi gọi hàm DoModal của đối tượng bao cửa sổ. Cửa sổ này sẽ bị destroy khi thoát khỏi DoModal.
    Theo như trên bạn sẽ thấy: để lấy được text của editor trên formB sau khi đóng thì không thể thông qua control của cửa sổ được (vì đã bị free cùng với cửa sổ) mà phải thông qua biến gắn với đối tượng bao cửa sổ.
    Sau đây là cách thực hiện đơn giản nhất:
    1. Khai báo 1 biến kiểu CString trong lớp CFormB.
    2. Viết lại hàm OnOK trong lớp CFormB
    Trong file FormB.h
    Code:
     //add prototype
    public:
    CString m_strText;
    protected:
    virtual void OnOK();
    Trong FormB.cpp
    Code:
    void CFormB::OnOK()
    {
    m_strText = p_formB->GetDlgItemTextW(IDC_EDIT1, m_strText );
    CDialog::OnOK();
    }
    Trong lớp CFormA
    Code:
    void CFormA::OnBnClickedOk()
    {
    // TODO: Add your control notification handler code here
    
    CFormB *p_formB = new CFormB();
    if(p_formB->DoModal() == IDOK)
    {
    CString str;
    str = p_formB->m_strText;
    this->SetDlgItemTextW(IDD_EDIT1,str);//IDC_EDIT1 là EditBox của form A
    MessageBox(_T("OKey"));
    return;
    }
    }
    Trong cách này mình sử dụng 1 biến public m_strText để làm trung gian. Bạn có thể cho nó private và viết 1 hàm public GetTextXX() trong lớp CFormB để lấy lại m_strText.
    Ngoài ra bạn có thể tìm hiểu thêm về cơ chế DDX/DDV trong CDialog.
    Cảm ơn, đúng là thứ mình cần

Các đề tài tương tự

  1. Truyền tham số cho form làm mất button trên form con?
    Gửi bởi chicpoiga trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 4
    Bài viết cuối: 12-11-2013, 10:12 PM
  2. Lấy ID của dòng trên GridView form 1 truyền sang form 2
    Gửi bởi ndangkhoa89 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 08-06-2012, 08:44 PM
  3. Cách truyền giá trị vào combobox ở form này khi form kia đã đc nhập vào bằng textbox
    Gửi bởi chickcoder trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 13-04-2012, 08:54 PM
  4. Dùng button ở form cha để gọi form em và truyền dữ liệu từ form anh qua form em
    Gửi bởi chitviv trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 5
    Bài viết cuối: 24-10-2011, 10:32 PM
  5. Không truyền dữ liệu giữa 2 form được khi gọi form login trước form main
    Gửi bởi kienchochethahaha trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 01-06-2011, 08:26 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn