StringGrid : Variation de LeftCol et TopRow à la souris

Signaler
Messages postés
32
Date d'inscription
vendredi 13 décembre 2002
Statut
Membre
Dernière intervention
29 mars 2014
-
Messages postés
32
Date d'inscription
vendredi 13 décembre 2002
Statut
Membre
Dernière intervention
29 mars 2014
-
Bonjour,

J'aimerais que les propriétés LeftCol et TopRow d'un StringGrid se modifient lorsque l'utilisateur laisse le bouton gauche de la souris appuyé et se déplace dans ce TStringGrid.

J'envisage une solution utilisant un mix entre les différents événements OnMouse de ce composant mais ça me semble lourd.

Avez vous une solution toute faite ?

D'avance merci,


Tec.
--

2 réponses

Messages postés
146
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016

Bonsoir Tec,

Après essai, ça marche effectivement en utilisant les évènements
OnMouseDown
et
OnMouseUp
du
StringGrid
. Voici ce que j'ai écrit vite fait, en utilisant l'unité
Math
pour la fonction
Max
pas indispensable. Il reste à bien initialiser les membres
FStartX
et
FStartY
lors de la création de ta
Form
. Attention par contre, à veiller que toutes les cellules du
StringGrid
aient bien la même hauteur et la même largeur.

  TForm1 = class(TForm)
    Sgr: TStringGrid;
    procedure SgrMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure SgrMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  private
    FStartX: Integer;
    FStartY: Integer;
  public
  end;

procedure TForm1.SgrMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  FStartX := X;
  FStartY := Y;
end;

procedure TForm1.SgrMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Sgr.LeftCol := Max(Sgr.LeftCol + ((X - FStartX) div Sgr.DefaultColWidth), 0);
  Sgr.TopRow := Max(Sgr.TopRow + ((Y - FStartY) div Sgr.DefaultRowHeight), 0);
end;

Bon courage,
zwyx
Messages postés
32
Date d'inscription
vendredi 13 décembre 2002
Statut
Membre
Dernière intervention
29 mars 2014

Bonjour zwyx,

Merci beaucoup.

Je suis en effet parti sur ce genre de process mais en utilisant l'event OnMouseMouve pour avoir un déplacement continue.
Me reste à finaliser ça.

Bonne soirée.

Tec.
Messages postés
265
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
19 juillet 2021
13
Salut,
...
type
TPublicStringGrid = class(TCustomGrid);
procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
FLeftCol : Integer;
FTopRow : Integer;
begin
if GetKeyState(VK_LBUTTON) < 0 then
begin
FLeftCol := TPublicStringGrid(StringGrid1).MouseCoord(X,Y).X;
FTopRow := TPublicStringGrid(StringGrid1).MouseCoord(X,Y).Y;
if (FLeftCol <> -1) and (FTopRow <> -1) then
StringGrid1.Cells[FLeftCol,FTopRow] := Format('C%d R%d',[FLeftCol,FTopRow]);
end;
end;
@+
Messages postés
32
Date d'inscription
vendredi 13 décembre 2002
Statut
Membre
Dernière intervention
29 mars 2014

Merci cs_yanb,

Je vais creuser ça avec beaucoup d'attention.