![]() |
Form nach SetParent wieder lösen
Guten Abend Delphianer,
ich habe ein Hauptformular auf welchem ich bei Bedarf ein weiteres Fenster öffnen kann. Ich möchte ein Feature programmieren, dass dieses zweite Fenster in meinem Hauptformular gefangen ist, oder bei Bedarf auch gelöst werden kann. Das Fangen habe ich so realisiert:
Delphi-Quellcode:
Funktioniert auch wunderbar.
windows.SetParent(findwindow(nil,PCHar('Form_Listview')),Form1.Handle);
Hehe, jetzt weiß ich nur nicht, wie das Formular (welches übrigens zur Laufzeit erst generiert wird) wieder aus meinem Hauptformular lösen kann und es quasi wieder an den Desktop übergebe. Hat jemand ne Idee? :gruebel: |
Re: Form nach SetParent wieder lösen
Im PSDK steht auch nichts. Aber was passiert, wenn du 0 übergibst als Handle?
|
Re: Form nach SetParent wieder lösen
schau doch einfach mal was der parent ist bevor du ihn neu setzt.
Desweiteren kannst du auch einfach machen
Delphi-Quellcode:
FormListView.Parent := Form1;
|
Re: Form nach SetParent wieder lösen
Leider hatte ich kein Glück mit
Delphi-Quellcode:
Und wer das Handle vorher hatte, hab ich auch nicht rausbekommen, da mir der dafür passende Befehl noch nicht untergekommen ist..
windows.SetParent(findwindow(nil,PCHar('Form_Listview')),0);
Delphi-Quellcode:
war so ein Ansatz bzw.
GetHandle(...
Delphi-Quellcode:
Ein seltsamen Effekt hatte der Versuch mit 0 als Handle übergeben allerdings.
GetParentHandle(...
Nachdem ich das Versucht hatte und feststelle, dass es nicht funzt, habe ich den urspünglichen Zustand wiederhergestellt. Leider ohne Erfolg, jetzt ließ sich das 2te Formular gar nicht fangen. Eigenartig, oder? Hab dann langsam an meinem Verstand gezweifelt und es mit einem anderen Formular versucht, welches ich Testweise erzeugt hab - damit ging´s. Aber das, welchem ich 0 übergeben hab, dass will sich nicht mehr fangen lassen :wall: |
Re: Form nach SetParent wieder lösen
Hallo padavan,
wenn es nur um das Einfangen und Freigeben geht, dann würde ich das so machen:
Delphi-Quellcode:
Grüße vom marabu
procedure TMainForm.CaptureButtonClick(Sender: TObject);
begin with FloatingForm do if Assigned(Parent) then Parent := nil else Parent := self; end; |
Re: Form nach SetParent wieder lösen
SetParent liefert dir doch das vorherige Handle zurück
|
Re: Form nach SetParent wieder lösen
aha,
gut, dann werde ich dass mal checken. Vielen Dank für die schnellen Antworten :hi: |
Re: Form nach SetParent wieder lösen
Alternative probiers mit
Delphi-Quellcode:
MfG
SetParent(DeinFensterHandle,GetDesktopWindow());
Ben |
Re: Form nach SetParent wieder lösen
desweiteren gibt es auch die Funktion GetParent
|
Re: Form nach SetParent wieder lösen
leider kein Glück bisher.
Als erstem mal weiß ich jetzt weshalb des SetParent auf einmal nicht mehr ging. Nach dem ich 0 übergeben hab, als Versuch die Form_listview wieder zu lösen, war auf einmal die Caption gelöscht, das heißt die Form hatte keinen Namen mehr und wurde deshalb auch nicht mehr gefunden. Ich hab die Caption wieder eingeben, aber vergebens, wird wieder gelöscht. Dann hab ich´s zur Laufzeit zugewiesen immer direkt vor SetParent --> dann gings. ABER: Mein ursprüngliches Problem hab ich immernoch nicht lösen können. Habe folgendes Versucht:
Delphi-Quellcode:
var Handler: HWND //global
Delphi-Quellcode:
procedure zum Fangen
Handler := Windows.GetParent(findwindow(nil,PChar('Form_Listview'))); windows.SetParent(findwindow(nil,PCHar('Form_Listview')),Panel_Listview.Handle);
Delphi-Quellcode:
Compilieren geht ohne gemecker, aber leider ohne Funktion leider noch nicht gegeben
procedure zum Lösen
windows.SetParent(findwindow(nil,PCHar('Form_Listview')),Handler); |
Re: Form nach SetParent wieder lösen
Hallo padavan,
du hast doch eine VCL application - warum musst du den Container-Wechsel unbedingt über das Win32 API versuchen? Windows.SetParent() ist nicht ganz dasselbe wie TForm.SetParent(), in der VCL werden da schon noch ein paar Dinge mehr abgewickelt, als bloß ein Handle einzusenden. Die VCL-konforme Lösung hatte ich dir ja schon gegeben. marabu |
Re: Form nach SetParent wieder lösen
Zitat:
Vor allem ist das Suchen eines Fensters nach Namen IMHO nicht sehr schlau, da dir da alles Mögliche unterkommen kann, das genauso heißt. ;) (Zum Beispiel ein Form aus einer anderen Instanz deiner App!) |
Re: Form nach SetParent wieder lösen
Ein Beispiel wäre hilfreich....
:roll: |
Re: Form nach SetParent wieder lösen
Wenn dir mein Beispiel von Heute 07:49 Uhr nicht gefällt, dann sag einfach warum nicht und die kriegst ein Neues.
marabu |
Re: Form nach SetParent wieder lösen
Na weil ich´s nicht gebacken bekommen hab.
:pale: Habe dein Codefragment offenbar nicht richtig umsetzen können.... Ich versuch´s aber nochmal. Es ist wahrscheinlich genau das, was ich suche. Zu der Frage oder den Hinweisen die sich wunderten, weshalb ich dieses Problem mit SetParent versucht hatte --> da ich es nicht besser wusste. Danke |
Re: Form nach SetParent wieder lösen
Ich nochmal
Weiß gar nicht, was es da nicht zu verstehen gab. Hab´s eben nochmal probiert und es klappte auf anhieb. procedure TMainForm.CaptureButtonClick(Sender: TObject);
Delphi-Quellcode:
Hab den Felher gemacht und es direkt in meinem Projekt ausprobiert, wahrscheinlich gab´s Seiteneffekte und deshalb ging´s nicht.
begin
with FloatingForm do if Assigned(Parent) then Parent := nil else Parent := self; end; Ich wollte die zweite Form halt in einem Panel fangen, welches auf der ersten Form liegt, damit die Reihenfolge der Komponenten, welche ich festgelegt habe auch weiterhin eingehalten wird. Das heißt, die eingefange Form2 soll dann unter umständer nicht im Vordergrund auf Form1 liegen, je nach Zustand. Also vielen Dank nochmal! |
Re: Form nach SetParent wieder lösen
Hallo padavan,
die VCL-Lösung ist wirklich einfach. Du kannst sie noch um das eine oder andere feature aufpeppen, wie z.B. Sicherstellung der Sichtbarkeit, Beschränkung auf die client area vom parent, Rahmen wegnehmen beim Einfangen, etc. Der Code gehört in das Action-Element, mit dem du dann das Einfangen und Lösen der form steuern willst. Die action kannst du dann mit einem button oder menuItem auslösen. Wenn du noch Probleme hast, gib ein Zeichen. Freundliche Grüße vom marabu Habe ich jetzt wirklich 10 Minuten für diese paar Zeilen gebraucht? Naja, ich lass den Text mal so stehen, vielleicht ist er ja auch interesant für dich. |
Re: Form nach SetParent wieder lösen
Vielen Dank das du mir nochmal Hilfe anbietest...
(ein unangenehmes Gefühl, wenn man ständig nerven muss.....) Das einzige was mir jetzt noch fehlt ist, dass ich die 2te Form in eine Panel auf der 1ten Form fangen kann. Das hab ich jetzt mal so versucht:
Delphi-Quellcode:
Aber genau wie bei der SetParent-Sache hab ich auch hier wieder keine Ahnung wie ich´s wieder lösen kann und quasi dem Desktop übergeben kann.
Form_listview.ParentWindow := Form1.Panel_listview.handle;
Habe es mit deinem Codefragment versucht:
Delphi-Quellcode:
aber da springt dann die Form2 nur zwischen dem Panel in Form1 und der Form1 hin und her.
procedure TMainForm.CaptureButtonClick(Sender: TObject);
begin with FloatingForm do if Assigned(Parent) then Parent := nil else Parent := self; end; |
Re: Form nach SetParent wieder lösen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo padavan,
in diesem Forum eine Frage zu stellen muss niemandem unangenehm sein. Du nervst auch nicht. Nerven geht anders... Im Anhang findest du ein Demo-Projekt, bei dem eine MainForm eine FloatingForm einfängt und auf einem Panel festsetzt. Ich hatte dir schon im letzten Beitrag angedeutet, dass es da vielleicht noch ein paar Dinge zu regeln gibt. Unter anderem willst du gewiss nicht, dass deine Form nach dem Einfangen unsichtbar ist, weil z.B. FloatingForm.Top größer als PinPanel.Height ist... Schau es dir einfach mal an. Wenn du irgendwas nicht verstehst, dann kann es auch ein Fehler von mir sein. Im Zweifelsfalle einfach nachfragen. Und bedenke es ist nur eine Demo. Aus meiner Sicht fehlt noch Vieles. marabu |
Re: Form nach SetParent wieder lösen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo marabu,
Mensch, du hast dich ja ganz schön ins Zeug gelegt. Auf jeden Fall hab auch ich´s jetzt begriffen. Vielen Dank nochmal Falls du mal sehen möchtest, wozu es gut war einfach mal den Anhang runterladen und den Dreamplayer starten. Wenn du dann ein paar Titel reingeladen hast (oben links) kannst du mit dem Button "TAGList" (rechts unten klein und unscheinbar) "deine Starthilfe" bewundern. Gruß Padavan PS: Das Ding ist nicht sonderlich ausgereift, bin noch ein ziemlicher Anfänger, deshalb auch nicht über die gigantisch hohe Versionsnummer wundern :-D |
Re: Form nach SetParent wieder lösen
Hallo padavan,
du hast in deinen Player bestimmt schon einiges an Arbeit rein gesteckt und, soweit ich das erkennen kann, wirst du auch noch einige Zeit brauchen um alle Ecken und Kanten abzurunden. Ich wünsche dir Ausdauer und Erfolg für dein Projekt. marabu |
Re: Form nach SetParent wieder lösen
Hallo marabu,
du hast recht, dass ist eine ewige offene Baustelle und sie dient nur zu einem Zweck, nämlich Delhpi zu erlernen. Da ich von Berufs wegen "leider" nur Speicher programmierbare Steuerungen und der gleichen Programmiere ist das leider nur Eigeninteresse. :cry: Viele Grüße Padavan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz