![]() |
Treeview onclick
:hi: Hallo,
ich arbeite momentan an einem Programm mit einer TreeView. Der Inhalt dieser TreeView steht schon beim Kompilieren fest und wird sich auch beim Ausführen des Programmes nicht ändern. Jetzt meine Frage: Wie kann ich Onclick abfragen, was geklickt wurde. Wenn man auf Hilfe klicken soll (Beispiel 3. Item) soll irgendetwas passieren. Wie kann ich das abfragen? Danke schon im Vorraus |
Re: Treeview onclick
Hallo Christopher,
schau mal in die Online-Hilfe unter dem Thema TTreeView.OnChange. Wenn du auch mit der rechten Maustaste arbeiten willst, dann musst du besonders genau lesen. Grüße vom marabu |
Re: Treeview onclick
Hi,
ich habe es über MouseUp realisiert:
Delphi-Quellcode:
Beim Erzeugen der Nodes habe ich mit ANode.Data := MeineAction eine Action aus einer ActionList zugewiesen.
procedure TFRMMain.doNavTreeViewMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Var ANode: TTreeNode; R: TRect; begin // Navigator mit Click // Doppelte Ausführung verhindern... // FTreeViewLocked is Private Field der Unit! if FTreeViewLocked then Exit; FTreeViewLocked := True; try with TTreeView(Sender) do begin ANode := GetNodeAt(x, y); if Assigned(ANode) and ANode.Selected and Assigned(ANode.Data) then begin R := ANode.DisplayRect(True); // den Klick links oder rechts neben den Text verhindern if (x >= R.Left - 16) and (x <= r.Right) then if TObject(ANode.Data) is TAction then TAction(ANode.Data).Execute; end; end; finally Application.ProcessMessages; FTreeViewLocked := False; end; end; Ansonsten lieber Doppelklick, da ist es einfacher... Gruß, Frank |
Re: Treeview onclick
@marabu,
ich habe es gearade probiert und muss zugeben, onChange ist eleganter. Hätte ich nur die Frage früher in diesem Forum gepostet :) Gruß, Frank |
Re: Treeview onclick
Aha ... wobei ich zugeben muss, dass ich einiges bei dataspider's Methode nicht verstehe. Aber warum gibt es keinen Befehl wie diese, auch wenn sie sich auf eine ListBox bezieht?
Delphi-Quellcode:
ListBox1.Items[ListBox1.ItemIndex]
|
Re: Treeview onclick
Wie willst du denn den Itemindex angeben?
Delphi-Quellcode:
zum Verständniss: Dataspider liest ein welches Item sich an der Mausposition befindet.
item1
| |-subitem1 |-subitem2 item2 | |-subitem1 | |-subsubitem1 | |-subsubsubitem1 //<- wie willst du z.B. den Index dieses Items angeben? |-subsubitem2 |-subitem2 |
Re: Treeview onclick
Zitat:
|
Re: Treeview onclick
Ich meinte: Eine Treeview gibt einen Baum an. So wie bei einer Festplatte die Ordnerstruktur. Der linke Teil des Windows-Explorers ist auch nur eine Treeview. Da ist z.B. "Die 1983. Datei" auch Definitionssache.
Zum Ausführen der Funktion:
Delphi-Quellcode:
procedure TFRMMain.doNavTreeViewMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Var ANode: TTreeNode; R: TRect; begin // Navigator mit Click // Doppelte Ausführung verhindern... // FTreeViewLocked is Private Field der Unit! if FTreeViewLocked then Exit; FTreeViewLocked := True; try with TTreeView(Sender) do begin ANode := GetNodeAt(x, y); if Assigned(ANode) and ANode.Selected and Assigned(ANode.Data) then begin R := ANode.DisplayRect(True); // den Klick links oder rechts neben den Text verhindern if (x >= R.Left - 16) and (x <= r.Right) then begin if anode.caption='Ich bin das dritte Item' then begin showmessgae('Sie haben auf das dritte Item geklickt.'); end; end; end; end; finally Application.ProcessMessages; FTreeViewLocked := False; end; end; |
Re: Treeview onclick
@Chrissi98
es gibt die Eigenschaft Items und du kannst z.B. so: TreeView.Items[2].Data := ActionHilfe; eine Aktion dem Node zuweisen. Dann kannst du wie schon gepostet im onMouseUp reagieren. Also, eine ActionList auf das Form, eine Action erstellen und dann zuweisen. Ich baue den Tree aber immer im Code auf, da der Index wie schon erwähnt nicht so einfach zu ermitteln ist. Aber es geht. Cu, Frank |
Re: Treeview onclick
Liste der Anhänge anzeigen (Anzahl: 1)
ich hab ein kleines Beispiel mal angehangen, hoffe, es funktioniert....
dennoch der Sourcecode:
Delphi-Quellcode:
Cu, Frank
unit FRM_Main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, ActnList; type TForm1 = class(TForm) tvNav: TTreeView; ActionList1: TActionList; ActHilfe: TAction; procedure FormCreate(Sender: TObject); procedure ActHilfeExecute(Sender: TObject); procedure tvNavMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private FTreeViewLocked: Boolean; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); Var ANode : TTreeNode; begin ANode := tvNav.Items.AddChild(nil, 'Erster'); tvNav.Items.AddChild(ANode, 'Erster U1'); tvNav.Items.AddChild(ANode, 'Erster U2'); tvNav.Items.AddChild(ANode, 'Erster U3'); tvNav.Items.AddChild(nil, 'Zweiter'); with tvNav.Items.AddChild(nil, 'Hilfe...') do Data := ActHilfe; end; procedure TForm1.ActHilfeExecute(Sender: TObject); begin ShowMessage('Hilfe'); end; procedure TForm1.tvNavMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Var ANode: TTreeNode; R: TRect; begin // Navigator mit Click // Doppelte Ausführung verhindern... // FTreeViewLocked is Private Field der Unit! if FTreeViewLocked then Exit; FTreeViewLocked := True; try with TTreeView(Sender) do begin ANode := GetNodeAt(x, y); if Assigned(ANode) and ANode.Selected and Assigned(ANode.Data) then begin R := ANode.DisplayRect(True); // den Klick links oder rechts neben den Text verhindern if (x >= R.Left - 16) and (x <= r.Right) then if TObject(ANode.Data) is TAction then TAction(ANode.Data).Execute; end; end; finally Application.ProcessMessages; FTreeViewLocked := False; end; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz