Delphi动态创建多个子窗体的问题!

zjzjzjzjzjzj 2008-05-31 11:35:07
在一个Form1窗体上放置了一个DBCtrlGrid和一个Button1,DBCtrlGrid用来显示数据表里所有的用户,选中某个用户,点Button1,便可创建一个相应的动态窗体,
但是当同时打开几个用户的对应窗体时,(比如依次动态创建了f1,f2,f3),只能对f3操作,就算对f1,f2操作(比如说,按f1窗体的“退出”按钮,就会把f3的窗体关掉,而且f3关掉后,f1,f2任何按钮都失效)

为什么,怎么解决啊,
第一次发贴,毕业设计着急,谢谢啦
...全文
939 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjzjzjzjzjzj 2008-06-07
  • 打赏
  • 举报
回复
我自己解决了,谢谢
zjzjzjzjzjzj 2008-06-06
  • 打赏
  • 举报
回复
为什么TForm(sender)的tag值不能被其他数组引用?
我为每个控件都保存了自己的tag值,才正确引用的
我现在的全局变量也需要编程数组,starttime[0..100]:array of integer,第i个窗体用starttime[i],但是i的值不能用TForm的索引,确定不了,怎么解决啊?
zjzjzjzjzjzj 2008-06-05
  • 打赏
  • 举报
回复





procedure TForm1.Button1Click(Sender: TObject);

begin
......
SetLength(Butn0Array, FFormCount);
Butn0Array[FFormCount - 1]:=TButton.Create(nil);
Butn0Array[FFormCount - 1].Width:=41;
Butn0Array[FFormCount - 1].Height:=41;
Butn0Array[FFormCount - 1].Top:=176;
Butn0Array[FFormCount - 1].Left:=8;
Butn0Array[FFormCount - 1].Caption:='0';
Butn0Array[FFormCount - 1].Parent:=GroupBox3Array[FFormCount - 1];
Butn0Array[FFormCount - 1].OnClick:=Butn0Click;
Butn0Array[FFormCount - 1].Visible:=True;

SetLength(Memo1Array, FFormCount);
Memo1Array[FFormCount - 1]:=TMemo.Create(nil);
Memo1Array[FFormCount - 1].Width:=81;
Memo1Array[FFormCount - 1].Height:=33;
Memo1Array[FFormCount - 1].Top:=184;
Memo1Array[FFormCount - 1].Left:=168;
Memo1Array[FFormCount - 1].Text:='';
Memo1Array[FFormCount - 1].Parent:=GroupBox3Array[FFormCount - 1];
Memo1Array[FFormCount - 1].Visible:=True;
......
end;

procedure TForm1.Butn0Click(Sender: TObject);
begin
PostMessage((Memo1Array[TForm(TButton(Sender).Parent).tag]).Handle, WM_KEYDOWN, 48, 0);//0为什么总是显示在第一个创建的窗里?
end;


禹爸爸 2008-06-05
  • 打赏
  • 举报
回复
Tag属性默认值是0,你需要检查一下你取到的Tag值是多少!
禹爸爸 2008-06-04
  • 打赏
  • 举报
回复
你可以把创建的窗体序号,即FormArray中的索引值存放在窗体的Tag属性中。

procedure TForm1.Button1Click(Sender: TObject);

begin
Inc(Presstimes);
Inc(FFormCount);
k[Presstimes-1]:=FFormCount-1;


SetLength(FormArray, FFormCount);
FormArray[FFormCount - 1] := TForm.Create(Application);
FormArray[FFormCount - 1].OnClose := FormClose;
FormArray[FFormCount - 1].Tag := FFormCount - 1;
FormArray[FFormCount - 1].Caption := Format('Form%d', [FFormCount]);
FormArray[FFormCount - 1].Width := 303;
FormArray[FFormCount - 1].Height := 439;
FormArray[FFormCount - 1].Position := poScreenCenter;
FormArray[FFormCount - 1].Show;

SetLength(GroupBox3Array, FFormCount);
GroupBox3Array[FFormCount - 1]:=TGroupBox.Create(nil);
GroupBox3Array[FFormCount - 1].Width:=265;
GroupBox3Array[FFormCount - 1].Height:=225;
GroupBox3Array[FFormCount - 1].Top:=16;
GroupBox3Array[FFormCount - 1].Left:=16;
GroupBox3Array[FFormCount - 1].Caption:='数字键';
GroupBox3Array[FFormCount - 1].Parent:=FormArray[FFormCount - 1];
GroupBox3Array[FFormCount - 1].Visible:=True;

SetLength(Button15Array, FFormCount);
Button15Array[FFormCount - 1]:=TButton.Create(nil);
Button15Array[FFormCount - 1].Width:=76;
Button15Array[FFormCount - 1].Height:=25;
Button15Array[FFormCount - 1].Top:=376;
Button15Array[FFormCount - 1].Left:=104;
Button15Array[FFormCount - 1].Caption:='退出';
Button15Array[FFormCount - 1].Parent:=FormArray[FFormCount - 1];
Button15Array[FFormCount - 1].OnClick:=Button15Click;//总是无法确定要关闭的窗体
Button15Array[FFormCount - 1].Visible:=True;


end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ShowMessage(TForm(Sender).Caption + ' has been closed.');
TForm(Sender).Free;
end;

procedure TForm1.Button15Click(Sender: TObject);

begin
//FormArray[k[Presstimes]].Hide;
FormArray[TForm(TButton(Sender).Parent).Tag].Hide;
end;
zjzjzjzjzjzj 2008-06-04
  • 打赏
  • 举报
回复
各个窗体独立了 呵呵 谢谢你
unit phone;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);

private
FFormCount: Integer;
FormArray: array of TForm;
Button15Array: array of TButton;
GroupBox3Array: array of TGroupBox;
k:array[0..100] of integer;
Presstimes:integer;
{ Private declarations }
protected
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button15Click(Sender: TObject);

public
{ Public declarations }
end;

var
Form1: TForm1;


implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Presstimes := 0;
FFormCount := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);

begin
Inc(Presstimes);
Inc(FFormCount);
k[Presstimes-1]:=FFormCount-1;


SetLength(FormArray, FFormCount);
FormArray[FFormCount - 1] := TForm.Create(Application);
FormArray[FFormCount - 1].OnClose := FormClose;
FormArray[FFormCount - 1].Caption := Format('Form%d', [FFormCount]);
FormArray[FFormCount - 1].Width := 303;
FormArray[FFormCount - 1].Height := 439;
FormArray[FFormCount - 1].Position := poScreenCenter;
FormArray[FFormCount - 1].Show;

SetLength(GroupBox3Array, FFormCount);
GroupBox3Array[FFormCount - 1]:=TGroupBox.Create(nil);
GroupBox3Array[FFormCount - 1].Width:=265;
GroupBox3Array[FFormCount - 1].Height:=225;
GroupBox3Array[FFormCount - 1].Top:=16;
GroupBox3Array[FFormCount - 1].Left:=16;
GroupBox3Array[FFormCount - 1].Caption:='数字键';
GroupBox3Array[FFormCount - 1].Parent:=FormArray[FFormCount - 1];
GroupBox3Array[FFormCount - 1].Visible:=True;

SetLength(Button15Array, FFormCount);
Button15Array[FFormCount - 1]:=TButton.Create(nil);
Button15Array[FFormCount - 1].Width:=76;
Button15Array[FFormCount - 1].Height:=25;
Button15Array[FFormCount - 1].Top:=376;
Button15Array[FFormCount - 1].Left:=104;
Button15Array[FFormCount - 1].Caption:='退出';
Button15Array[FFormCount - 1].Parent:=FormArray[FFormCount - 1];
Button15Array[FFormCount - 1].OnClick:=Button15Click;//总是无法确定要关闭的窗体
Button15Array[FFormCount - 1].Visible:=True;



end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ShowMessage(TForm(Sender).Caption + ' has been closed.');
TForm(Sender).Free;
end;

procedure TForm1.Button15Click(Sender: TObject);

begin
FormArray[k[Presstimes]].Hide;
end;

end.

很想把函数也放进数组里
每个创建的窗体没法获得唯一标记啊,指教(chirs_mao)怎么写Button15Click啊
zjzjzjzjzjzj 2008-06-03
  • 打赏
  • 举报
回复
我关闭这么写的
procedure Tdiaer.FormClose_Self(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;

测试了你的程序,Error reading Form1.OnClose :Invalid property value
。。。。。。
禹爸爸 2008-06-03
  • 打赏
  • 举报
回复
不知道你在FormClose事件里是如何写的。
下面的代码可以动态创建多个窗体,并正确关闭之(省略了动态创建其他组件部分)。
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
FFormCount: Integer;
FormArray: array of TForm;
protected
procedure FormClose(Sender: TObject; var Action: TCloseAction);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
FFormCount := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Inc(FFormCount);
SetLength(FormArray, FFormCount);
FormArray[FFormCount - 1] := TForm.Create(Application);
FormArray[FFormCount - 1].OnClose := FormClose;
FormArray[FFormCount - 1].Caption := Format('Form%d', [FFormCount]);
FormArray[FFormCount - 1].Width := 200;
FormArray[FFormCount - 1].Height := 200;
FormArray[FFormCount - 1].Position := poScreenCenter;
FormArray[FFormCount - 1].Show;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ShowMessage(TForm(Sender).Caption + ' has been closed.');
TForm(Sender).Free;
end;

end.
zjzjzjzjzjzj 2008-06-03
  • 打赏
  • 举报
回复
好聪明
我试试
i_am_different 2008-06-03
  • 打赏
  • 举报
回复
禹爸爸 2008-06-03
  • 打赏
  • 举报
回复
Form1的OnClose不需要指定事件!
gyk120 2008-06-02
  • 打赏
  • 举报
回复
果然是指针和句柄的问题……
禹爸爸 2008-06-02
  • 打赏
  • 举报
回复
你的CreateForm过程会被多次调用,变量f1在每次调用时都会被重新赋值(指向新创建的窗体),这样就会丢失掉之前窗体的指针,你的程序也就没有办法再引用到之前创建的窗体。

建议楼主使用一个数组来存放动态创建的多个窗体。
将f1的声明改为
f1: array of TForm;

procedure TForm1.CreateForm; 
begin
Inc(Count); //Count变量初值为0
SetLength(f1, Count);
f1[Count - 1] := TForm.Create(Application);
with f1[Count - 1] do begin
......//属性设置
end;
f1[Count - 1].OnClose := FormClose;
f1[Count - 1].Show;

GroupBox3:=TGroupBox.Create(nil);
...... //GroupBox3的属性设置
GroupBox3.Caption:='数字键';
GroupBox3.Parent:=f1[Count - 1];
GroupBox3.Visible:=True;

......//在动态创建的f1[Count - 1]窗体上动态创建动态组件
......//在f1[Count - 1]上动态创建ADOQuery
end;
hsmserver 2008-06-02
  • 打赏
  • 举报
回复
FormClose方法怎么写的?
肯定是这的问题
linzi 2008-06-02
  • 打赏
  • 举报
回复
是不是你的FormClose有问题?
zjzjzjzjzjzj 2008-06-02
  • 打赏
  • 举报
回复
代码贴在了4楼呢
zjzjzjzjzjzj 2008-06-02
  • 打赏
  • 举报
回复
试了很久,把组件创建部分都注释掉了,就留了一个“退出”按钮在f1上,还是和原来一样的
纳闷
禹爸爸 2008-06-02
  • 打赏
  • 举报
回复
如果你GroupBox也是动态创建多个的话,也需要用数组对其进行管理。
zjzjzjzjzjzj 2008-06-02
  • 打赏
  • 举报
回复
是不是因为我组件的parent是GroupBox,还要将GroupBox设成数组?
zjzjzjzjzjzj 2008-06-02
  • 打赏
  • 举报
回复
我试了一下,出现错误:
Access violation at address 0045EC49 in module 'CLIENT.EXE'.Read of address 000000E5.
我觉得你的很对的啊
加载更多回复(15)

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧