Ti scrivo la soluzione che ho implementato con qualche riga di commento per spiegare...poi mi dirai se è di tuo gradimento.
codice:
procedure TForm1.TreeView1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
rNode: TRect;
pTree, pNode: TPoint;
begin
case Key of
VK_SPACE:
// Verifica se è stato selezionato un nodo
if TreeView1.Selected <> nil then
begin
// Individua la posizione del controllo TreeView
pTree := Point(TreeView1.Left, TreeView1.Top);
// Individua l'area occupata dal testo del nodo selezionato
rNode := TreeView1.Selected.DisplayRect(True);
// Converte la posizione del nodo in coordinate dello schermo
pNode := ClientToScreen(Point(rNode.Left, rNode.Top));
// Somma la posizione del nodo a quella del controllo TreeView
// con un lieve spostamento verso il basso
Inc(pNode.x, pTree.x);
Inc(pNode.y, pTree.y + 18);
// Visualizza il menu Popup alla posizione specificata
PopupMenu1.Popup(pNode.x, pNode.y);
end;
end;
end;
Unica cosa: generalmente lo spazio viene utilizzato nei controlli ListView e TreeView per effettuare selezioni (quando queste sono multiple)...fai attenzione che la tua scelta di visualizzare il menu Popup sulla pressione dello spazio non interferisca con le azioni standard dei tasti.