2016-08-25 4 views
1

Wie kann man einen Mausklick auf eine Zelle in TDBGrid simulieren?Mausklick auf eine Zelle simulieren in TDBGrid

+1

@RBA: Scheint aber nicht auf den spezifischen Punkt des OP zu antworten? – MartynA

+0

Warum müssen Sie das Klicken in einer Zelle simulieren? Wenn Sie die Zeile und die Spalte wissen, auf der Sie arbeiten sollen, schreiben Sie einfach den Code, um es zu tun. Wenn Sie möchten, dass das gleiche geschieht, wenn eine Zelle tatsächlich angeklickt wird, rufen Sie diesen Code im OnCellClick-Handler auf. Oder bist du unsicher, wie das geht? – MartynA

+0

@MartynA manchmal, es gibt ein Problem, wenn ich versuche, einen Datensatz zu entfernen .. Aber wenn ich einige Zellen in meiner aktuellen Zeile auswählen, wird die Entfernung durchgeführt! .. – userPro

Antwort

2

Update:

Dieser Code sollte tun, was Sie scheinen zu wollen:

type 
    TMyDBGrid = class(TDBGrid); 

function TForm1.GetCellRect(ACol, ARow : Integer) : TRect; 
begin 
    Result := TmyDBGrid(DBGrid1).CellRect(ACol, ARow); 
end; 

procedure TForm1.DBGrid1MouseUp(Sender: TObject; Button: TMouseButton; Shift: 
    TShiftState; X, Y: Integer); 
var 
    Coords : TGridCoord;  
begin 
    Coords := DBGrid1.MouseCoord(X, Y); 
    Caption := Format('Col: %d, Row: %d', [Coords.X, Coords.Y]); 
end; 

procedure TForm1.SimulateClick(ACol, ARow : Integer); 
type 
    TCoords = packed record 
    XPos : SmallInt; 
    YPos : SmallInt; 
    end; 
var 
    ARect : TRect; 
    Coords : TCoords; 
begin 
    ARect := GetCellRect(ACol, ARow); 
    Coords.XPos := ARect.Left; 
    Coords.YPos := ARect.Top; 
    DBGrid1.Perform(WM_LButtonUp, 0, Integer(Coords)); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    SimulateClick(StrToInt(edX.Text), StrToInt(edY.Text)); 
end; 

Die MouseCoord Funktion von TDBGrid ein Paar von Koordinaten konvertiert (X, Y) in eine Spaltennummer (TGridCoord .X) und eine Zeilennummer ((TGridCoord.Y).

die OnMouseUp Ereignis zeigt die Ergebnisse der DBGrid1.MouseCoord Aufruf auf dem X-Y-Eingang & ARGUM . Die SimulateClick simuliert einen Klick auf eine Zelle des Gitters. Es verwendet GetCellRect, um die Koordinaten (in dem DBGrid) des topleft einer angegebenen Zelle abzurufen, und ruft dann auf dem DBGrid Perform (WM_LButtonUp, ...) auf, das die Koordinaten in dem LParam-Argument übergibt.

Schließlich ruft Button1Click SimulateClick mit Col und Row-Werten von einem Paar TEdits auf. Dadurch wird das OnMouseUp-Ereignis ausgelöst und die Spalten- und Zeilennummer angezeigt. Sie können sich also selbst davon überzeugen, dass es den gleichen Effekt wie ein Mausklick auf die entsprechende Zelle hat.

+0

Vielen Dank !! – userPro

+0

wenn ich 'DBGrid1.Perform (WM_LButtonDown, 0, Integer (Coords)) verwende;' vor dem 'UP' bekomme ich, was ich brauche .. die Zelle mit _Coords_ ist ausgewählt und als 'fokussiert' .. thx! – userPro

+0

@userPro: Ich bin froh, dass du es aussortiert hast. Eigentlich möchte ich noch einmal auf deine q über das Löschen von Dateien zurückkommen und sehen, ob wir das lösen können - ich werde dir etwas in meiner Antwort mit einigen Vorschlägen/Fragen zu deinem q posten. – MartynA

Verwandte Themen