Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Komponente bei Aktion verbergen
Lannes - So 10.09.06 14:03
Titel: Komponente bei Aktion verbergen
Hallo,
ich möchte ein TreeView als DropDownfeld einer ComboBox benutzen.
Angezeigt wird das TreeView durch das OnDropDown-Event, kein Problem, die ComboBox hat 0 Einträge.
Wie kann ich am besten das Verbergen des TreeView steuern?
Mit MouseLeave allein funktioniert es nicht, denn wenn die Maus nicht über das TreeView gezogen wird, kann die Maus das TreeView auch nicht verlassen. Und OnExit des Treeview wird nicht ausgelöst wenn man z.B. auf die Form klickt.
Ich brauche ein ähnliches Verhalten wie es die ComboBox zeigt.
Das DropDownfeld bleibt so lange sichtbar bis man entweder einen Eintrag wählt oder außerhalb der ComboBox klickt.
Wäre schön wenn mir jemand einen Weg in die richtige Richtung zeigen könnte.
Carl Johnson - So 10.09.06 18:47
Ich hoffe, ich habe das richtig verstanden?!
Du möchtest das TreeView-Objekt verschwinden lassen, wenn der Benutzer den Mauszeiger auf einem anderem Bereich des Formulars bewegt.Ich hätte da einen (etwas prozessorlastigen, aber bei heutigen Rechnern nicht der Rede werten) Vorschlag: Bau doch bei dem OnMouseMove-Ereignis des Formulars(oder auch bei anderen Komponenten) den Hide-Befehl ein. Dass kannst du dann auch bei OnClick-Ereignissen machen. Ist etwas umständlich, sollte aber seinen Zweck erfüllen. Was simpleres fällt mir leider auch nicht ein.
Ich hoffe, du kannst damit was anfangen.
Lannes - So 10.09.06 20:08
Hallo,
erstmal Danke für die Antwort :)
Carl Johnson hat folgendes geschrieben: |
Ich hoffe, ich habe das richtig verstanden?!
Du möchtest das TreeView-Objekt verschwinden lassen, wenn der Benutzer den Mauszeiger auf einem anderem Bereich des Formulars bewegt. |
nicht so ganz.
Es soll dann verschwinden, wenn ein Eintrag gewählt wurde oder außerhalb des Treeview geklickt wird, also so wie das Verhalten einer Combobox.
Hab es jetzt mit einer Kombination aus OnExit des TreeView und OnClick-Events des Formulars und der Panels versucht.
Aber das ist keine Lösung, denn OnExit wird ja nur dann ausgelöst wenn ein anderes Control den Focus bekommt.
Also müsste ich dann Menüs, Speedbuttons usw. auch noch über OnClick-Events in die Geschichte einbinden.
Dazu kommt noch das OnClick der Form nicht ausgelöst wird wenn man auf die Titel-Leiste klickt. u.s.w. ...
Muss mir mal den Quellcode zur ComboBox ausgiebig anschauen, eventuell komm ich dann weiter :lupe:
cracky03 - Mo 11.09.06 03:21
Im on-click-ereignis des Formulars, dann hast du das erreicht, dass wenn du es "wegklickst", also neben die treeview klickst, ein ereignis ausgelöst wird.
ich habs jetzt nicht getestet, aber normalerweise dürfte on-click des formulars beim klicken auf die treeview selbst nicht ausgelöst werden.
aber selbst wenn, du willst ja eigentlich dass sie bei jedem klick verschwindet (entweder auswählen, oder danebenklicken) ----> jeder klick ;-)
wenn du damit nicht zufreiden bist, dann nimm trotzdem das on-click des Formulars, dort werden dir die maus-koordinaten zurückgegeben, überprüf mit einer if-abfrage ob sie in den koordinaten der treeview liegen und lass das ding demetnsprechend verschwinden.
Grüße, cracky
Lannes - Mo 11.09.06 10:17
Hallo,
cracky03 hat folgendes geschrieben: |
| ... aber normalerweise dürfte on-click des formulars beim klicken auf die treeview selbst nicht ausgelöst werden... |
das ist richtig und ist gleichzeitig das Problem :wink:
Das OnClick-Ereignis der Form wird nur ausgelöst wenn ich auf den freien Bereich der Form klicke.
Aber Du hast mich da auf eine Idee gebracht.
Hab dem TreeView jetzt eine eigene Form mit Borderstyle bsNone verpasst.
Diese Form wird aufgerufen bei OnDropDown der Combobox, klicke ich jetzt neben das Treeview(Form2) wird OnActivate der Form1 ausgelöst und darin Form2 mit dem TreeView geschlossen.
Ist noch nicht ganz optimal, denn die Titelleiste der Form1 wird dabei deaktiviert.
Wenn noch jemand eine Idee hat, immer her damit :wink:
Lannes - Mo 11.09.06 14:20
Hallo,
hab es jetzt ohne eine zweite Form gelöst.
Durch überschreiben der WndProc und abfangen der linken Maustaste außerhalb des TreeView:
Delphi-Quelltext
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:
| public procedure WndProc(var Msg: TMessage);override; procedure TForm1.WndProc(var Msg: TMessage); var aPoint : TPoint; aControl : TControl; begin if (Msg.Msg = WM_LBUTTONDOWN) or ((Msg.Msg = WM_PARENTNOTIFY) and (Msg.WParam = WM_LBUTTONDOWN)) or (Msg.Msg = WM_NCLBUTTONDOWN) then if TreeView1.Visible then begin aPoint.x := (Msg.LParam and $FFFF); aPoint.y := ((Msg.LParam shr 16) and $FFFF); if (aPoint.x <= TreeView1.Left) or (aPoint.x >= TreeView1.Left+TreeView1.Width) or (aPoint.y <= TreeView1.Top) or (aPoint.y >= TreeView1.Top+TreeView1.Height) then TreeView1.Visible := False; end; inherited; end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!