Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.11;
Скачать: CL | DM;

Вниз

Попытка создать 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:

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);


 
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:

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шнике... а то срочно надо...



Страницы: 1 вся ветка

Текущий архив: 2004.07.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.054 c
14-1088073999
Gashek
2004-06-24 14:46
2004.07.11
Сервер-сокет


1-1087796493
ПсихЪ
2004-06-21 09:41
2004.07.11
Функции из DCU


14-1087761409
Yegorchic
2004-06-20 23:56
2004.07.11
Принтер и цвет...


14-1087541399
Layner
2004-06-18 10:49
2004.07.11
Что делает наша наука? НИИ?


4-1085669490
Raul
2004-05-27 18:51
2004.07.11
кто нибудь подскажите варианты многострочного PopupMenu