Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо