DLL + Form

9 отговора 319 прегледа
#1

DLL + Form

Много интересен проблем:
Значи имам си една програмка с един прозорец и едно DLL пак с един прозорец, и давам на прозореца от DLL-то ParentWindow прозореца от EXE-то. И прозореца си влиза вътре (правил съм го и с EXE с два прозореца и всичко е ок), ама когато е от DLL тоя вътрешния прозорец престава да обслужва OnKeyDown за стрелките и vk_Tab (човек натиска TAB, а фокус-ректа не мръдва, с Edit-овете е същото).
Някой ако се сеща защо става това ? Или още по-добре как да го оправя ?

Отговор
в отговор на Mave_rick #2

Re: DLL + Form

При форми в DLL-и имаше една специфика, че трябва да си предадеш Application променливата като параметър когато извикваш DLL-a и след това в самия DLL да си я присвоиш, защото Application в DLL е nil.

Това правиш ли го ?

Отговор
в отговор на Mave_rick #3

runtime packages

Как компилираш? - Build with runtime packages

Имаше подобни ефекти при DLL с и без тази опция

Дали завиването на крушка е софтуерен проблем?
Отговор
в отговор на Eventer #4

Ми

до колкото си спомням проблем има ако НЕ компилираш с Runtime Packages - даже си има и препоръка ако правиш Experts в DLL да ги build-ваш точно така. Имаше някакво тъпо ограничение за точно определено нещо - ама не мога да се сетя.
А за другия проблем - много лесно се разрешава с предаване на handle-а на приложението - точно това е решението.

---
Е т'ва е живот!
Отговор
в отговор на Dark_Dirk #5

Re: DLL + Form

Не става (правя го и пак същото).

Отговор
в отговор на PhantomAS #6

Re: Ми

Ако EXE-то и DLL-чето ги компилираш с Runtime Packages то тогава програмата няма да тръгне.
С Handle-то пробвах, пробвах и с цялата TApplication - не става :(
Проблема не е, че не мога да вкарам в действие TForm в DLL (ако дам ParentWindow:=0 на формата от DLL всичко си работи без проблеми, ама формата ми трябва вътре в тази от EXE-то - да изглежда, като едно цяло).
Ако някой се сеща нещо друго , че напоследък от нерви започнах да сънувам DLL-чета .

Отговор
в отговор на Mave_rick #7

Е дееее...

как така хората пишат 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.

---
Е т'ва е живот!
Отговор
в отговор на PhantomAS #8

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, а там си вземам каквото ми трябва

Благодаря на всички, които си загубиха времето за да ми отговорят на въпроса

Отговор
в отговор на Mave_rick #9

Пробвай ...

с фреймове - това което правиш не е много чисто май (не съм сигурен, че точно това е решението). Може да се промени нещо - макар, че си закрепил положението. Мен също ме вълнува макар съм решил да ползвам един готов пакет за plug-in-и.

---
Е т'ва е живот!
Отговор
в отговор на PhantomAS #10

Re: Пробвай ...

Мога да направя компонентите директно в/у чуждата форма, ама фрейм не можах да сложа на чуждата форма.
Защо да не е чисто ? Ми то с Midi form и MidiChild май ставаше по същия начин.
Разгледах компонента TWebBrowser там пък не работят Cut и Copy (говоря за Delphi 5).

Отговор