線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2181
推到 Plurk!
推到 Facebook!

動態以 Form 的 ClassName (字串) 建立唯一視窗

 
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-21 13:45:47 IP:218.16.xxx.xxx 未訂閱
這個範例是按 CCChan 前輩給的資料寫成    可以在主 Form 不 uses 其他 Form 的情況下,以 ClassName (字串) 來找尋有沒有開了若已存在帶它上最上若不存在便 Create    這個範例示範了使用 FormClass (要 uses 該Form unit) 及 以 ClassName (不用uses) 來呼叫    
unit fm1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls;    type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    New1: TMenuItem;
    mForm2: TMenuItem;
    mForm3: TMenuItem;
    ComboBox1: TComboBox;
    Button1: TButton;
    procedure mForm2Click(Sender: TObject);
    procedure mForm3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    function CreateUniqueForm(FormClass: TFormClass): TFormclass; overload;
    function CreateUniqueForm(fmName: string): TFormclass; overload;
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    uses Fm2; // 注意沒使用 Fm3    {$R *.dfm}    function TForm1.CreateUniqueForm(FormClass:TFormClass):TFormclass;
var
i : integer;
Fm : TForm;
begin
  fm := nil;
  for i := 0 to Screen.FormCount - 1 do
    if Screen.Forms[i] is FormClass then
    begin
      Fm := Screen.Forms[i];
      if Fm.WindowState = wsMinimized then
        Fm.WindowState := wsNormal;
      Fm.BringToFront;
    end;
  if not assigned(fm) then
    fm := FormClass.Create(Self);
  fm.Show;
  result := TFormClass(Fm);
end;    function TForm1.CreateUniqueForm(fmName: string):TFormclass;
begin
  Result := TFormClass(FindClass(fmName));
  try
    try
      CreateUniqueForm(Result);
    except
      on E:Exception do
        ShowMessage(E.Message);
    end;
  except
    ShowMessage(fmname  ' 尚未建立');
  end;
end;    procedure TForm1.mForm2Click(Sender: TObject);
begin
  CreateUniqueForm(TForm2); // 用 FormClass 來開啟
end;    procedure TForm1.mForm3Click(Sender: TObject);
begin
  CreateUniqueForm('TForm3'); // 用 Form ClassName 來開啟
end;    procedure TForm1.Button1Click(Sender: TObject);
begin
  CreateUniqueForm(ComboBox1.Text); // 用一般文字甚至 Database 裡的值都可以
end;    end.
還要留意的是每個用這種方法的 Form 要加上 RegisterClass(FormClass) ,這樣 FindClass 才可找得到。
initialization
  RegisterClass(TForm2);
(見下載範例) 這個例子的原理是每個Form 都 Register 了它的 Class, 記錄在 RTTI, 這樣, FindClass 就可以從字串的 Class Name 找出回傳 Class 了。 最後再一次多謝 ccchen 前輩指導,使小弟也學了不少。 發表人 - Justmade 於 2003/05/21 22:21:53
附加檔案:30803_fmProjects.zip
系統時間:2024-06-29 16:36:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!