DLL + Form
9 отговора
319 прегледа
DLL + Form
Много интересен проблем:
Значи имам си една програмка с един прозорец и едно DLL пак с един прозорец, и давам на прозореца от DLL-то ParentWindow прозореца от EXE-то. И прозореца си влиза вътре (правил съм го и с EXE с два прозореца и всичко е ок), ама когато е от DLL тоя вътрешния прозорец престава да обслужва OnKeyDown за стрелките и vk_Tab (човек натиска TAB, а фокус-ректа не мръдва, с Edit-овете е същото).
Някой ако се сеща защо става това ? Или още по-добре как да го оправя ?
Значи имам си една програмка с един прозорец и едно DLL пак с един прозорец, и давам на прозореца от DLL-то ParentWindow прозореца от EXE-то. И прозореца си влиза вътре (правил съм го и с EXE с два прозореца и всичко е ок), ама когато е от DLL тоя вътрешния прозорец престава да обслужва OnKeyDown за стрелките и vk_Tab (човек натиска TAB, а фокус-ректа не мръдва, с Edit-овете е същото).
Някой ако се сеща защо става това ? Или още по-добре как да го оправя ?
Re: DLL + Form
При форми в DLL-и имаше една специфика, че трябва да си предадеш Application променливата като параметър когато извикваш DLL-a и след това в самия DLL да си я присвоиш, защото Application в DLL е nil.
Това правиш ли го ?
Това правиш ли го ?
runtime packages
Как компилираш? - Build with runtime packages
Имаше подобни ефекти при DLL с и без тази опция
Дали завиването на крушка е софтуерен проблем?
Имаше подобни ефекти при DLL с и без тази опция
Дали завиването на крушка е софтуерен проблем?
Ми
до колкото си спомням проблем има ако НЕ компилираш с Runtime Packages - даже си има и препоръка ако правиш Experts в DLL да ги build-ваш точно така. Имаше някакво тъпо ограничение за точно определено нещо - ама не мога да се сетя.
А за другия проблем - много лесно се разрешава с предаване на handle-а на приложението - точно това е решението.
---
Е т'ва е живот!
А за другия проблем - много лесно се разрешава с предаване на handle-а на приложението - точно това е решението.
---
Е т'ва е живот!
Re: Ми
Ако EXE-то и DLL-чето ги компилираш с Runtime Packages то тогава програмата няма да тръгне.
С Handle-то пробвах, пробвах и с цялата TApplication - не става :(
Проблема не е, че не мога да вкарам в действие TForm в DLL (ако дам ParentWindow:=0 на формата от DLL всичко си работи без проблеми, ама формата ми трябва вътре в тази от EXE-то - да изглежда, като едно цяло).
Ако някой се сеща нещо друго
, че напоследък от нерви започнах да сънувам DLL-чета
.
С Handle-то пробвах, пробвах и с цялата TApplication - не става :(
Проблема не е, че не мога да вкарам в действие TForm в DLL (ако дам ParentWindow:=0 на формата от DLL всичко си работи без проблеми, ама формата ми трябва вътре в тази от EXE-то - да изглежда, като едно цяло).
Ако някой се сеща нещо друго
Е дееее...
как така хората пишат plug-in engines а ти казваш че не може.
Ето ти един пример - не е най-добрия който съм виждал, но мисля, че работи.
------------------------------
Question/Problem/Abstract:
How to put forms into a DLL?
Answer:
Create a new Project. Define the following procedure type
TMyProc = procedure(App : TApplication; Scr : TScreen); stdcall;
In the "private" area of "TForm1" add
MyDLLHandle : THandle;
ShowMyModuleForm : TMyProc;
Add a "Form1.OnCreate" event and add this code to it:
MyDLLHandle:=LoadLibrary('Project2.DLL');
if MyDLLHandle<>0
then @ShowMyModuleForm:=GetProcAddress(MyDLLHandle,'ShowMyForm')
else ShowMyModuleForm:=nil;
Add a "Form1.OnDestroy" event and add this code to it
if Assigned(ShowMyModuleForm) then
ShowMyModuleForm:=nil;
if MyDLLHandle <> 0 then
FreeLibrary(MyDLLHandle);
MyDLLHandle:=0;
Now drop a "TButton" onto the form and add an "OnClick" event with this code
if (MyDLLHandle<>0) and (Assigned(ShowMyModuleForm)) then
ShowMyModuleForm(Application,Screen);
That's all for the EXE side. Create a new project (library project)
{$R *.res}
procedure ShowMyForm(App : TApplication; Scr : TScreen); stdcall;
var
a: TForm2;
begin
Application := App;
Screen := Scr;
a := TForm2.Create(Application.MainForm);
{"Application.MainForm" could also be "nil" or any valid value}
a.ShowModal;
a.Free;
end;
exports
ShowMyForm;
end.
Add to the "uses" clause "Forms". Add a new form unit to the project. In the
"Implementation" area of the form put:
var
OldApp : TApplication;
OldScr : TScreen;
initialization
OldApp := Application;
OldScr := Screen;
finalization
Screen := OldScr;
Application := OldApp;
end.
Put a "TButton" on the new form and set the "ModalResult" to "mrOk". Compile the
"dll" and the "exe". There's a sample form in DLL.
If you already have a form made that you want in the DLL just use it instead of
"TForm2". Make sure the "initialization" and "finalization" code is in one, and
only one, of the forms you put into the DLL. Without that code you may get
unexpected results.
---
Е т'ва е живот!
Ето ти един пример - не е най-добрия който съм виждал, но мисля, че работи.
------------------------------
Question/Problem/Abstract:
How to put forms into a DLL?
Answer:
Create a new Project. Define the following procedure type
TMyProc = procedure(App : TApplication; Scr : TScreen); stdcall;
In the "private" area of "TForm1" add
MyDLLHandle : THandle;
ShowMyModuleForm : TMyProc;
Add a "Form1.OnCreate" event and add this code to it:
MyDLLHandle:=LoadLibrary('Project2.DLL');
if MyDLLHandle<>0
then @ShowMyModuleForm:=GetProcAddress(MyDLLHandle,'ShowMyForm')
else ShowMyModuleForm:=nil;
Add a "Form1.OnDestroy" event and add this code to it
if Assigned(ShowMyModuleForm) then
ShowMyModuleForm:=nil;
if MyDLLHandle <> 0 then
FreeLibrary(MyDLLHandle);
MyDLLHandle:=0;
Now drop a "TButton" onto the form and add an "OnClick" event with this code
if (MyDLLHandle<>0) and (Assigned(ShowMyModuleForm)) then
ShowMyModuleForm(Application,Screen);
That's all for the EXE side. Create a new project (library project)
{$R *.res}
procedure ShowMyForm(App : TApplication; Scr : TScreen); stdcall;
var
a: TForm2;
begin
Application := App;
Screen := Scr;
a := TForm2.Create(Application.MainForm);
{"Application.MainForm" could also be "nil" or any valid value}
a.ShowModal;
a.Free;
end;
exports
ShowMyForm;
end.
Add to the "uses" clause "Forms". Add a new form unit to the project. In the
"Implementation" area of the form put:
var
OldApp : TApplication;
OldScr : TScreen;
initialization
OldApp := Application;
OldScr := Screen;
finalization
Screen := OldScr;
Application := OldApp;
end.
Put a "TButton" on the new form and set the "ModalResult" to "mrOk". Compile the
"dll" and the "exe". There's a sample form in DLL.
If you already have a form made that you want in the DLL just use it instead of
"TForm2". Make sure the "initialization" and "finalization" code is in one, and
only one, of the forms you put into the DLL. Without that code you may get
unexpected results.
---
Е т'ва е живот!
Re: Е дееее...
Значи всичко си работи (както винаги), но това е докато не направя формата SHOW (не SHOWMODAL) и дам на тая форма вътре в DLL-то ParentHandle например на един PANEL от формата от EXE-то.
И като си порових още към 30 часа разбрах, че съобщенията към двете форми идват в Application.OnMessage само в Application-а на EXE-то :(. Е в DLL-чето от време на време пускам втори Thread - съобщенията от него си пристигат в Application-a на DLL-чето (само от формата пристигат на грешно място)
Е като е така, как например Event-a onClick на например на бутона изобщо работи, а натискането на TAB не мести Focus рект-а.
За сега изпращам с функция цялата информация от Application.OnMessage към DLL-a, а там си вземам каквото ми трябва
Благодаря на всички, които си загубиха времето за да ми отговорят на въпроса


И като си порових още към 30 часа разбрах, че съобщенията към двете форми идват в Application.OnMessage само в Application-а на EXE-то :(. Е в DLL-чето от време на време пускам втори Thread - съобщенията от него си пристигат в Application-a на DLL-чето (само от формата пристигат на грешно място)
Е като е така, как например Event-a onClick на например на бутона изобщо работи, а натискането на TAB не мести Focus рект-а.
За сега изпращам с функция цялата информация от Application.OnMessage към DLL-a, а там си вземам каквото ми трябва
Благодаря на всички, които си загубиха времето за да ми отговорят на въпроса
Пробвай ...
с фреймове - това което правиш не е много чисто май (не съм сигурен, че точно това е решението). Може да се промени нещо - макар, че си закрепил положението. Мен също ме вълнува макар съм решил да ползвам един готов пакет за plug-in-и.
---
Е т'ва е живот!
---
Е т'ва е живот!
Re: Пробвай ...
Мога да направя компонентите директно в/у чуждата форма, ама фрейм не можах да сложа на чуждата форма.
Защо да не е чисто ? Ми то с Midi form и MidiChild май ставаше по същия начин.
Разгледах компонента TWebBrowser там пък не работят Cut и Copy (говоря за Delphi 5).
Защо да не е чисто ? Ми то с Midi form и MidiChild май ставаше по същия начин.
Разгледах компонента TWebBrowser там пък не работят Cut и Copy (говоря за Delphi 5).