2012-12-18 19 views
5

In Delphi 2010 gibt es eine Möglichkeit zu erkennen, welche Zelle angeklickt wurde, wenn dgRowSelect auf True gesetzt ist?Ermitteln, welche Zelle in TDBGrid geklickt wurde, wenn dgRowSelect auf True gesetzt ist?

Normalerweise würde ich den OnCellClick(Column: TColumn) Event-Handler verwenden, aber dies funktioniert nicht wie erwartet. Mit dgRowSelect = False wird diese Prozedur an die Spalte übergeben, auf die geklickt wurde, aber mit dgRowSelect = True wird dieser Prozedur die erste Spalte übergeben, unabhängig davon, auf welche Spalte geklickt wurde.

Ich kann nicht arbeiten, wo der Code ist, dass die OnCellClick ruft im TColumn Parametern übergeben, wenn ich finden kann, dass ich vielleicht in der Lage sein, wie zu arbeiten, um dieses seltsame Verhalten zu beheben.

Antwort

13

Sie können die Mauskoordinaten verwenden, um die Spalte zu erhalten. Nach TDBGrid.MouseCoord Aufruf enthält die zurück TGridCoord.X die Spaltennummer und die Y enthält die Zeile (die, natürlich, die Sie bereits haben):

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; 

Weitere Informationen über TGridCoord im documentation.

Geprüft die gleiche Anwendung für meine Antwort auf your previous question verwendet werden.

+0

Perfekte Antwort. Gibt mir genau das, was ich brauche. Wenn es jemand anderem hilft, habe ich das benutzt, um mir den Namen des Datenbankfeldes zu geben; DBGrid1.Columns [ClickCol - 1] .Field.FieldName – srayner

+0

+1 Diese Antwort hat mir auch geholfen, aber bin ich es oder stimmt etwas nicht mit der Benennung der Eigenschaften? Normalerweise werden Mauskoordinaten als relative Bildschirmposition verstanden. –

+0

Der ScreenToClient könnte die Konvertierung durchführen, habe ich recht? –

Verwandte Themen