我在delphi 7中创建了一个应用程序。我的Main表单调用了子表单的执行过程。执行过程创建子窗体的对象并向用户显示子窗体。我已从自动创建中删除了子表单。现在我在子窗体上添加了一个编辑框,并尝试在执行过程中创建的子窗体后设置文本。但在这种情况下,我得到访问冲突错误。如果我使用subform.editbox来设置文本,那么它不会给出任何错误。在不自动创建表单时,是否总是使用具有表单参考的组件?感谢帮助。
function TSubForm.execute(temp:String);
begin
frmSubForm:= TSubForm.create(self);
edit1.text:= temp;
frmSubForm.ShowModal;
end;
答案 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的地方。
使用父对象的属性。