delphi表单创建

时间:2011-12-29 09:32:28

标签: delphi

我在delphi 7中创建了一个应用程序。我的Main表单调用了子表单的执行过程。执行过程创建子窗体的对象并向用户显示子窗体。我已从自动创建中删除了子表单。现在我在子窗体上添加了一个编辑框,并尝试在执行过程中创建的子窗体后设置文本。但在这种情况下,我得到访问冲突错误。如果我使用subform.editbox来设置文本,那么它不会给出任何错误。在不自动创建表单时,是否总是使用具有表单参考的组件?感谢帮助。

function TSubForm.execute(temp:String);
begin
  frmSubForm:= TSubForm.create(self);
  edit1.text:= temp;
  frmSubForm.ShowModal;
end;

5 个答案:

答案 0 :(得分:3)

表单与其他对象没有太大区别。您需要创建它(使用Application.CreateForm(..)或使用Form2 := TForm2.Create(..)手动创建)。除非它被创建,否则你将获得一个AccessViolation,因为Form2 = nil。

修改

一个。您没有指定声明frmSubForm的位置和方式。它是否意味着是TSubForm形式的单独实例?

B中。看起来您从尚未创建的表单中运行function TSubForm.execute(temp:String);。也许这应该是一个阶级函数。

℃。您有效地访问了{1}}您问题中的“{1}}

答案 1 :(得分:2)

你在做什么是危险的。方法可以隐式访问对象的所有字段,即使它尚未创建。尝试将其改为类方法:

class function TSubForm.execute(temp:String);
begin
  frmSubForm:= TSubForm.create(self);
  edit1.text:= temp;
  frmSubForm.ShowModal;
end;

(也在课堂宣言中改编) 在更改之后,编译器将不再允许您访问edit1,因为它不是类的变量,而是该类的实例。所以正确的代码是:

class function TSubForm.execute(temp:String);
begin
  frmSubForm:= TSubForm.create(self);
  frmSubForm.edit1.text:= temp;
  frmSubForm.ShowModal;
end;

但要注意:您的frmSubForm变量未在方法内声明,因此它可能是全局的。你在哪里免费提供表格?这会更清洁:

class function TSubForm.execute(temp:String);
begin
  frm:= TSubForm.create(self);
  try
    frm.edit1.text:= temp;
    frm.ShowModal;
  finally
    frm.Free;
  end;
end;

(顺便说一下:你的函数没有返回类型。)

答案 2 :(得分:1)

以下是使用非自动处理表单(TForm2)的典型代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  Form: TForm2;

begin
  Form:= TForm2.Create(Application);
  try
    Form.Edit1.Text:= 'Hello';
    Form.ShowModal;
  finally
    Form.Free;
  end;
end;

如果要将Form2显示为非模态(Show而不是ShowModal),则应将其关闭操作设置为caFree处理程序中的OnClose

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action:= caFree;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Form: TForm2;

begin
  Form:= TForm2.Create(Application);
  Form.Edit1.Text:= 'Hello';
  Form.Show;
end;

答案 3 :(得分:1)

您应该像这样访问文本框文本:

function TSubForm.execute(temp:String);
begin
  frmSubForm:= TSubForm.create(self);
  frmSubForm.edit1.text:= temp;
  frmSubForm.ShowModal;
end;

此外,在完成子窗体后,请在子窗体上调用Free。

答案 4 :(得分:1)

我不认为我会这样做,但这有效:

unit UfrmSubForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TfrmSubForm = class(TForm)
    edit1: TEdit;
  private
    procedure Set_EditText(const Value: String);
    { Private declarations }
  public
    { Public declarations }
    class function Execute(Temp: String): TModalResult;
    property EditText: String write Set_EditText;
  end;


function SubFormExecute(Temp: String): TModalResult;

implementation

{$R *.dfm}

{ TfrmSubForm }

class function TfrmSubForm.Execute(Temp: String): TModalResult;
var
  frmSubForm: TfrmSubForm;
begin
  frmSubForm := TfrmSubForm.Create(Application);
  try
   frmSubForm.EditText := Temp;
   Result := frmSubForm.ShowModal;
  finally
   frmSubForm.Free;
  end;
end;

procedure TfrmSubForm.Set_EditText(const Value: String);
begin
  edit1.Text := Value;
end;

end.

然后从第一个表单中使用它:

procedure TForm1.btnExecuteClick(Sender: TObject);
begin
  TfrmSubForm.Execute('Some Text');
end;

返回ShowModal的状态不会受到伤害,您永远不知道何时需要它。

您可能不应直接访问其他对象(表单或其他)子属性;如果TEdit将来成为TLabel,你只需要改变frmSubForm一次,而不是访问frmSubForm.Edit.Text的地方。

使用父对象的属性。