***高分***不够可以再加***如何设置动态生成的窗体(没有具体的窗体名)的属性?(100分)

  • 主题发起人 主题发起人 abc_xp
  • 开始时间 开始时间
A

abc_xp

Unregistered / Unconfirmed
GUEST, unregistred user!

有一程序有两个窗体类TForm1、TForm2,TForm1为主窗体,
TForm2为非自动创建,用以下方法创建:
with TForm2.Create(Applicaton) do
begin
……
……
end;

问题一:在Button1.Click和Button2.Click后创建了2个TForm2的实例,如何区分这两个窗体?
(我知道可以用FindWindow来得到窗体的句柄,但是不知道得到后如何做?)

问题二:在TForm2的实例创建后,可以用FindWindow()来得到此窗体的句柄,
有何方法可以设置此窗体的属性?

以上两个问题应该是有联系的,就是说,在两个TForm2的实例中如何区分到底哪个是哪个?
区分后,如何设置它的属性(如caption等)?

注:
with TForm2.Create(Applicaton) do
begin
//我知道可以在这里设置它的属性,不要再告诉我,不符合我的问题
end;


多谢!!!!
分不够可以加!!!!

QQ: 107710715
E-mail: eyes@58866.com.cn
 
var
a, b: TForm2;

a := TForm2.Create(Application);
with a do
begin
// 设置属性
end;
b := TForm2.Create(Application);
with b do
begin
// 设置属性
end;
 
在创建的时候,可以用一个没实际意义的属性来做窗体的唯一标识,例如用随机算法、时间
组合、UID,赋给窗体的tag属性,或在窗体中放一个变量记载。也可以,用一个指针列表来
指向每一个窗体,用一个全局整型变量计数。
 
to pearl

动态创建的窗体的个数是不可预知的,你的回答不符合
 
同意 fatalexception

在窗体创建时,用记录数组保存下来窗体信息
Type TWndRec=record
Hnd: THandle;
PForm: TForm;
end;

WndRecArr:array of TWndRec;

使用时,得到窗体名柄后,当所得句柄和WndRecArr.Hnd相等时,用WndRecArr.PForm
来操作窗体。

 
我的办法比较笨,方法是记录每一个动态建立的窗体的 Handle ,只要在建立时,立即
获得它就可以了。哦 beyondair 已经讲到了,不好意思,不写了。有了 Handle ,要
设置它的属性就很方便了。
 
var
forms: TList;

begin
....
forms.add(TForm2.Create(Application));
with TForm2(Forms.items[forms.count-1]) do
begin
// 设置你的属性
end;
end;

把单个变量换成一个数组并不是什么高深到不可想象的事吧? 您怎么没想到呢?
 
to :beyondair,

非常感谢您的回答
小弟还有疑问:

如何给WndRecArr.Hand和WndRecArr.PForm赋值?
 
to :beyondair,

非常感谢您的回答
小弟还有疑问:
1、我是用with TForm2.Create(Application) do这样的形式创建窗体的
如何给WndRecArr.Hand和WndRecArr.PForm赋值?

2、还有:
我该在一个单元的哪个地方写下面的代码?
Type TWndRec=record
Hnd: THandle;
PForm: TForm;
end;
我很菜地
我要定义 WndRecArr:array of TWndRec;成一个全局变量

3、WndRecArr:array of TWndRec;这样定义,WndRecArr应该是一个动态数组
动态数组是不是一定要用SetLength来设置其长度才能使用?

多谢
多谢
多谢

说详细一点吧:我在做一个类QQ的聊天程序,要动态地创建 接收/发送 消息窗体
就碰到这样的一个问题,所以整个程序都停了下来,无法进行下去。
 
Form1=TForm1.Create(Applicarion);
...
Form2:=TForm2.Create(Application);

Application.FindComponent('Form1').Caption:='aaaa';
Application.FindComponent('Form1').Caption:='bbbb';
 
1.with TForm2.Create(Application) do
begin
WndRecArr.PForm:=TForm2.Create(Application);
WndRecArr.Hnd;=WndRecArr.PForm.Handle;
end;
2.
unit Unit1;

interface

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

type
TWndRec=record //这里定义记录类型
Hnd: THandle;
PForm: TForm;
end;
TForm1 = class(TForm)
Button1: TButton;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
WndRecArr:array of TWndRec;//如果是所有单元都要公用的,就定义在这里
implementation
var
WndRecArr:array of TWndRec;//如果只是这个单元公用就定义在这里

3.动态数组在使用前必须分配空间 SetLength(WndRecArr,num);然后就可静态一样的使用了

实际上,你如果只是发送消息,就用不着窗体指针,有句柄不就行了嘛,如果要窗体有所动
作也可以写在消息的处理函数里
 
to beyondair,

好像有点问题啊
with TForm2.Create(Application) do
begin
WndRecArr[0].PForm:=TForm2.Create(Application);
WndRecArr[0].Hnd;=WndRecArr.PForm.Handle;
ShowMessage(IntToStr(WndRecArr[0].Hnd;//此处显示出来的数字与下面查找到的不一样,我只创建一个窗体
end;
//////////////////////
var
hnd:THandle;
begin
hnd:=FindWindow('TForm2','Form2');
ShowMessage(IntToStr(WndRecArr[0].Hnd));//此处显示出来的数字与上面显示出来的不一样
end;

var
FrmTmp:TForm;
begin
FrmTmp:=WndRecArr[0].PForm;
FrmTmp.caption:='abc';//那个窗体的caption根本就没有什么改变?
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); //你要把项目文件里面Form2的创建语句去掉才行
Application.Run; //不然你在程序运行期创建的是第二个Form2了,再试试
end.


procedure TForm1.Button1Click(Sender: TObject);
begin
setlength(WndRecArr,1);
with TForm2.Create(Application) do
begin
WndRecArr[0].PForm:=TForm2.Create(Application);
WndRecArr[0].PForm.show; // 一定要先Show 再看效果哈
WndRecArr[0].Hnd:=WndRecArr[0].PForm.Handle;
ShowMessage(IntToStr(WndRecArr[0].Hndend;

WndRecArr[0].PForm.color:=clred;
end;
 
var
hnd:THandle;
begin
hnd:=FindWindow('TForm2','Form2');
ShowMessage(IntToStr(WndRecArr[0].Hnd));//此处显示出来的数字与上面显示出来的不一样
end;
当然不一样了!!!你要从WndRecArr中找到等于hnd的那个记录!
 
to beyondair

好地我再试试
不过我好像已经show了啊?

试了再说

十分地感谢
 
to to beyondair

上面的问题已经解决,不过还有一个问题

如何得到TForm2类窗体的句丙?我要创建的TForm2有好多个,findWindow只能得到1个

如何得到所以TForm2类窗体的句柄?并保纯在一个数组里???


多谢
 
你应当用application.components
 
上面的例子不是在创建时保存的吗

WndRecArr:array of TWndRec;
这里面不就是你想要的东西么
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部