Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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:

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.032 c
1-1088096196
rOOse
2004-06-24 20:56
2004.07.11
Использование реестра


14-1088146812
Kolyan
2004-06-25 11:00
2004.07.11
Pungvini Rulyat!!!!


3-1086959724
TUser
2004-06-11 17:15
2004.07.11
Что это за файлы?


1-1088082762
Maks Realov
2004-06-24 17:12
2004.07.11
Моргание при перересовки с помощью ScanLine


14-1087955709
Думкин
2004-06-23 05:55
2004.07.11
С днем рождения! 23 июня





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский