如何得到Form的列表?(100分)

  • 主题发起人 主题发起人 songhb
  • 开始时间 开始时间
S

songhb

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi中如何实现下面的要求:
当Project执行后,在界面上的编辑框中输入该Project中任意一个Form的名称,
回车后即调出该Form。
实际上我只是需要得到Form的列表。
注:不是MDI格式。
急!!!!
 
在OnKeyPress或者OnKeyDown事件中不能实现嘛?


if key=vk_Return then
begin
key:=#0
YourForm.Show
end;
 
for i:= 0 to Screen.FormCount-1 do Listbox1.Items.Add(Screen.Forms.Name);
 
不明白,如果仅仅是本程序的窗体,把所有窗体的名称加到列表中就是了,当然主窗体
要引用所有窗体单元。如果需要判断窗体是否已创建,使用assigned。
如果是所有的窗体(含其他应用程序窗体)使用o*o的方法。
 
含其他应用程序窗体???
no.
 
要是自己的程序很简单,你很清楚有几个窗体吗。要是其他的应用程序估计不行。
 
o*o的答案非常正确,在此再补充一点的是,Tscreen是一个十分有用的类,其imes、fonts以及forms等属性都很有用,可以查阅D5的帮助。
 
左上角上不是有快捷键吗?(*_*)
G;:o*o
 
谢谢o*o
但是Screen.Forms只能得到Project中Auto-create form列表中的Form,
而我还要同时得到Available forms列表中的Form,
也就是说,Project运行后,我不光要得到Create的Form,我要得到所有的Form,
请问,该怎么做?
 
//hook例子源码
unit Main_Form_Unit;

interface

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

type
TMainForm = class(TForm)
ListBox1: TListBox;
Panel1: TPanel;
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
StaticText1: TStaticText;
procedure Button1Click(Sender: TObject);
procedure ListBox1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure StaticText1Click(Sender: TObject);
private
function ExtractHwnd (const Text: string): THandle;
function ExtractTitle (const Text: string): string;
procedure UpdateEdit;
procedure CallEnumWindows;
public
{ Public declarations }
end;

var
MainForm: TMainForm;

implementation

{$R *.DFM}

uses ShellAPI;

function GetTitle(Hwnd: THandle
Param: Pointer): Boolean
stdcall;
var
TitleStr: string;
begin
SetLength (TitleStr, 300);
GetWindowText (Hwnd, PChar (TitleStr), 300);
MainForm.ListBox1.Items.Add (
IntToStr (Hwnd) + ': ' + TitleStr);
Result := True;
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
CallEnumWindows;
ListBox1.ItemIndex := 0;
UpdateEdit;
Button2.Enabled := True;
end;

function TMainForm.ExtractHwnd(const Text: string): THandle;
begin
Result := StrToInt (
Copy (Text, 1, Pos (':', Text) - 1));
end;

function TMainForm.ExtractTitle(const Text: string): string;
begin
Result := Copy (Text, Pos (':', Text) + 2, Length (Text));
end;

procedure TMainForm.ListBox1Click(Sender: TObject);
begin
UpdateEdit;
end;

procedure TMainForm.Button2Click(Sender: TObject);
var
OldItemIndex : Integer;
begin
SetWindowText (
ExtractHwnd (ListBox1.Items [ListBox1.ItemIndex]),
PChar (Edit1.Text));
OldItemIndex := ListBox1.ItemIndex;
CallEnumWindows;
ListBox1.ItemIndex := OldItemIndex;
UpdateEdit;
end;

procedure TMainForm.UpdateEdit;
begin
Edit1.Text := ExtractTitle (ListBox1.Items [ListBox1.ItemIndex]);
end;

procedure TMainForm.CallEnumWindows;
begin
ListBox1.Clear;
EnumWindows (@GetTitle, 0);
end;
end.
 
非常感谢 房客
不过我想我没有说明白,
当在Delphi IDE环境中按Shift+F12时会得到一张View Form的列表,
我就是想在程序运行后得到这张列表。它既包含当前已Create的Form,
也包括尚待调用的Form。但与其他的运行程序无关。
当我单击Button1后,会在ListBox中显示所有的Form清单,
单击Button2后,会创建并打开选中的Form。
各位,我该怎么做?
 
如果你的form都已存在,可直接在设计时,加在LISTBOX的TSTRING中。
就是麻烦些。
 
哪位大侠帮帮忙,要送分啦!
 
多人接受答案了。
 
后退
顶部