Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Treeview onclick (https://www.delphipraxis.net/58077-treeview-onclick.html)

Chrissi91 1. Dez 2005 05:53


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

marabu 1. Dez 2005 06:03

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

dataspider 1. Dez 2005 07:28

Re: Treeview onclick
 
Hi,
ich habe es über MouseUp realisiert:
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
          if TObject(ANode.Data) is TAction then
            TAction(ANode.Data).Execute;
      end;
    end;
  finally
    Application.ProcessMessages;
    FTreeViewLocked := False;
  end;
end;
Beim Erzeugen der Nodes habe ich mit ANode.Data := MeineAction eine Action aus einer ActionList zugewiesen.
Ansonsten lieber Doppelklick, da ist es einfacher...
Gruß, Frank

dataspider 1. Dez 2005 08:05

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

Chrissi91 1. Dez 2005 13:56

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]

ichbins 1. Dez 2005 14:14

Re: Treeview onclick
 
Wie willst du denn den Itemindex angeben?

Delphi-Quellcode:
item1
  |
  |-subitem1
  |-subitem2
item2
  |
  |-subitem1
    |
    |-subsubitem1
      |
      |-subsubsubitem1   //<- wie willst du z.B. den Index dieses Items angeben?
    |-subsubitem2
  |-subitem2
zum Verständniss: Dataspider liest ein welches Item sich an der Mausposition befindet.

Chrissi91 1. Dez 2005 14:25

Re: Treeview onclick
 
Zitat:

Zitat von ichbins
Wie willst du denn den Itemindex angeben?

Delphi-Quellcode:
item1
  |
  |-subitem1
  |-subitem2
item2
  |
  |-subitem1
    |
    |-subsubitem1
      |
      |-subsubsubitem1   //<- wie willst du z.B. den Index dieses Items angeben?
    |-subsubitem2
  |-subitem2
zum Verständniss: Dataspider liest ein welches Item sich an der Mausposition befindet.

Ich verstehe die Frage nicht ganz. Ich möchte, dass wenn jemand auf das dritte Item klickt, dass dann etwas passiert. :mrgreen:

ichbins 1. Dez 2005 14:31

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;

dataspider 1. Dez 2005 14:43

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

dataspider 1. Dez 2005 15:02

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:
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.
Cu, Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:50 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz