在DELPHI中窗体之间 如何传递数据?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在DELPHI中窗体之间 如何传递数据?相关的知识,希望对你有一定的参考价值。
在delphi中窗体以Unit为单位,你可以将变量置于Interface即应用程序级变量,也可以作为窗体类public数据成员出现,这样在创建了这个窗体类的实例后就可以在另一个窗体类实例中访问这个变量。看了你的部分程序后,原来问题不是出在变量的窗体间传递上,而是你在进行delphi中窗体动态创建和释放中出现了问题。在Tfrm_Tyxg的label5click过程中动态创建了Tfrm_chaxun的实例,但在Tfrm_chaxun的查找按钮事件中又创建了一次Tfrm_Tyxg的实例,而在此之前,Tfrm_Tyxg的实例已存在,所以你要释放两次。据我所知,要完全释放一个窗体实例,需用FreeAndNil(窗体实例名)函数,一般在窗体的onclose事件中使用,单单用close是无法释放窗体实例指针的,再次create时会发生内存错误。 参考技术A 我作了一个统一修改和查询的窗体,统一修改中有一个LISTCHECKBOX控件,显示要修改的职工,我在这个窗体中调用查询的窗体,在查询窗体中进行相应的查询,查询完之后我希望查询的结果能够在统一修改的窗体LISTCHECKBOX控件中显示出查询的结果:这样窗体之间该如何传递?我首先在统一修改的窗体中写了这样的程序: public procedure setparams(sql:string); end;var Frm_Tyxg: TFrm_Tyxg; v_sql:string;implementationuses u_chaxun;$R *.dfmprocedure TFrm_Tyxg.setparams(sql:string);begin v_sql:=sql;end;procedure TFrm_Tyxg.Label5Click(Sender: TObject);begin with tFrm_chaxun.create(self) do begin show; end;end;然后在查询的窗体的查找按钮中写了这样的程序:with tfrm_tyxg.Create(self) do begin setparams(sql_str); show; end; close;这样确实可以得到查询的语句v_sql,但是我在统一修改的窗体的关闭按钮中:close;则要关闭两次,如果我要写上form1.close 就会出错怎么会事? 参考技术B hoho,好好考虑一下。 参考技术C 关闭时还是出现那样的问题在 CDialog 类型的子窗体之间传递数据
【中文标题】在 CDialog 类型的子窗体之间传递数据【英文标题】:Passing data between subforms of type CDialog 【发布时间】:2010-10-25 15:20:27 【问题描述】:我有一个 MS Visual C++ 2005 项目,我试图在其中创建一个主对话框,其中包含一个专门用于显示可选子窗体对话框的部分。每个子表单的大小相同,但布局不同。使用组合框控件执行选择。我搜索了实现此功能的最佳方式,发现有人在 1999 年开发了这个类,用于处理主对话框中的子对话框:
http://www.codeproject.com/KB/dialog/childdlg.aspx
附加修改:
http://www.codeproject.com/KB/dialog/childdlg.aspx?msg=1287#xx1287xx
代码在选择和显示各种子表单方面效果很好,但我似乎无法将数据从一个子表单传递到另一个子表单。具体来说,每个子表单都由几个编辑控件组成。我希望用户能够在 Subform #1 上的编辑控件中输入一个值,并在 Subform #2 上的编辑控件或静态文本控件中回显该值。
我尝试通过使用子窗体对话框类(名为 CSubFormType 和 CDialog 的子类)的成员函数来实现这一点,该函数将在取消对数据输入编辑控件(即 Box1a)的焦点时执行。
void CSubFormType::OnEnKillfocusBox1a()
p2WndControl = (CWnd*)(GetDlgItem(IDC_Box1a)); //Get pointer to the control dialog box for data entry
//Inserted here some specific code used to place data entered into IDC_Box1a into extern wchar_t outstr[32]
SetDlgItemText (IDC_Box1b, outstr); //Echo data entered in IDC_Box1a to IDC_Box1b on same Subform #1
SetDlgItemText (IDC_Box2, outstr);//Echo data entered in IDC_Box1a to IDC_Box2 on different subform, Subform #2
用于直接调用 OnEnKillfocusBox1a 的 CSubFormType 的消息映射是:
ON_EN_KILLFOCUS(IDC_Box1a, &CSubFormType:: OnEnKillfocusBox1a)
或间接通过:
ON_BN_CLICKED(IDOK, &CSubFormType::OnBnClickedOk) // CSubFormType::OnBnClickedOk 然后调用 OnEnKillfocusBox1a
我遇到的问题是:
1) ON_BN_CLICKED(IDOK, &CSubFormType::OnBnClickedOk) 在将数据输入 Box1a 后按 Enter 键时不会被调用。而是调用主对话框的 OnBnClickedOk 成员函数。
2) 当 CSubFormType::OnEnKillfocusBox1a 确实被执行时(通过鼠标单击其他地方),它能够将 Box1a 中输入的值回显到同一子表单 #1 上的 Box1b,但不会将值回显到子表单 #2 上的 Box2。
任何关于我需要做些什么来解决这些问题或实现相同通用功能的更好方法的任何指导都将不胜感激。
正在使用的主对话框的组合框选择成员函数:
void CMain::OnCbnSelchange() 整数选择;
selection = ((CComboBox*)GetDlgItem(IDC_Select))->GetCurSel();
switch(selection)
case 0: // Select Subform 1
//Do nothing
break;
case 1: // Select Subform 2
SetDlgItemText (IDC_Box2, outstr); //Set Box2 text on Subform #2
break;
m_SubForms.ShowSubForm(selection);
【问题讨论】:
【参考方案1】:当主组合框选择改变时同步所有表单。您尝试在文本框文本更改时立即执行此操作,但这不是必需的,因为只有一个表单可见。
【讨论】:
感谢您的评论。我将用于组合框选择的代码添加到原始帖子的末尾。是否需要做一些特别的事情来同步所有表单? 我不知道,这是你的要求。以上是关于在DELPHI中窗体之间 如何传递数据?的主要内容,如果未能解决你的问题,请参考以下文章