Autor Beitrag
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win XP
D3
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: So 10.09.06 21:08 
Hallo,

erstmal Danke für die Antwort :)

user profile iconCarl 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:

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
cracky03
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21

Win 98 Win xp

BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Mo 11.09.06 11:17 
Hallo,
user profile iconcracky03 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:

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Lannes Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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:
ausblenden 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
    { Public-Deklarationen }
    procedure WndProc(var Msg: TMessage);override;
//...
procedure TForm1.WndProc(var Msg: TMessage);
var aPoint : TPoint;
    aControl : TControl;
begin
  if (Msg.Msg = WM_LBUTTONDOWN) or //Maus im Clientbereich der Form
     ((Msg.Msg = WM_PARENTNOTIFY) and (Msg.WParam = WM_LBUTTONDOWN)) or//wg. Panels u.s.w
     (Msg.Msg = WM_NCLBUTTONDOWN) then//Klick auf Titelleiste und Menü
     if TreeView1.Visible then
       begin
       aPoint.x := (Msg.LParam and $FFFF);
       aPoint.y := ((Msg.LParam shr 16and $FFFF);
       //wenn Klick außerhalb TreeView
       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 )