2013-05-25 16 views
5

I, (più tempo), il tentativo di eseguire un'azione quando scatto in un oggetto di un controllo TreeView si veda:Esegui evento solo se un nodo TreeView viene cliccato

procedure TForm1.TreeView1Click(Sender: TObject); 
begin 

    if treeview1.Selected.AbsoluteIndex=1 then 
    begin 
    showmessage('selecionado'); 
    end; 

end; 

Questo codice mostrerà un messaggio se l'utente clicca in indice 1 di una treeview, il problema è il seguente: Se l'utente seleziona l'indice 1, verrà visualizzato il messaggio, tuttavia dopo di che, l'utente fa clic nell'area vuota della listview il messaggio viene comunque eseguito perché l'elemento è ancora selezionato . Come posso far funzionare l'evento solo se l'utente fa clic sull'elemento corrispondente?

risposta

7

Non utilizzare OnClick, che si verifica ogni volta che si fa clic su TTreeView (non solo quando si fa clic su un nodo). Al contrario, utilizzare l'evento TTreeView.OnChange, che si passa il nodo:

procedure TForm3.TreeView1Change(Sender: TObject; Node: TTreeNode); 
begin 
    if Assigned(Node) then 
    if Node.AbsoluteIndex = 1 then 
     ShowMessage('selecionado'); 
end; 
+7

Inoltre, si deve pensare della tastiera. Alcune persone usano solo la tastiera e nessun mouse. –

+0

@AndreasRejbrand, volevo utilizzare l'evento "TTreeView.OnChange". Ma non fa fuoco con un clic o premendo un tasto. Hai qualche idea, perché non licenzia l'evento? – Ugur

+0

Qualsiasi soluzione nel caso in cui qualcuno voglia utilizzare il gestore di eventi OnClick di treeview invece di OnChange? – grinner

0
procedure TForm1.TreeView1Click(Sender: TObject); 
begin 
    if Assigned(TreeView1.Selected) then 
    begin 
     if SameText(TreeView1.Selected.Text, 'show form1') then 
      ShowMessage('selecionado') 
     else 
      if SameText(TreeView1.Selected.Text, 'show form2') then 
       ShowMessage('s22'); 
    end 
end; 
1
procedure TfClerks.tvHqClick(Sender: TObject); 
var 
    Node: TTreeNode; 
begin 
    with tvHq.ScreenToClient(Mouse.CursorPos) do 
    Node := tvHq.GetNodeAt(X, Y); 
    if Node = nil then 
    Exit; 
    // do something 
end; 
+0

È la risposta perfetta. Grazie.. –

Problemi correlati