判读窗体指针问题
本人菜鸟,遇到一个奇怪的问题。简单的工程,共2个窗体,主窗体form1,子窗体form2,form2无事件.程序启动时仅创建form1。form1代码如下:
//****************************************************************
//动态创建窗体并融入pagecontrol中
//****************************************************************
procedure TForm1.Open_Tab_Form(ClassType:TComponentClass;OpenFrom:TForm;sender:Tobject);
var
Thetabsheet:ttabsheet;
ThePanel:Tpanel;
begin
//动态创建tabsheet和panel
TheTabSheet := TTabSheet.Create(Self);
TheTabSheet.PageControl := PageControl1;
ThePanel:=Tpanel.Create(self);
ThePanel.Parent:= TheTabSheet;
ThePanel.Align:=alClient;
//载入一个窗体到TAbsheet
application.CreateForm(ClassType,OpenFrom);
OpenFrom.Dock(ThePanel,BoundsRect);
OpenFrom.show;
TheTabSheet.Caption:=Tbutton(sender).Caption;
TheTabSheet.Show;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if not Assigned(Application.FindComponent('form2')) then
Open_Tab_Form(TForm2,Form2,sender);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
form2:=Tform2.Create(self);
end;
运行后,当先点击button2时,只能创建一个tabsheet,不管后来怎么点button2或者button3都只有一个。
若先点击button3,再多次点击button2,可以创建多个tabsheet。
请好心人帮忙!
[解决办法]
procedure TForm1.Button2Click(Sender: TObject);
begin
//if not Assigned(Application.FindComponent('form2')) then去掉这句
Open_Tab_Form(TForm2,Form2,sender);
end;
[解决办法]
我仅想创建一个tabsheet,楼上的回答不满足要求
[解决办法]
看了又看,表示不知道你的要求是什么?想要什么样的效果?
[解决办法]
创建一个tabsheet已经实现。但是我点了button3后,为何button2的功能失效?奇怪
[解决办法]
button2的点击是判断是否有form2,如果有就不创建。这个实现了。
button3是创建form2,按理说再点button2时不应该再创建form2了,为何反倒可以创建多个form2呢?
[解决办法]
就可以了:
procedure TForm1.Button2Click(Sender: TObject);
begin
if not Assigned(form2) then
Open_Tab_Form(TForm2,Form2,sender);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
form2:=Tform2.Create(self);
end;
[解决办法]
Button3Click如果也想控制,也可以加上句:
if not Assigned(form2) then
form2:=Tform2.Create(self);
[解决办法]
楼上的,你改成not Assigned(form2)的判断语句,反倒不能控制产生一个tabsheet了。这个我试过,你提到这样改,正好带出来另一个问题
[解决办法]
button3是我做测试用的,不代表什么功能。为何产生奇怪的效果呢?
[解决办法]
加上not Assigned(form2)的判断是判断Form2是否已经创建了,在没创建Form2时,如果你点了Button3,那Button2就不会再创建;在没创建Form2时,如果你点了Button2,则Button3点击就不再创建。
[解决办法]
先撇开button3的问题,假设没有button3,点button2,按你的写法无法控制只产生一个tabsheet。你可以测试下,你的方法不对,我试过。
------解决方案--------------------
Sorry,我测试了,你的方法可以:
if not Assigned(Application.FindComponent('form2')) then
Open_Tab_Form(TForm2, Form2, Sender);
你project文件中Form2有没有创建?
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
//Application.CreateForm(TForm2, Form2);
Application.Run;
end.
[解决办法]
//Application.CreateForm(TForm2, Form2);
[解决办法]
在工程文件里加入以上语句,点击button2 不会产生tabsheet。我希望能产生一个tabsheet
[解决办法]
哥,全部代码如下:
工程文件:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
//Application.CreateForm(TForm2, Form2);
Application.Run;
end.
单元文件:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls;
type
TForm1 = class(TForm)
PageControl1: TPageControl;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
procedure Open_Tab_Form(ClassType:TComponentClass;OpenFrom:TForm;sender:Tobject);
var
Thetabsheet:ttabsheet;
ThePanel:TPanel;
begin
TheTabSheet := TTabSheet.Create(Self);
TheTabSheet.PageControl := PageControl1;
ThePanel:=Tpanel.Create(self);
ThePanel.Parent:= TheTabSheet;
ThePanel.Align:=alClient;
application.CreateForm(ClassType,OpenFrom);
OpenFrom.Dock(ThePanel,BoundsRect);
OpenFrom.show;
TheTabSheet.Caption:=Tbutton(sender).Caption;
TheTabSheet.Show;
end;
begin
//if not Assigned(Form2) then
if not Assigned(Application.FindComponent('form2')) then
Open_Tab_Form(TForm2, Form2, Sender);
end;
end.
[解决办法]
楼上,one tabsheet我已实现了。我有两个疑问:
1.form2已经创建了,可if not Assigned(Form2) 判断却显示没有创建,为何?
2.button3的测试中,为何先点击button3创建form2后,button2创建一个tabsheet的功能却失效了,可以创建很多个?
功能虽然可以实现,但是在测试中发现的以上两个问题我不明白,我主要想搞懂这个。
[解决办法]
var OpenFrom: TForm2;
[解决办法]
procedure TForm1.Button7Click(Sender: TObject);
procedure Open_Tab_Form(ClassType:TComponentClass;var OpenFrom: TForm2;sender:Tobject);
var
Thetabsheet:ttabsheet;
ThePanel:Tpanel;
begin
TheTabSheet := TTabSheet.Create(Self);
TheTabSheet.PageControl := PageControl1;
ThePanel:=Tpanel.Create(self);
ThePanel.Parent:= TheTabSheet;
ThePanel.Align:=alClient;
application.CreateForm(ClassType,OpenFrom);
OpenFrom.Dock(ThePanel,BoundsRect);
OpenFrom.show;
TheTabSheet.Caption:=Tbutton(sender).Caption;
TheTabSheet.Show;
Memo1.Lines.Add('2 : ' + IntToHex(Integer(OpenFrom), 8));
end;
begin
Memo1.Lines.Add('1 : ' + IntToHex(Integer(Form2), 8));
//if not Assigned(Form2) then
if not Assigned(Application.FindComponent('form2')) then
Open_Tab_Form(TForm2, Form2, Sender);
Memo1.Lines.Add('3 : ' + IntToHex(Integer(Form2), 8));
end;