![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Попытка создать Frame из Dll... [D7, WinXP]
doma © (2004-06-18 13:29:00)Не знаю, может что-то я делаю не так, но когда Frame был в одном проекте с формой, на которой я пытаюсь его создать, все работало как часы... После того как я перенес фрайм в отдельную Dll... все скомпилировалось... Frame добавился в Controlsы формы... но не отобразился...
Что делать, подскажите?..
Вот весь текст проектов:
{-----------------------------------------------------}
PrjMain:
{-----------------------------------------------------}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TFrameClass = class of TFrame;
TCreateFrameProc = function (lPar : LPARAM; wPar : WPARAM) : integer;
TFrameLoad = procedure (frmCreateProc : TCreateFrameProc);
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
hndDLLHandle: THandle;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ CreateFrameProc
lParam - TFrameClass
result : TFrame }
function CreateFrameProc (lPar : LPARAM; wPar : WPARAM) : integer;
var frm : TFrame;
begin
frm := TFrameClass(lPar).Create(Form1);
frm.Visible := false;
frm.ParentFont := false;
frm.Parent := form1;
Result := integer(frm);
end;
procedure TForm1.Button1Click(Sender: TObject);
var LoadFrame : TFrameLoad;
begin
if hndDLLHandle <> 0 then begin
@LoadFrame := getProcAddress (hndDLLHandle, 'LoadFrame');
if @LoadFrame <> nil then begin
LoadFrame (@CreateFrameProc);
end else showMessage ( 'DLL not found...' );
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var UnLoadFrame : procedure;
begin
if hndDLLHandle <> 0 then begin
@UnLoadFrame := getProcAddress (hndDLLHandle, 'UnLoadFrame');
if @UnLoadFrame <> nil then
UnLoadFrame;
end;
freeLibrary (hndDLLHandle);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
hndDLLHandle := 0;
try
hndDLLHandle := loadLibrary ('prjdll.dll');
except
freeLibrary (hndDLLHandle);
end;
end;
end.
{-----------------------------------------------------}
prjDll
{-----------------------------------------------------}
library PrjDll;
uses
Unit2 in 'Unit2.pas' {Frame2: TFrame};
{$R *.res}
exports
LoadFrame,UnLoadFrame;
begin
end.
{-----------------------------------------------------}
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TFrameClass = class of TFrame;
TCreateFrameProc = function (lPar : LPARAM; wPar : WPARAM) : integer;
TFrame2 = class(TFrame)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure LoadFrame (frmCreate : TCreateFrameProc);
procedure UnLoadFrame;
implementation
var frm : TFrame2;
{$R *.dfm}
procedure LoadFrame (frmCreate : TCreateFrameProc);
begin
frm := TFrame(frmCreate(WPARAM(TFrame2),0)) as TFrame2;
frm.show;
end;
procedure UnLoadFrame;
begin
frm.Free;
end;
procedure TFrame2.Button1Click(Sender: TObject);
begin
Edit1.Text := 'Hello world!!';
end;
end.
doma (2004-06-23 09:24:00) [1]Сделал я как мне посоветовали, но почему-то результат остался тот же все отлично скомпилировалось, создалось, но фрайм на форме не появился...
Вот мой исходник:
DLL:
dpr
var
DLLApp: TApplication;
DLLScreen: TScreen;
{$R *.RES}
procedure DLLMain(dwReason: DWORD);
begin
case dwReason of
dll_Process_Attach :;
dll_Process_Detach :
begin
Application := DllApp;
Screen := DLLScreen;
end;
dll_Thread_Attach : {Statements here};
dll_Thread_Detach : {Statements here};
end;
end;
begin
DLLApp := Application;
DLLScreen := Screen;
DLLProc := @DLLMain;
end.
Unit
function LoadFrame(App: TApplication; AScreen: TScreen; AParent: TForm): TFrame;
begin
Application := App;
Screen := AScreen;
Result := TMyFrame.Create(Application);
Result.Parent := AParent;
end;
EXE
procedure TForm1.Button1Click(Sender: TObject);
type
TLoadFrame = function (App: TApplication; AScreen: TScreen; AParent: TForm): TFrame;
var
frm : TFrame;
DLLInstance : THandle;
LoadFrame : TLoadFrame;
begin
DLLInstance := LoadLibrary('project2.dll');
if DLLInstance = 0 then Exit;
@LoadFrame := GetProcAddress(DLLInstance, 'LoadFrame');
if @LoadFrame <> nil then
frm := LoadFrame (Application, Screen, Self)
end;
Скините пожалуйста работающий пример, где реалищовано создание фрайма из Dllе на форме в EXEшнике... а то срочно надо...
doma (2004-06-18 16:13:00) [2]Я разобрался в каком месте она не работает, но почему?
Я добавил
function CreateFrameProc (lPar : LPARAM; wPar : WPARAM) : integer;
var frm : TFrame;
begin
frm := TFrameClass(lPar).Create(Form1);
frm.Visible := false;
frm.ParentFont := false;
frm.Parent := form1;
Result := integer(frm);
if frm.Parent is TCustomForm then
frm.SetFocus; ------>>
end;
{----->>}
procedure TWinControl.SetFocus;
var
Parent: TCustomForm;
begin
Parent := GetParentForm(Self); ------>>
if Parent <> nil then
Parent.FocusControl(Self)
else if ParentWindow <> 0 then
Windows.SetFocus(Handle)
else
ValidParentForm(Self);
end;
{----->>}
function GetParentForm(Control: TControl): TCustomForm;
begin
while Control.Parent <> nil do Control := Control.Parent;
if Control is TCustomForm then { control.name = TForm1, но Control is TCustomForm = false}
Result := TCustomForm(Control) else
Result := nil;
end;
Может кто-то может это объяснить почему до SetFocus, Frame.Parent был TCustomForm, а после уже не TCustomForm?..
Amoeba (2004-06-18 14:40:00) [3]
> я не хочу переопределять TScreen и TAplication
Тогда оставайся при своих интересах...
doma (2004-06-18 14:09:00) [4]Это все понятно... но я не хочу переопределять TScreenи TAplication... Может все возможно моим способом??
clickmaker (2004-06-18 13:55:00) [5]DLL:
dpr
var
DLLApp: TApplication;
DLLScreen: TScreen;
{$R *.RES}
procedure DLLMain(dwReason: DWORD);
begin
case dwReason of
dll_Process_Attach :;
dll_Process_Detach :
begin
Application := DllApp;
Screen := DLLScreen;
end;
dll_Thread_Attach : {Statements here};
dll_Thread_Detach : {Statements here};
end;
end;
begin
DLLApp := Application;
DLLScreen := Screen;
DLLProc := @DLLMain;
end.
Unit
function LoadFrame(App: TApplication; AScreen: TScreen; AParent: TForm): TFrame;
begin
Application := App;
Screen := AScreen;
Result := TMyFrame.Create(Application);
Result.Parent := AParent;
end;
EXE
LoadLibrary
f := GetProcAddress(hLib, 'LoadFrame');
Frame := f(Application, Screen, Form1);