窗体间传递参数
我的问题是这样的:有三个窗体 frmA,frmB,frmC
在frmA中这样调用frmB:
procedure .....
with TfrmB.Create(Self,optAdd,-1) do
try
ShowModal;
DM.qryAppTest.Close;
DM.qryAppTest.Open;
finally
Free;
end;
end;
frmB中的关键相应代码:
constructor Create(AOwner: TComponent;AOperateType: TOperateType;ATestID: Integer); reintroduce;{这是定义}
{构建函数}
constructor TfrmB.Create(AOwner: TComponent;AOperateType: TOperateType;ATestID: Integer);
begin
inherited Create(AOwner);
FOperateType:=AOperateType;
FTestID:=ATestID;
ClearData;
if FOperateType=optEdit then
LoadData;
end;
然后在frmB中又调用到frmC
procedure TfrmB.btnRyxmClick(Sender: TObject);
begin
with TfrmC.Create(Self,1) do
try
ShowModal;
finally
Free;
end;
end;
frmC中的代码如下:
constructor Create(AOwner: TComponent;AFlag: Integer); reintroduce;{定义}
constructor TfrmC.Create(AOwner: TComponent;AFlag: Integer);
begin
inherited Create(AOwner);
FFlag:=AFlag;
end;
后面我想把frmC中的一些数据赋值给frmB中的变量,可是一直报错:
赋值代码:
frmB.FManID:=1;
frmB.FYpxmID:=2;
错误提示:project a.exe raised exception class EAccessViolation with message'Access
violation at address 00558EC1 in module 'a.exe'.Write of address 00000358'.
Process stopped.Use Step or Run to continue.
不知道如何解决,请大家指教呀!
[解决办法]
呵呵
以前也遇到过此麻烦。解决了。
每个frm都有一个系统生成的实例。
你的frma是系统生成的。你的frmb 和 frmc 也是系统生成的。既然系统已经生成他们了,所以编译的时候可以通过,但是他们没有初始化!
关键就是这句坏了事:
with TfrmB.Create(Self,optAdd,-1) do
改成
with frmb=TfrmB.Create(Self,optAdd,-1) do
再到系统配置里把frmb,frmc的自动生成属性消掉。
可能也要注掉这句:constructor Create(AOwner: TComponent;AOperateType: TOperateType;ATestID: Integer); reintroduce;{这是定义}
手边没有delphi,
未验证。
[解决办法]
把frmB中的变量地址作为参数传递给frmC的实例,这样就可以在frmC的实例中改变这里变量值了。
例如:
TfrmB = class(TForm)
private
FManID : Integer;
FYpxmID: Integer;
end;
TfrmC = class(TForm)
private
FManID : PInteger;
FYpxmID: PInteger;
constructor Create(AOwner: TComponent; AFlag: Integer; AManID: PInteger); reintroduce;
end;
constructor TfrmC.Create(AOwner: TComponent; AFlag: Integer; AManID, AYpxmID: PInteger); reintroduce;
begin
FManID := AManID;
FYpxmID:= AYpxmID;
end;
procedure TfrmC.XXX();
begin
FManID^ := 1;
FYpxmID^ := 2;
end;
procedure TfrmB.btnRyxmClick(Sender: TObject);
begin
with TfrmC.Create(Self,1, @FManID, @FYpxmID) do
try
ShowModal;
finally
Free;
end;
end;
[解决办法]
一个指针就可以了:
TfrmC......
private
PSendForm:Pointer;
constructor Create(AOwner: TComponent; ASendForm:Pointer); reintroduce;
......
constructor TfrmC.Create(AOwner: TComponent; ASendForm:Pointer); reintroduce;
begin
PSendForm:=ASendForm;
end;
procedure Tfrmc.btnRyxmClick(Sender: TObject);
begin
TfrmB(PSendForm).Show;
TfrmB(PSendForm).Edit1.Text:='He';
TfrmB(PSendForm).FypxmId:=98;
......
end;
procedure TfrmB.btnRyxmClick(Sender: TObject);
begin
with TfrmC.Create(Self,@frmB) do
try
ShowModal;
finally
Free;
end;
end;
[解决办法]
既然formC以模式窗口打开,你就可以在formC里定义几个public属性,在窗口关闭的时候进行赋值fromC:private FID:string;public property ID:string read FID write FID;fromB:procedure TfrmB.btnRyxmClick(Sender: TObject);begin with TfrmC.Create(Self,1) do try ShowModal; showmessage( ID ); finally Free; end;end;