Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - TreeView-Focus und aktueller Knoten


Nerzhul - Fr 30.04.04 10:04
Titel: TreeView-Focus und aktueller Knoten
Hallo,

Ich habe zur TTreeView-Komponente zwei Fragen:

1) Wie stelle ich fest, über welchem Knoten eines TreeViews sich die Maus gerade befindet [z.B. im OnClick-Ereignis]?

2) Das aktuell ausgewählte Element eines Baums wird ja blau hinterlegt, aber nur wenn der TreeView auch den Focus hat. Sobald ein anderes Steuerelement angeklickt wird verschwindet die blaue Markierung. Gibt es eine Möglichkeit, diese beizubehalten auch wenn der TreeView den Focus verliert?

Danke,

-M


iKilledKenny - Fr 30.04.04 10:54

zu 1)
benutze nicht OnClick,sondern OnMouseDown/Up, das gibt dir X,Y-coordinaten der mouse mit. dann mit TTreeNode.DisplayRect prüfen, ob die maus drüber war.

zu 2)
die treeview hat eine property HideSelection, stell die doch mal auf false...

viele grüße
alex


smiegel - Fr 30.04.04 10:58

Hallo,

der Treeview verfügt u.a. noch über das Ereignis OnChange. Das wird auch ausgelöst, wenn Du mit der Maus einen Eintrag selektierst. Im OnChange-Ereignis bekommst Du den aktuell ausgewählten TreeNode übergeben.


JoelH - Fr 30.04.04 11:26
Titel: hmm,
dieses Tutorial hat mir geholfen TTreeView zu verstehen

http://users.iafrica.com/d/da/dart/zen/Articles/TTreeView/TreeView.html

sehr instructiv und wenn man die Beispielprogramme ausführt dann fällt es einem meist wie Schuppen von den Augen.


Nerzhul - Fr 30.04.04 11:40

Hallo,

Erstmal Danke für die Antworten. Frage 2 hat sich mit HideSelection (fast) erledigt. Der gewählte Knoten erscheint jetzt grau hinterlegt wenn der TreeView den Focus verliert ... gibt es da vielleicht eine Möglichkeit, die Farbe zu ändern?

Zu Frage 1 ... ich hab mich vielleicht etwas unklar ausgedrückt ... also, ich möchte darauf reagieren, wenn die Maus über einer TreeNode ist [so wie es der TreeView selbst auch tut wenn die HotTrack-Eigenschaft auf True ist], und einen entsprechenden Hint anzeigen [der z.B. einen String aus dem Data-Teil der Node anzeigt]. Wie gehe ich da am besten vor?

Danke,

-M


JoelH - Fr 30.04.04 11:48
Titel: hmm,
das solltest du am besten via des OnMouseMove Events rausbekommen. Einfach die X/Y Koordinate umrechnen und du kommst zum aktuellen Knoten.


Nerzhul - Fr 30.04.04 14:40

Ok, Danke :-) Mit der DisplayRect-Eigenschaft der Node und der aktuellen Mausposition im MouseMove-Ereignis funktioniert das schonmal ganz gut. Ich kann dann mittels PtInRect feststellen, ob der Zeiger über einem bestimmten Knoten ist.

Aber wie zeige ich jetzt individuelle Hint-Texte an?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if PtInRect(TreeView1.Items.GetFirstNode.DisplayRect(TRUE), Point(X, Y)) then
 begin
  TreeView1.Hint := 'blabla';
 end
else
 begin
  TreeView1.Hint := '';
 end;


Funktioniert zwar, aber zeigt nur den "aktuellen" Hint-Text an. D.h. wenn ich mit der Maus auf das erste Element des Baumes gehe wird zwar der 'blabla'-Hint angezeigt, aber er verschwindet nicht wenn ich über einen anderen Knoten fahre [sondern erst wenn die Maus den TreeView-Bereich verlässt]. Hat jemand ne Idee? :-)

Danke,

-M


JoelH - Fr 30.04.04 14:52
Titel: hmm,
so mach ich dass bei einem Stringgrid, sollte aber leicht zur Treeveiw konvertiert werden können

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:
procedure Tfrm_mdi_anstehendeANfSchreiben.stg_ZahlungsanweisungenMouseMove(
  Sender: TObject; Shift: TShiftState; X, Y: Integer);

var MyCol, MyRow : integer;
    oldhint : string;
begin
  oldhint := stg_zahlungsanweisungen.hint;
  stg_zahlungsanweisungen.MouseToCell(x, y, MyCol, MyRow);
    if (Mycol = 2then
    begin
      stg_zahlungsanweisungen.showhint := true;
      stg_zahlungsanweisungen.hint := hintliste[MyRow].mandant;
      if oldhint <> stg_zahlungsanweisungen.Hint then Application.cancelhint;
    end;
    if (Mycol = 3then
    begin
      stg_zahlungsanweisungen.showhint := true;
      stg_zahlungsanweisungen.hint := hintliste[MyRow].werbeart;
      if oldhint <> stg_zahlungsanweisungen.Hint then Application.cancelhint;
    end;
    if (Mycol > 3AND (Mycol < 2then
      stg_zahlungsanweisungen.showhint := false;
end;


Nerzhul - Fr 30.04.04 16:41

Danke, du hast mir sehr geholfen! Jetzt funktioniert alles wie geplant :-)

-M