Ładowanie Formy z biblioteki dll i ustawianie rodzica

0

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.

0

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';
0

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
0

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 ...

http://www.zaoxue.com/article/tech-57739.htm

1 użytkowników online, w tym zalogowanych: 0, gości: 1