//控件單元。
{*
單元說明:     創建模式窗口,和非模式窗口的類,保證非模式窗口只創建一次。
作者        :     筆名:易  一    英文名:yeeyee
E-Mail     :    jane1437@163.com
創建時間:          2005年5月20日
及最后修改時間:
修改人修改時間及:
修改說明:
版權聲明:      版權所有,轉載請注明本人郵箱和筆名。
*}
unit ShowFormClass;
interface
uses
  SysUtils, Classes,Dialogs, Forms;
type           
  TShowFormClass = class(TComponent)
  PRivate
    { Private declarations }
    //保存要創建的窗體的類名
    FFrmName:string;    
    //判斷窗體是否存在。
    function IsFormExist:boolean;
    //得到窗體。
    function GetExistForm:TForm;
    //創建一個類
    function CreateAClass(const AClassName: string): TForm;
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); virtual;
    destructor Destroy; override;
    
    //創建并顯示窗體。模式窗體。
    procedure ShowModalForm(const AStrForm:string);overload;
    procedure ShowModalForm(AFormClass:TFormClass);overload;
    //創建并顯示窗體。非模式窗體。
    procedure ShowModalLessForm(const AStrForm:string);overload;
    procedure ShowModalLessForm(AFormClass:TFormClass);overload;
  published
    { Published declarations }
  end;
procedure Register;
implementation
procedure Register;
begin
  RegisterComponents('Yeeyee', [TShowFormClass]);
end;
constructor TShowFormClass.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;
destructor TShowFormClass.Destroy;
begin
  inherited Destroy;
end;
function TShowFormClass.GetExistForm:TForm;
var
  i:integer;
begin
  for i := 0 to (application.ComponentCount - 1) do
  begin
    if (Application.Components[i] is TForm) then
    begin
      //注意,關鍵判斷這個類型名稱是否存在。
      if (application.Components[i] as TForm).ClassType.ClassName = FFrmName then
      begin
        Result:=(application.Components[i] as TForm);
        exit;
      end
    end;
  end;
end;
function TShowFormClass.IsFormExist:boolean;
var
  i:integer;
begin
  Result:=False;
  for i := 0 to (Application.ComponentCount - 1) do
  begin
    if (Application.Components[i] is TForm) then
    begin
      //注意,關鍵判斷這個類型名稱是否存在。
      if (application.Components[i] as TForm).ClassType.ClassName = FFrmName then
      begin
        Result:=True;
        exit;
      end
    end;
  end;
end;
//創建一個類
function TShowFormClass.CreateAClass(const AClassName: string): TForm;
var
  LFormClass : TFormClass;
  LForm: TForm;
begin
  LFormClass := TFormClass(FindClass(AClassName));
  LForm := LFormClass.Create(Application);
  Result := LForm;
end;
//創建并顯示窗體。模式窗體。傳入字符串。
procedure TShowFormClass.ShowModalForm(const AStrForm:string);
var
  LForm: TForm;
begin
  FFrmName:=AStrForm;
  LForm := CreateAClass(FFrmName);
  try
    LForm.ShowModal;
  finally
    LForm.Free;
  end;
end;
//創建并顯示窗體。模式窗體。傳入類的引用。
procedure TShowFormClass.ShowModalForm(AFormClass:TFormClass);
begin
  with AFormClass.Create(Application) do
  begin
    try
      ShowModal;
    finally
      Free;
    end;
  end;
end;
//創建并顯示窗體。模式窗體。傳入字符串。
procedure TShowFormClass.ShowModalLessForm(const  AStrForm:string);
var
  LForm: TForm;
begin
  FFrmName:=AStrForm;
  //窗體不存在,則創建。
  if not IsFormExist then
  begin
    LForm := CreateAClass(FFrmName);
    LForm.Show;
  end
  else
  begin
    //存在,則得到窗體。帶到最前頭。
    LForm:=GetExistForm;
    LForm.BringToFront;
  end;
end;
//創建并顯示窗體。模式窗體。傳入類的應用。
procedure TShowFormClass.ShowModalLessForm(AFormClass:TFormClass);
var
  LForm: TForm;
begin
  FFrmName:=AFormClass.ClassName;
  //窗體不存在,則創建。
  if not IsFormExist then
  begin
    LForm := CreateAClass(FFrmName);
    LForm.Show;
  end
  else
  begin
    //存在,則得到窗體。帶到最前頭。
    LForm:=GetExistForm;
    LForm.BringToFront;
  end;
end;
end.
//調用單元
procedure TMainForm.mmiAreaClick(Sender: TObject);
begin
  //
  YShowFormClass.ShowModalForm(TFormArea);
end;
(*
procedure TMainForm.mmiAreaClick(Sender: TObject);
begin
  //
  YShowFormClass.ShowModalForm('TFormArea');
end;
initialization                             
begin
  RegisterClasses([TAboutBox,TFormArea]);
end;
finalization
begin
  UnRegisterClasses([TAboutBox,TFormArea]);
end; *)
新聞熱點
疑難解答