Autor |
Beitrag |
Nerzhul
      
Beiträge: 20
|
Verfasst: Fr 30.04.04 10:04
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
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: 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
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: 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.
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
JoelH
      
Beiträge: 806
Erhaltene Danke: 17
Win10
Delphi Alexandria 11.2 Patch 1
|
Verfasst: Fr 30.04.04 11:26
Titel: hmm,
dieses Tutorial hat mir geholfen TTreeView zu verstehen
users.iafrica.com/d/...eeView/TreeView.html
sehr instructiv und wenn man die Beispielprogramme ausführt dann fällt es einem meist wie Schuppen von den Augen.
_________________ mfg. Joel
|
|
Nerzhul 
      
Beiträge: 20
|
Verfasst: 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
      
Beiträge: 806
Erhaltene Danke: 17
Win10
Delphi Alexandria 11.2 Patch 1
|
Verfasst: 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.
_________________ mfg. Joel
|
|
Nerzhul 
      
Beiträge: 20
|
Verfasst: 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
      
Beiträge: 806
Erhaltene Danke: 17
Win10
Delphi Alexandria 11.2 Patch 1
|
Verfasst: 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 = 2) then begin stg_zahlungsanweisungen.showhint := true; stg_zahlungsanweisungen.hint := hintliste[MyRow].mandant; if oldhint <> stg_zahlungsanweisungen.Hint then Application.cancelhint; end; if (Mycol = 3) then begin stg_zahlungsanweisungen.showhint := true; stg_zahlungsanweisungen.hint := hintliste[MyRow].werbeart; if oldhint <> stg_zahlungsanweisungen.Hint then Application.cancelhint; end; if (Mycol > 3) AND (Mycol < 2) then stg_zahlungsanweisungen.showhint := false; end; |
_________________ mfg. Joel
|
|
Nerzhul 
      
Beiträge: 20
|
Verfasst: Fr 30.04.04 16:41
Danke, du hast mir sehr geholfen! Jetzt funktioniert alles wie geplant
-M
|
|