フレームをDLLから追加するには?


飛び猫  2008-01-22 02:31:32  No: 29413

いくつ増えるかわからない画面構成の違いを吸収するために、DLLに定義したフレームを読込んで、フォーム内に配置するサンプルプログラムを組んでいます。
フレームのParentプロパティをセットする時に「TFontをTFontに代入することはできません」というエラーが発生してしまいます。
何か解決方法は無いでしょうか?

環境はDelphi2007 for Win32 + WinXPです

サンプル
Unit1.pas
type TControlClass = class of TControl;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    Handle : THandle;
    function CreateControl(ControlClass: TControlClass;
      const ControlName: string; X, Y, W, H: Integer): TControl;
  public
  end;
var
  Form1: TForm1;
implementation
//uses Unit2;
procedure TForm1.Button1Click(Sender: TObject);
var
  LoadClass : TControlClass;
  MyFunc : function : TControlClass; stdcall;
begin
//  LoadClass := TFrame2;
//  CreateControl(LoadClass, 'Frame1', 100, 100, 100, 10);
  if Handle <> 0 then
  begin
    @MyFunc := GetProcAddress(Handle, 'GetClass');
    if @MyFunc <> nil then
    begin
      LoadClass := MyFunc;
      CreateControl(LoadClass, 'Frame1', 100, 100, 100, 10);
    end;
  end;
end;
function TForm1.CreateControl(ControlClass: TControlClass;
  const ControlName: string; X, Y, W, H: Integer): TControl;
begin
  Result := ControlClass.Create(Form1);
  with Result do
  begin
    Parent := Form1 as TWinControl;
    Name := ControlName;
    SetBounds(X, Y, W, H);
    Visible := True;
  end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  Handle := LoadLibrary('Project2.dll');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
  if Handle <> 0 then FreeLibrary(Handle);
end;
end.

Unit2.pas(Project2.dll側)
type TControlClass = class of TControl;
type
  TFrame2 = class(TFrame)
  private
    { Private declarations }
  public
    { Public declarations }
  end;
implementation
function GetClass : TControlClass; stdcall;
begin
  Result := TFrame2;
end;
exports
  GetClass;
end.


KHE00221  2008-01-22 03:18:44  No: 29414

DLLを新規作成するとプロジェクトに記載されているコメントは読みましたか?


飛び猫  2008-01-22 03:36:30  No: 29415

Project2.dllのソースとUnit2のusesの先頭にShareMemを追加してみましたが、エラーは変わりませんでした。
ついでに全てのソースのusesにも追加してみましたがだめでした。


うんと  2008-01-22 04:47:36  No: 29416

共通パッケージを使わない限り、DLL とその呼び出し先でクラスのインスタンス
やクラス参照を受け渡すことはできません。


KHE00221  2008-01-22 09:46:06  No: 29417

DLL化したとしてEXEからDLL上のフレームに乗っているコンポーネントにアクセスできないと思うんだけど?

個々のコンポーネントのインスタンスを渡せは出来るだろうけど

DLL化せずにEXEにFrameのユニットを増やしていって動的にフレームを作成すべきだとは思うんだけど


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加