Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
ВнизПопытка создать Frame из Dll... Найти похожие ветки
← →
doma (2004-06-18 13:29) [0]Не знаю, может что-то я делаю не так, но когда 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.
← →
clickmaker © (2004-06-18 13:55) [1]DLL:
dprvar
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.
Unitfunction LoadFrame(App: TApplication; AScreen: TScreen; AParent: TForm): TFrame;
begin
Application := App;
Screen := AScreen;
Result := TMyFrame.Create(Application);
Result.Parent := AParent;
end;
EXELoadLibrary
f := GetProcAddress(hLib, "LoadFrame");
Frame := f(Application, Screen, Form1);
← →
doma (2004-06-18 14:09) [2]Это все понятно... но я не хочу переопределять TScreen и TAplication... Может все возможно моим способом??
← →
Amoeba © (2004-06-18 14:40) [3]
> я не хочу переопределять TScreen и TAplication
Тогда оставайся при своих интересах...
← →
doma (2004-06-18 16:13) [4]Я разобрался в каком месте она не работает, но почему?
Я добавил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?..
← →
doma (2004-06-23 09:24) [5]Сделал я как мне посоветовали, но почему-то результат остался тот же все отлично скомпилировалось, создалось, но фрайм на форме не появился...
Вот мой исходник:
DLL:
dprvar
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.
Unitfunction LoadFrame(App: TApplication; AScreen: TScreen; AParent: TForm): TFrame;
begin
Application := App;
Screen := AScreen;
Result := TMyFrame.Create(Application);
Result.Parent := AParent;
end;
EXEprocedure 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шнике... а то срочно надо...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.046 c