StringGrid : Variation de LeftCol et TopRow à la souris

Technix59 Messages postés 32 Date d'inscription vendredi 13 décembre 2002 Statut Membre Dernière intervention 29 mars 2014 - 20 mars 2014 à 17:22
Technix59 Messages postés 32 Date d'inscription vendredi 13 décembre 2002 Statut Membre Dernière intervention 29 mars 2014 - 24 mars 2014 à 19:31
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

zwyx Messages postés 146 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 21 mars 2016
21 mars 2014 à 20:16
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
0
Technix59 Messages postés 32 Date d'inscription vendredi 13 décembre 2002 Statut Membre Dernière intervention 29 mars 2014
21 mars 2014 à 21:19
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.
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
24 mars 2014 à 10:56
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;
@+
0
Technix59 Messages postés 32 Date d'inscription vendredi 13 décembre 2002 Statut Membre Dernière intervention 29 mars 2014
24 mars 2014 à 19:31
Merci cs_yanb,

Je vais creuser ça avec beaucoup d'attention.
0
Rejoignez-nous