首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

窗体间传递参数解决方案

2012-02-21 
窗体间传递参数我的问题是这样的:有三个窗体 frmA,frmB,frmC在frmA中这样调用frmB:procedure .....with Tf

窗体间传递参数
我的问题是这样的:有三个窗体 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;
[解决办法]

Delphi(Pascal) code
既然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; 

热点排行