moklok hat folgendes geschrieben : |
sobald du die dll einbindest kannst du dann irgendwann gewuenschten fensterobjektzeiger an die dll uebergeben |
Vorsicht, der Speichermanager der DLL ist nicht der des Hauptprogramms. Deshalb ist es keine gute Idee ein Objekt an die DLL zu übergeben.
Rein mit der API-Funktion SetParent wird das aber glaube ich auch nicht gehen, weil dein Control dann für Delphi kein Parent hat. Die saubere Variante ist, der DLL eine Möglichkeit anzubieten wie sie etwas anzeigen kann oder über die Windows API zu gehen.
Die schnelle und nicht so saubere Lösung ist ein neues Formular auf das andere zu setzen... So ungefähr, ungetestet und es fehlt die Freigabe des Formulars:
YourDLL.dll
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| library YourDLL;
uses Forms, Windows, SysUtils, Classes, StdCtrls;
procedure Test(AHandle: Cardinal); stdcall; var NewLabel: TLabel; NewForm: TForm; begin NewForm := TForm.Create(nil); NewForm.BorderStyle := bsNone; NewLabel := TLabel.Create(NewForm); NewLabel.Caption := 'Test'; NewLabel.Name := 'NewEdit'; NewLabel.Parent := NewForm; NewLabel.SetBounds(10, 10, 100, 30); NewLabel.Visible := True; SetParent(NewForm.Handle, AHandle); NewForm.SetBounds(10, 10, 200, 200); NewForm.Visible := True; end;
exports Test;
begin end. |
YourUnit.pas
1: 2: 3: 4: 5: 6:
| procedure Test(AHandle: Cardinal); stdcall; external 'YourDLL.dll';
procedure TYourForm.Anything... begin Test(Handle); end; |