2016-08-25 2 views
1

Comment simuler un clic de souris sur une cellule dans TDBGrid?Simuler le clic de souris sur une cellule dans TDBGrid

+1

@RBA: Cela ne semble pas répondre au point spécifique du PO, cependant? – MartynA

+0

Pourquoi avez-vous besoin de simuler un clic dans une cellule? Si vous connaissez la ligne et la colonne sur lesquelles vous devez opérer, écrivez simplement le code pour le faire. Ensuite, si vous voulez que la même chose se produise lorsqu'une cellule est cliquée, appelez simplement ce code dans le gestionnaire OnCellClick. Ou êtes-vous incertain comment faire cela? – MartynA

+0

@MartynA parfois, il ya un problème quand j'essaie de supprimer un enregistrement .. Mais quand je sélectionne une cellule dans ma ligne actuelle, la suppression est effectuée! .. – userPro

Répondre

2

Mise à jour:

Ce code devrait faire ce que vous semblez vouloir:

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; 

La fonction MouseCoord de TDBGrid convertit une paire de coordonnées (X, Y) dans un numéro de colonne (TGridCoord L'événement OnMouseUp affiche les résultats de l'appel de DBGrid1.MouseCoord sur le X & ents. Le SimulateClickSimulateClick simule un clic sur une cellule de la grille. Il utilise GetCellRect pour obtenir les coordonnées (dans le DBGrid) du topleft d'une cellule spécifiée, puis appelle Perform (WM_LButtonUp, ...) sur le DBGrid, en passant les coordonnées dans l'argument LParam.

Enfin, Button1Click appelle SimulateClick en utilisant les valeurs Col et Row d'une paire de TEdits. Cela provoque l'exécution de l'événement OnMouseUp et affiche le nombre Col et Row, de sorte que vous pouvez vous assurer qu'il a le même effet que le clic de la souris sur la cellule correspondante.

+0

Merci beaucoup! – userPro

+0

quand j'utilise 'DBGrid1.Perform (WM_LButtonDown, 0, Integer (Coords));' avant le 'UP', j'obtiens ce dont j'ai besoin .. la cellule avec _Coords_ est sélectionnée et comme 'focalisée' .. thx! – userPro

+0

@userPro: Content que vous l'ayez résolu. En fait, je voudrais revenir à votre q sur la suppression des enregistrements et voir si nous pouvons résoudre ce problème - je vais vous poster quelque chose dans ma réponse là avec quelques suggestions/requêtes au sujet de votre q. – MartynA