いくつ増えるかわからない画面構成の違いを吸収するために、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.
DLLを新規作成するとプロジェクトに記載されているコメントは読みましたか?
Project2.dllのソースとUnit2のusesの先頭にShareMemを追加してみましたが、エラーは変わりませんでした。
ついでに全てのソースのusesにも追加してみましたがだめでした。
共通パッケージを使わない限り、DLL とその呼び出し先でクラスのインスタンス
やクラス参照を受け渡すことはできません。
DLL化したとしてEXEからDLL上のフレームに乗っているコンポーネントにアクセスできないと思うんだけど?
個々のコンポーネントのインスタンスを渡せは出来るだろうけど
DLL化せずにEXEにFrameのユニットを増やしていって動的にフレームを作成すべきだとは思うんだけど
ツイート | ![]() |