-1

問題:

Form1フレームまたはサンプル コンテナをフォームにロードするにはどうすればよいですか?

FindClassまたはGetClass、メイン フォーム 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フレームまたはサンプル コンテナをフォームにロードするにはどうすればよいですか?

FindClassまたはGetClass、メイン フォーム appl-n の局所性のみ

私は(多分)文字列グローバルエレメンタルが必要ですTFrameClass

4

1 に答える 1

3

GetClass()MainForm に対してローカルでFindClass()はなく、RTL 全体に対してグローバルです。どのユニットも呼び出して、RTLの同じインスタンスRegisterClass()を共有する他のユニットからそのクラスにアクセスできるようにすることができます。その最後の部分は重要です。DLL は、単一の RTL インスタンスを共有するように両方のプロジェクトがランタイム パッケージを有効にしてコンパイルされていない限り、EXE が使用するクラスを登録できません (逆も同様です)。

于 2013-09-17T03:38:55.927 に答える