2012-12-18 18 views
5

In Delphi 2010 c'è un modo per rilevare quale cella è stata selezionata quando dgRowSelect è impostato su True?Rileva quale cella è stata selezionata in TDBGrid quando dgRowSelect è impostato su True?

Normalmente userei il gestore di eventi OnCellClick(Column: TColumn), ma questo non funziona come previsto. Con dgRowSelect = False questa procedura viene passata alla colonna su cui è stato fatto clic, ma con dgRowSelect = True questa procedura viene passata alla prima colonna, indipendentemente dalla colonna su cui è stato fatto clic.

Non riesco a capire dove sia il codice che chiama lo OnCellClick passando il parametro TColumn, se trovassi che potrei riuscire a capire come risolvere questo strano comportamento.

risposta

13

È possibile utilizzare le coordinate del mouse per ottenere la colonna. Dopo aver chiamato TDBGrid.MouseCoord, restituita TGridCoord.X contiene il numero della colonna, ed il Y contiene la riga (che, naturalmente, hai già):

procedure TForm1.DBGrid1CellClick(Column: TColumn); 
var 
    Pt: TPoint; 
    Coord: TGridCoord; 
    ClickCol: Integer; 
begin 
    Pt := DBGrid1.ScreenToClient(Mouse.CursorPos); 
    Coord := DBGrid1.MouseCoord(Pt.X, Pt.Y); 
    ClickCol := Coord.X; 
    ShowMessage('You clicked column ' + IntToStr(ClickCol)); 
end; 

Maggiori informazioni sul TGridCoord nel documentation.

Testato utilizzando la stessa app utilizzata per la risposta allo your previous question.

+0

Risposta perfetta. Mi dà esattamente quello di cui ho bisogno. Se aiuta qualcun altro ho usato questo per darmi il nome del campo del database; DBGrid1.Columns [ClickCol - 1] .Field.FieldName – srayner

+0

+1 Questa risposta mi ha aiutato, ma sono io o c'è qualcosa di sbagliato nella denominazione delle proprietà? Normalmente le coordinate del mouse sono intese come posizione relativa dello schermo. –

+0

Lo ScreenToClient potrebbe eseguire la conversione, vero? –