Autor |
Beitrag |
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: So 10.09.06 15:03
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.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Carl Johnson
      
Beiträge: 19
Win XP
D3
|
Verfasst: So 10.09.06 19: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 
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: So 10.09.06 21: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 
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
cracky03
      
Beiträge: 21
Win 98 Win xp
|
Verfasst: Mo 11.09.06 04: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 
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Mo 11.09.06 11: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
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 
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Lannes 
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Mo 11.09.06 15: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; |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
|