急急急!!!如何得到当前工程下所有窗口名列表

hzm_8 2009-06-05 05:34:26
某个工程project1,建好了n个窗口 from1,form2,form3...form_n
如何得到当前工程下所有窗口名列表,最好能在下拉框中选择出来!!!在线等待

procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin
Self.ComboBox1.Items.Clear;
for I := 0 to Screen.FormCount-1 do
Self.ComboBox1.Items.AddObject(Screen.Forms[I].Name, Screen.Forms[I]);
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
TForm(Self.ComboBox1.Items.Objects[Self.ComboBox1.ItemIndex]).Show;
end;

注意:

我有10个窗口,当前屏幕打开了2个窗口,有8个还没打开,我的意思是将10个窗体名全部下拉出来,上面脚本,只列出了当前打开的2个窗口,是不对的.

拜托高手继续解答。。。

...全文
107 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzm_8 2009-06-08
  • 打赏
  • 举报
回复
b43ok 是实现了,但是同时也列举出了许多其他窗口名,这些其他窗口不是我建立,还是没达到我的预期目的,不过精神可嘉,水平也可嘉。
b43ok 2009-06-07
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 dick1026 的回复:]
我认为你的目的不能实现。
我来说说原因,不对的地方请指教:
1、delphi中的确有查看窗体列表的功能,那是那些窗体对于delphi来说是固定的,可以理解为一个固定的窗体对象。
但对于delphi所设计的程序来说,是泛化的,也就是说是一个类。
2、Form窗体在delphi中一旦建立,即是唯一的,比如你创建了一个名称叫做FrmMain的窗体,你就不能再创建第二个
同样的窗体了,但对于delphi所设计的程序来说,确可以创建0个到多…
[/Quote]
我在18楼发的代码已经实现,
楼上的推理完全正确,
但是忽略一个问题,EXE文件是固定的,解码一些EXE里的东西是可以做到的
比较凑巧的是,Delphi生成的Exe文件所带的资源里,刚好有窗体的类名,而窗体名跟类名的区别只是少个T字
所以算是比较凑巧吧,不然得要解析它的PE Header,就不是这几行代码能实现的了
AsheBin 2009-06-07
  • 打赏
  • 举报
回复
我认为你的目的不能实现。
我来说说原因,不对的地方请指教:
1、delphi中的确有查看窗体列表的功能,那是那些窗体对于delphi来说是固定的,可以理解为一个固定的窗体对象。
但对于delphi所设计的程序来说,是泛化的,也就是说是一个类。
2、Form窗体在delphi中一旦建立,即是唯一的,比如你创建了一个名称叫做FrmMain的窗体,你就不能再创建第二个
同样的窗体了,但对于delphi所设计的程序来说,确可以创建0个到多个TFrmMain的实力,而这个实力可以动态创建,也
可以静态的创建,当然也可以不创建,所以数目是不确定的。
3、delphi设计时的窗体和运行时的窗体是一个类和对象的区别。抽象和具体的区别。所以对于你已经创建的窗体,可以得到
窗体的列表,如果没有创建,那么是不可能得到的,因为他也许永远都不会被创建(比如你设计了一个多余窗体,根本不用)
4、按照楼主的描述,你有10个窗口,那么这10个窗口是每个窗口是一个单独的类,还是一个类的10个实例,或者介于两者之间?
这些窗体目前是否已经被创建,或者是是否已经被释放,都是未知之数。
综上,个人认为你想得到窗体的列表是不能实现的。
但是你可以得到目前窗体的列表,你可以设计一个全局对象记录当前创建的窗体的信息。
随行的太阳 2009-06-07
  • 打赏
  • 举报
回复
在ComboBox1Change(Sender: TObject)里做过CASE of
其实用户每次面对的只有一个窗口,有别要那样全都给show出来吗?

b43ok 2009-06-07
  • 打赏
  • 举报
回复
因为是API枚举,所以效率不会比For循环差多少,你可以建立一个100窗体的程序来测试
ITlover 2009-06-07
  • 打赏
  • 举报
回复
如果你能确定你所说的所有窗体都已在工程文件中创建好了!
比如:
program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2},
Unit3 in 'Unit3.pas' {Form3},
....
Unitn in 'Unit3.pas' {Formn};


{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm3, Form3);
....
Application.CreateForm(TFormn, Formn);
Application.Run;
end.

那么,你贴出来的代码就是正常的.
但是这样做,效率怎么办啊?
b43ok 2009-06-07
  • 打赏
  • 举报
回复

unit Unit1;

interface

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

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

var
Form1: TForm1;
Function EnumResName(hModule: HMODULE; lpType, lpName: PChar;lParam: Longint):BOOL;stdcall;
implementation

{$R *.dfm}
Function EnumResName(hModule: HMODULE; lpType, lpName: PChar;lParam: Longint):BOOL;
var
str:String;
Begin
str:=UpperCase(lpName);
if (pos('DVCLAL',str)=0)and(pos('PACKAGEINFO',str)=0)then
begin
str:=copy(str,2,length(str));
Form1.Memo1.Lines.Append(str);
end;
result:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
flag: integer;
begin
flag:=1; StrToFloat(
EnumResourceNames(GetModuleHandle(nil),RT_RCDATA,@EnumResName,flag);
end;

end.

b43ok 2009-06-07
  • 打赏
  • 举报
回复
算了,好多人看着呢,你加点分,
我写一小段能实现你要的功能的代码给你
b43ok 2009-06-07
  • 打赏
  • 举报
回复
看到你把Delphi当脚本……郁闷了一下。
你这个问题,常规方法是等窗口加载完了再去按照楼上的screen.forms[]来取得

如果你想在窗口都没加载完就显示的话
只能用非常规方法————读自身程序文件的Resource。RCData里有你想要的东西。
代码我就不给了,以前跟朋友做Delphi反编译器的时候弄的,后来……太监了 -_-!
sy_100000 2009-06-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 hzm_8 的回复:]
在delphi7开发环境中,点击project -> options 弹出一个窗口 叫 project options for project1.exe

在这个窗口中 有个 Main form : 下拉选择项,该下拉列表就列出了工程project1所建的所有窗体名字。我就是想在程序运行中得到该列表。有高手请进。。。上面各位回答的好像都不对。
[/Quote]

高手肯定有,不过一般没有人愿意解答要写10行以上的代码的问题。
hzm_8 2009-06-06
  • 打赏
  • 举报
回复
在delphi7开发环境中,点击project -> options 弹出一个窗口 叫 project options for project1.exe

在这个窗口中 有个 Main form : 下拉选择项,该下拉列表就列出了工程project1所建的所有窗体名字。我就是想在程序运行中得到该列表。有高手请进。。。上面各位回答的好像都不对。
木落 2009-06-05
  • 打赏
  • 举报
回复
话说,RTTI信息还是很有用的
木落 2009-06-05
  • 打赏
  • 举报
回复
我知道Form1.Components是窗体上的控件,
那么Application.Components~将其类型强转为TForm应该是了。
如果不放心,请检查Application.Components[i].ClassName
dinoalex 2009-06-05
  • 打赏
  • 举报
回复
[Code=Delphi(Pascal)]

for i := 0 to Screen.FormCount - 1 do
if screen.Forms[i].Owner = 主窗口 then memo1.lines.append(Screen.Forms[i].Name);

主窗口: 如 MainFrm

[/Code]
dinoalex 2009-06-05
  • 打赏
  • 举报
回复
for i := 0 to Screen.FormCount - 1 do
橘子香水 2009-06-05
  • 打赏
  • 举报
回复
窗口未创建时,是不能获取的,除非你一启动程序,就创建好所有的窗口,但是那样太浪费资源.
gxgyj 2009-06-05
  • 打赏
  • 举报
回复
delphi中的列表是读取了工程Project1.dpr内容,
楼主像想要实现的,小弟也关注了
lihuasoft 2009-06-05
  • 打赏
  • 举报
回复
kim53622744 2009-06-05
  • 打赏
  • 举报
回复
确实,我们要学习的是高效,有水平的方法~学习中
hzm_8 2009-06-05
  • 打赏
  • 举报
回复
那多没水平!delphi的view form 里既然能动态展现所有的窗口,一定有办法动态得到所有form列表,关键是我的程序刚开始做,预计需要做40个窗口。
加载更多回复(4)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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