Entwickler-Ecke
Windows API - Komponente im fremden Fenster erstellen
Tropby - Di 09.08.11 21:49
Titel: Komponente im fremden Fenster erstellen
Hallo zusammen,
ich habe im moment ein Problem bei dem ich garnicht weiß ob das überhaupt lösbar ist.
Ich habe eine DLL - Erstellt die in ein Programm eingebunden wird und da einige Steueraufgaben übernimmt. Jetzt möchte ich noch eine Anzeige machen. Dabei kam ich auch die tolle Idee, dass ich doch die Anzeige in dem schon vorhandenen Fenster machen könnte der Anwendung.
Dieses Vorhanden hat sich dann als schwiriger als erwartet herausgestellt. Ich bekomme zwar den Fenster-Handle aber ich weiß nicht wie ich da jetzt eine Anzeige machen soll. Gibt es da irgendwie eine Möglichkeit? oder muss ich mir da was anderes ausdenken? Es muss doch wohl irgendwie möglich sein, da was drauf zu bekommen :-/
Vielleicht hat von euch ja jemand eine Idee wie das gehen könnte.
mfg
Tropby
moklok - Mi 10.08.11 01:38
hallo,
du kannst in deiner dll ein TPanel erstellen und deine anzeige auf diesem panel platzieren... sobald du die dll einbindest kannst du dann irgendwann gewuenschten fensterobjektzeiger an die dll uebergeben, die dann die parent-eigenschaft des panels auf dieses fenster setzt. und dann sollte dein panel auf dem fenster erscheinen...
lg
jaenicke - Mi 10.08.11 06:11
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; |
Tropby - Mi 10.08.11 21:41
Danke super das Funktioniert. Jetzt nur noch was um das ganze weider frei zu geben und ich habs.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!