一个MDI的问题 (100分)

  • 主题发起人 FourLegFlyCat
  • 开始时间
F

FourLegFlyCat

Unregistered / Unconfirmed
GUEST, unregistred user!
在MDICHILD中定义全局变量Index
var
MDIChildForm: MDIChildForm;
Index: Integer;
implementation
{$R *.dfm}

为何在创建的多个实例中所有MDICHILDFORM共享 Index。 如第一个CHILD设置Index := 1
则在第二个CHILD中Index也是1。同理若干个CHILD只要其中一个改变INDEX则其余都改变
盼高手解答。
 
更有趣的是当我所有CHILD 都 ACTION := CAFREE 后 如果我再CREATE一个新CHILD,
它仍然还保存原来的INDEX值。

还有不用MDI 在SDI 状态下创建一个窗口的多个实例也回出现相似的问题。
哪位老大教我搞定它啊。
 
这种问题也要问吗?
Index是全局变量呀,全局变量的含义就在于全局二字,想想也该知道

改成
var
MDIChildForm: MDIChildFormForm;
implementation
{$R *.dfm}
var
Index: Integer;

再试试你就知道了


 
another_benlei: 你的方案不可以,我刚试过,结果如故。
 
可以呀!
你看看:
program Project2;

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);
begin
Form2 := TForm2.Create(Application);
end;

end.
---------------------------

unit Unit2;

interface

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

type
TForm2 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

var
Index: Integer;

procedure TForm2.FormCreate(Sender: TObject);
begin
Index := 1;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
Index := StrToInt(Edit1.text);
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
Edit2.Text := IntToStr(Index);
end;

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

end.
-----------------------------------------------
 
不行,D5,D6下我都试过。你看一下CREATE两个FROM2时先ONCILCK其中一个BUTTON1,
再ONCLICK另一个窗体的BUTTON2看看会有什么结果。
在我这如先在第一个窗口中设置 INDEX := StrToInt(Edit1.Text)
在第二个窗口中的INDEX如不设置的话值为第一个窗口中设置的值。
 
的确如此!
不明白到底什么原因?
能不能这样解决问题

public
{ Public declarations }
Index: Integer;
end;
 
哦,我知道原因了
ChildForm的实例不要申明成全局变量,在需要的地方申请为局部变量就可以搞定了
 
放在PUBLIC下可以搞定。但是CHILD的实例为局部变量仍然还是那种情况。估计是在运行时只是
把CHILD作为一个单独的CLASS来处理,而定义在CLASS外的变量却是共享。
看来MDI真的有太大的毛病。
 
不要胡说八道,那根本就不是BUG,全局变量就是全局变量,
你放到implementation上下都是一样的,你想要它只在本
实例里引用就要放到类声明里!
 
看来MDI真的有太大的毛病。
呵呵,此言差异阿!你声明成全局变量肯定就是这种现象了!每个子窗体共享
该变量,正是全局变量的真正的含义阿!你怎么能说全局变量这种用法是错误的呢??
 
顶部