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

判读窗体指针有关问题

2012-12-15 
判读窗体指针问题本人菜鸟,遇到一个奇怪的问题。简单的工程,共2个窗体,主窗体form1,子窗体form2,form2无事

判读窗体指针问题
本人菜鸟,遇到一个奇怪的问题。简单的工程,共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;

热点排行