在Delphi中有多种forms

在我的Delphi项目中,我想要一个“设置”button,当点击时,打开第二个窗体(我认为这是正确的术语,我基本上想要打开一个新窗口)进行设置。

当用户完成更改这个新窗体上的设置时,我希望窗体closuresbutton单击。

用户input的设置还需要可以访问第一个“主”forms。

所以,例如,如果我的程序由一个主表单组成,那么计算的'A'+'B'(A和B是整数variables),设置表单允许用户设置A和B的值,做这个?

如果你了解Delphi的对象模型,这并不难。 一个表单是一个从TObject下来的对象,由一个DFM文件作为后台,使布局更容易。 其上的控件是其他对象,默认情况下它们可以被其他单位的其他对象公开显示,就像其他单位一样。 有两种方法可以做到这一点。

简单的方法是在完成第一个表单之后,让其他表单的代码直接从控件读取值。 只需使用像MyString := Form2.EditBox.Text;东西MyString := Form2.EditBox.Text; 。 这不是特别好的风格,但它的作品。

正确的做法是将表单上的公共属性放在表单上,​​它将检索控件的值,或者将函数读入并返回某种包含所有设置的对象或记录。 这需要更多的工作,但是如果你修改了一些东西,那么结果就是代码更简洁,不太可能导致麻烦。

编辑:在回应评论中的问题:

为了让一个表单显示并隐藏另一个表单,你可以调用Show和Hide。 或者,如果您希望它显示在模式对话框中,只要您创建一个设置ModalResult的按钮,就可以调用ShowModal方法,该方法负责为您隐藏。 (有关这些方法如何工作的详细信息,请参阅帮助文件。)

当然,表格必须先创建。 要么它可以由DPR autocreated,这是简单的程序,但不是很好,一旦你在你的应用程序中获取大量的表单,或者你可以在代码中创建它。 亨克有一个如何做到这一点的例子,但我不会推荐使用with关键字。 如果您自己创建了表单,请务必在之后解除。

我通常设计的设置窗体,并添加一个类的函数执行到它,改变一个记录包含这样的设置的字段:

 Tf_MySettings = class(TForm) // ... private procedure SetData(const _Settings: TSettingsRec); procedure GetData(out _Settings: TSettingsRec); public class function Execute(_Owner: TComponent; var _Settings: TSettingsRec): boolean; end; implementation function Tf_MySettings.Execute(_Owner: TComponent; var _Settings: TSettingsRec): boolean; var frm: Tf_MySettings; begin frm := Tf_MySettings.Create(_Owner); try frm.SetData(_Settings); // for this to work, the OK button must have ModalResult=mrOK Result := frm.ShowModal = mrOK; if Result then frm.GetData(_Settings); finally frm.Free; end; end; procedure Tf_MySettings.SetData(const _Settings: TMySettingsRec); begin ed_Name.Text := _Settings.Name; // ... end; procedure Tf_MySettings.GetData(out _Settings: TMySettingsRec); begin _Settings.Name := ed_Name.Text; // ... end; 

你这样称呼它:

 if Tf_MySettings.Execute(self, _Settings) then begin // settings have been changed end; 

我将在form1中创建一个设置对象,并将其发送到2:

 TSettings = class private FPropA: integer; FPropB: string; published property PropA: integer read FPropA write FPropA: property PropB: string read FPropB write FPropB: end; ... form2.EditSettings(ASettings);