Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Form nach SetParent wieder lösen (https://www.delphipraxis.net/50635-form-nach-setparent-wieder-loesen.html)

padavan 28. Jul 2005 18:34


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:
  windows.SetParent(findwindow(nil,PCHar('Form_Listview')),Form1.Handle);
Funktioniert auch wunderbar.
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:

Luckie 28. Jul 2005 18:37

Re: Form nach SetParent wieder lösen
 
Im PSDK steht auch nichts. Aber was passiert, wenn du 0 übergibst als Handle?

SirThornberry 28. Jul 2005 18:39

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;

padavan 29. Jul 2005 06:12

Re: Form nach SetParent wieder lösen
 
Leider hatte ich kein Glück mit

Delphi-Quellcode:
  windows.SetParent(findwindow(nil,PCHar('Form_Listview')),0);
Und wer das Handle vorher hatte, hab ich auch nicht rausbekommen, da mir der dafür passende Befehl noch nicht untergekommen ist..

Delphi-Quellcode:
  GetHandle(...
war so ein Ansatz bzw.

Delphi-Quellcode:
  GetParentHandle(...
Ein seltsamen Effekt hatte der Versuch mit 0 als Handle übergeben allerdings.
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:

marabu 29. Jul 2005 06:49

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:
procedure TMainForm.CaptureButtonClick(Sender: TObject);
begin
  with FloatingForm do
  if Assigned(Parent)
    then Parent := nil
    else Parent := self;
end;
Grüße vom marabu

SirThornberry 29. Jul 2005 08:04

Re: Form nach SetParent wieder lösen
 
SetParent liefert dir doch das vorherige Handle zurück

padavan 29. Jul 2005 08:37

Re: Form nach SetParent wieder lösen
 
aha,
gut, dann werde ich dass mal checken.


Vielen Dank für die schnellen Antworten
:hi:

chaosben 29. Jul 2005 12:55

Re: Form nach SetParent wieder lösen
 
Alternative probiers mit
Delphi-Quellcode:
SetParent(DeinFensterHandle,GetDesktopWindow());
MfG
Ben

SirThornberry 29. Jul 2005 13:10

Re: Form nach SetParent wieder lösen
 
desweiteren gibt es auch die Funktion GetParent

padavan 29. Jul 2005 17:01

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:
procedure zum Lösen
  windows.SetParent(findwindow(nil,PCHar('Form_Listview')),Handler);
Compilieren geht ohne gemecker, aber leider ohne Funktion leider noch nicht gegeben

marabu 29. Jul 2005 17:27

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

Robert_G 29. Jul 2005 17:29

Re: Form nach SetParent wieder lösen
 
Zitat:

Zitat von marabu
Hallo padavan,
du hast doch eine VCL application - warum musst du den Container-Wechsel unbedingt über das Win32 API versuchen?

Das frage ich mich schon die ganze Zeit...
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!)

padavan 29. Jul 2005 18:15

Re: Form nach SetParent wieder lösen
 
Ein Beispiel wäre hilfreich....
:roll:

marabu 29. Jul 2005 18:23

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

padavan 30. Jul 2005 12:41

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

padavan 30. Jul 2005 12:52

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:
begin
  with FloatingForm do
  if Assigned(Parent)
    then Parent := nil
    else Parent := self;
end;
Hab den Felher gemacht und es direkt in meinem Projekt ausprobiert, wahrscheinlich gab´s Seiteneffekte und deshalb ging´s nicht.

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!

marabu 30. Jul 2005 13:01

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.

padavan 30. Jul 2005 16:28

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:
  Form_listview.ParentWindow := Form1.Panel_listview.handle;
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.
Habe es mit deinem Codefragment versucht:
Delphi-Quellcode:
procedure TMainForm.CaptureButtonClick(Sender: TObject);
begin
  with FloatingForm do
  if Assigned(Parent)
    then Parent := nil
    else Parent := self;
end;
aber da springt dann die Form2 nur zwischen dem Panel in Form1 und der Form1 hin und her.

marabu 30. Jul 2005 19:12

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

padavan 30. Jul 2005 21:08

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

marabu 31. Jul 2005 13:35

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

padavan 1. Aug 2005 15:52

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 12:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz