读书人

判读窗体指针有关问题

发布时间: 2012-12-15 15:16:03 作者: rapoo

判读窗体指针问题
本人菜鸟,遇到一个奇怪的问题。简单的工程,共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,楼上的回答不满足要求

看了又看,表示不知道你的要求是什么?想要什么样的效果?
[解决办法]
创建一个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);
[解决办法]


引用:
//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;

读书人网 >.NET

热点推荐