“可用表格:”。原装Delphi框架与原始单位

时间:2013-09-17 02:35:48

标签: delphi

问题:

如何在表格中加载Form1或样本容器中的框架?

FindClassGetClass仅适用于主表单appl-n

TFrameClass我需要(也许)字符串全局元素,下一个代码:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TFrameClass = class of TFrame;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);    
  private
    FFrame: TFrame;    
    function StrShowFrame(FrameClassName: string;
      ParentPanel: TWinControl): Boolean;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses Base1Frame, Base2Frame, Base3Frame;

function TForm1.StrShowFrame(FrameClassName: string;
  ParentPanel: TWinControl): Boolean;
var
  FrameClass: TClass;
  // Current Frame  (FrameName)
  FrameName: string;    
begin
  Result := False;

  ???   GetClass is only locality for main form in appl-n

  FrameClass := GetClass(FrameClassName);

  if FrameClass = nil then
  begin    
    ShowMessageFmt('Class %s not registered', [FrameClassName]);
    Result := False;
    Exit;
  end;

  try
    begin
      LockWindowUpdate(ParentPanel.Handle);

      if Assigned(FFrame) then
        if FFrame.ClassType = FrameClass then
        begin
          Result := True;
          Exit;  
        end
        else
          FFrame.Destroy; // del previus FrameClass

      try
        FFrame := TFrameClass(FrameClass).Create(nil);
      except
        on E:Exception do
        begin
          Result := True;
          E.Create(E.Message);
          FFrame := nil;
          Exit;
        end;
      end;

      FrameName:= FrameClassName;
      Delete(FrameName, 1, 1); // T-...    
      FFrame.Name := Concat(FrameName, '1');
      FFrame.Parent := ParentPanel;
      FFrame.Align := alClient;    
    end;    
  finally
    LockWindowUpdate(0); 
  end;

  Result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  StrShowFrame('TFr_Base1', Panel1);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  try
    if FFrame <> nil then
      FFrame.Free
    else
      ShowMessage('Class not activ');    
  except

  end;    
end;

end.

如何在表格中加载Form1或样本容器中的框架?

FindClassGetClass仅适用于主表单appl-n

TFrameClass我需要(也许)字符串全局元素。

1 个答案:

答案 0 :(得分:3)

GetClass()FindClass()不是MainForm的本地,它们对整个RTL是全局的。任何单位都可以调用RegisterClass()并让任何其他共享RTL的相同实例的单位访问该类。最后一部分很重要。 DLL无法注册EXE使用的类(反之亦然),除非两个项目都使用运行时软件包编译,因此它们共享一个RTL实例。