Delphi中窗体的调用问题。用Show不用showmodal。
在Form1里创建Form2窗体。在Form2里有一个按钮调用Form3的ShowForm3事件,创建并显示Form3,Form3的Parent为Form2;Form3用...
在Form1里创建Form2窗体。在Form2里有一个按钮调用Form3的ShowForm3事件,创建并显示Form3,Form3的Parent为Form2;Form3用一个变量FSerial控制Form3的Close;
问题:当只创建一个Form2,并创建Form3时,正常。当创建两个Form2,并分别创建Form3时,两个Form3中的变量FSerial为相互影响。后创建的Form3中的FSerial为影响之前创建的Form3的关闭。
主要代码:
Form1:
procedure TForm1.btn1Click(Sender: TObject);
var
sform: TForm2;
begin
sform := TForm2.Create(Self);
sform.Show;
end;
Form2:
procedure TForm2.btn1Click(Sender: TObject);
begin
Unit3.ShowForm3(Self);
end;
Form3:
type
TForm3 = class(TForm)
btn1: TButton;
edt1: TEdit;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
FSerial: Integer;
public
{ Public declarations }
end;
var Form3: TForm3;
procedure ShowForm3(ASelf: TForm);
implementation
{$R *.dfm}
procedure ShowForm3(ASelf: TForm);begin
with TForm3.Create(ASelf) do
begin
try
Parent := ASelf;
Top := 0;
Left := 0;
Show;
FSerial := 0;
repeat
Application.HandleMessage;
edt1.Text := IntToStr(FSerial);
until (FSerial = -1) or (FSerial = 1);
finally
Free;
end;
end;
end;
procedure TForm3.btn1Click(Sender: TObject);begin
FSerial := 1;
end; 展开
问题:当只创建一个Form2,并创建Form3时,正常。当创建两个Form2,并分别创建Form3时,两个Form3中的变量FSerial为相互影响。后创建的Form3中的FSerial为影响之前创建的Form3的关闭。
主要代码:
Form1:
procedure TForm1.btn1Click(Sender: TObject);
var
sform: TForm2;
begin
sform := TForm2.Create(Self);
sform.Show;
end;
Form2:
procedure TForm2.btn1Click(Sender: TObject);
begin
Unit3.ShowForm3(Self);
end;
Form3:
type
TForm3 = class(TForm)
btn1: TButton;
edt1: TEdit;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
FSerial: Integer;
public
{ Public declarations }
end;
var Form3: TForm3;
procedure ShowForm3(ASelf: TForm);
implementation
{$R *.dfm}
procedure ShowForm3(ASelf: TForm);begin
with TForm3.Create(ASelf) do
begin
try
Parent := ASelf;
Top := 0;
Left := 0;
Show;
FSerial := 0;
repeat
Application.HandleMessage;
edt1.Text := IntToStr(FSerial);
until (FSerial = -1) or (FSerial = 1);
finally
Free;
end;
end;
end;
procedure TForm3.btn1Click(Sender: TObject);begin
FSerial := 1;
end; 展开
2个回答
展开全部
后创建的Form3中的FSerial为影响之前创建的Form3的关闭。
这句话不正确。
因为每次创建的对象不同,FSerial属于不同的对象,所以相互之间不会影响。
至于你的问题,出在Repeat ... Until ... 循环上。
窗体多了,CPU对各个TForm3实例中的循环语句,在Application.HandleMessage没有响应,因此循环就检测不到FSerial的值了。
如果你为了释放窗体而设计此循环,可以用一个笨办法来处理:
procedure ShowForm3(ASelf: TForm);
begin
with TForm3.Create(ASelf) do
begin
Parent := ASelf;
Top := 0;
Left := 0;
Caption:=IntToStr(Handle)+' '+IntToStr(Integer(@FSerial)) +' '+IntToStr(Serial);
Show;
FSerial := 0;
end;
end;
在Form2中增加一个Timer,定时检测FSerian值,从而实现释放的目的:
procedure TForm2.ProcClose;
var
i:Integer;
begin
for i:=0 to ComponentCount-1 do
begin
if Components[i] is TForm3 then
begin
if (Components[i] as TForm3).Serial>0 then
begin
(Components[i] as TForm3).Close;
(Components[i] as TForm3).Free;
Break;///因为删除(释放)掉一个,所以,需要重新开始循环
end;
end;
end;
end;
procedure TForm2.Timer1Timer(Sender: TObject);
begin
ProcClose;
end;
这句话不正确。
因为每次创建的对象不同,FSerial属于不同的对象,所以相互之间不会影响。
至于你的问题,出在Repeat ... Until ... 循环上。
窗体多了,CPU对各个TForm3实例中的循环语句,在Application.HandleMessage没有响应,因此循环就检测不到FSerial的值了。
如果你为了释放窗体而设计此循环,可以用一个笨办法来处理:
procedure ShowForm3(ASelf: TForm);
begin
with TForm3.Create(ASelf) do
begin
Parent := ASelf;
Top := 0;
Left := 0;
Caption:=IntToStr(Handle)+' '+IntToStr(Integer(@FSerial)) +' '+IntToStr(Serial);
Show;
FSerial := 0;
end;
end;
在Form2中增加一个Timer,定时检测FSerian值,从而实现释放的目的:
procedure TForm2.ProcClose;
var
i:Integer;
begin
for i:=0 to ComponentCount-1 do
begin
if Components[i] is TForm3 then
begin
if (Components[i] as TForm3).Serial>0 then
begin
(Components[i] as TForm3).Close;
(Components[i] as TForm3).Free;
Break;///因为删除(释放)掉一个,所以,需要重新开始循环
end;
end;
end;
end;
procedure TForm2.Timer1Timer(Sender: TObject);
begin
ProcClose;
end;
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询