一个奇怪的问题,很简单,但我不知道问题出在哪儿? ( 积分: 50 )

  • 主题发起人 主题发起人 风云再起
  • 开始时间 开始时间

风云再起

Unregistered / Unconfirmed
GUEST, unregistred user!
我有两个空白窗体,我在一个窗体的按钮事件上写下了如此代码,就是希望能够自动创建窗体,但每次运行,显示的信息都是'我得名字是button1'
我想知道为什么.
procedure TForm1.Button1Click(Sender: TObject);
var
Form2: TForm2;
begin
if Assigned(Form2) then
begin
ShowMessage('我已经存在了,我的名字是: '+Form2.Name);
Form2.Show;
end else begin
ShowMessage('我要创建了');
Form2:=TForm2.Create(Application);
Form2.Show;
end;
end;
 
我有两个空白窗体,我在一个窗体的按钮事件上写下了如此代码,就是希望能够自动创建窗体,但每次运行,显示的信息都是'我得名字是button1'
我想知道为什么.
procedure TForm1.Button1Click(Sender: TObject);
var
Form2: TForm2;
begin
if Assigned(Form2) then
begin
ShowMessage('我已经存在了,我的名字是: '+Form2.Name);
Form2.Show;
end else begin
ShowMessage('我要创建了');
Form2:=TForm2.Create(Application);
Form2.Show;
end;
end;
 
progect->options-> 将form2从auto create移至available form
 
Form2在Close的时候有没有Free?
在form2的OnClose里面写上
Action := caFree;
Form2 := nil;
但是显示‘我得名字是button1’就比较奇怪了。按道理Form2.Name不可能是button1啊。自己检查一下吧。
 
第一、按hedadt所说的做,不要让Form2在启动时就创建
第二、把Button1Click中Form2的变量定义取消,因为这里定义的局部变量Form2与全局变量产生了冲突

procedure TForm1.Button1Click(Sender: TObject);
begin
if Assigned(Form2) then
begin
ShowMessage('我已经存在了,我的名字是: '+Form2.Name);
Form2.Show;
end else begin
ShowMessage('我要创建了');
Form2:=TForm2.Create(Application);
Form2.Show;
end;
end;
 
第二个窗体我已经让它被动创建,不自动创建,它的全局变量我也注释掉了
还有Form2 := nil;怎么能行了,都没有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.Run;
end.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
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);
var
Form2: TForm2;
begin
if Assigned(Form2) then
begin
ShowMessage('ÎÒÒѾ­´æÔÚÁË,ÎÒµÄÃû×ÖÊÇ: '+Form2.Name);
Form2.Show;
end else begin
ShowMessage('ÎÒÒª´´½¨ÁË');
Form2:=TForm2.Create(Application);
Form2.Show;
end;
end;

end.


unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm2 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;



implementation

{$R *.dfm}

end.
错误信息:[Warning] Unit1.pas(30): Variable 'Form2' might not have been initialized
 
我把你的代码运行了一下,可是没有出现你说的那种错误,只是程序一开始启动就会执行
ShowMessage('ÎÒÒѾ­´æÔÚÁË,ÎÒµÄÃû×ÖÊÇ: '+Form2.Name);
Form2.Show;
这部分代码,ELSE部分的永远也执行不到
 
错误在这里:
if Assigned(Form2) then
你定义了变量Form2以后,就会自动为变量分配内存。
而Assigned是判断指针是不是nil,这时候Form2变量不是nil。
可以改成if IsValidSid(Form2) then
 
var
Form2: TForm2;
begin
不用重新定义form2:tform2 试试看。
只要uses 了form2的 unit
不用声明直接form2:=tfrom2.create(self)
 
你没有必要去var Form2: TForm2;你看我写的:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
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);
begin
if not Assigned(Form2) then
begin

application.CreateForm(Tform2,Form2);
showmessage('我要创建了'+form2.Name );
form2.Show;
end
else
begin
showmessage('我已经存在'+form2.Name );

end;
end;

end.
//
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm2 = class(TForm)
procedure FormClose(Sender: TObject
var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormClose(Sender: TObject
var Action: TCloseAction);
begin
Action := caFree;
Form2 := nil;

end;

end.
 
只要引用form2就可以了,同意taorui810的观点。
 
变量Form2 局部和全局冲突
删去你的部分代码,就行了

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
//begin
//var
//Form2: TForm2;
begin
if Assigned(Form2) then
begin
ShowMessage('我已经存在了,我的名字是: '+Form2.Name);
Form2.Show;
end
else
begin
ShowMessage('我要创建了');
Form2:=TForm2.Create(Application);
Form2.Show;
end;
end;

end.

运行结果是:我已经存在了,我的名字是: Form2
 
我自己找到主要原因了,之所以用不删除全局变量的那个方案可以,是应为,
全局变量编译器会自己初始化,而局部变量是不会初始化的.所以第一种方案
的变量用assigned(Form2)判断是可以的,但第二种方案Form2指针会指向任意
一个内存区域.所以代码改为如下即可

var
Form2: TForm2;

procedure TForm1.Button1Click(Sender: TObject);
begin
if Assigned(Form2) then
begin
ShowMessage('ÎÒ´æÔ&Uacute
My Name is:'+Form2.Name);
Form2.Show;
end
else
begin
Form2:=TForm2.Create(Self);
ShowMessage('ÒÑ´´½¨ My Name is:'+Form2.Name);
Form2.Show;
end;
end;
 
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)
这句话屏蔽掉就行了。
或者 在菜单里project/options 的forms页中 把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)
这句话屏蔽掉就行了。
或者 在菜单里project/options 的forms页中 把Form2从左面移动到右面。
 
多人接受答案了。
 

Similar threads

后退
顶部