Wiem, że coś podobnego było na forum, ale mi chodzi o coś więcej. Otóż mam bibliotekę DLL, a w niej jakiś formularz (Form1) i chodzi mi o to, żeby wywołać formularz z biblioteki w programie, ale tak, żebym miał nad nim większą kontrolę. Głównie chodzi mi o to, żebym mógł ustawić np. rodzica (Parent) dla tego formularza tak aby go można było wyświetlić, np. jako MDIChildForm dla Formularza głównego w programie lub też wyświetlić ten formularz w panelu lub ScrollBoxie.
w DLL:
procedure ShowForm(Parent:TComponent); stdcall;
begin
Form1:=TForm1.Create(Parent);
Form1.ShowModal;
Form1.Free;
end;
{ciąg dalszy}
exports
ShowForm name 'ShowForm'; // na przykład. Jak jeszcze jakieś funkcje to wiadomo, średnik w przecinek przechodzi
W module gdzie wyciągasz funkcję :
procedure ShowForm(Parent:TComponent); stdcall; external 'NazwaDll.dll' name 'ShowForm';
Można też tak:
W bibliotece DLL:
procedure ShowForm(Uchwyt: integer); stdcall;
begin
Form1:=TForm1.CreateParented(Uchwyt);
Form1.Show;
end;
{ciąg dalszy}
exports
ShowForm name 'ShowForm';
W programie:
procedure ShowForm(Uchwyt: integer); stdcall; external 'NazwaDll.dll' name 'ShowForm';
i dzięki temu możesz wyświetlić formularz gdzie tylko chcesz, np w panelu, scrollBoxie:
ShowForm(Panel1.Handle); // Formularz będzie wyświetlony w panelu
IMHO z MDI może być problem. Kiedyś się z tym bawiłem i coś nie wychodziło. Na pewno powinieneś "uwspólnić" obiekty Application i Screen, tak aby w dll'ce i w exe'ku były te same (najlepiej robić to w DLLProc, pamiętaj o ponownym ich przywróceniu). W każdym razie z tego co pamiętam, na końcu jak wszystko wydawało się już działać rozbiłem się o błąd "Cannot Assign TFont to a TFont ..." lub coś takiego. Próbowałem też z bpl'ami, ale się okazało że TDE, ma jakieś ograniczenia w tej materii : (
Ostatnio coś czytałem, nie pamiętam czy to dotyczyło właśnie tego, że w jakimś unicie (może Controls.pas) jest zmienna globalna (coś jakoś ControlAtom), której trzeba nie inicjować w dll'ce, ale dokładnie nie pamiętam. Jak poszukam to dam linka.
// eh, a kiedyś sobie z tym nie poradziłem ...