IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

StringGrid : comment faire pour savoir si on a réellement cliqué dans une cellule survolée


Sujet :

Lazarus Pascal

  1. #1
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut StringGrid : comment faire pour savoir si on a réellement cliqué dans une cellule survolée
    Bonsoir,

    Quand on clique dans un StringGrid, en dehors des cellules, disons à droite de la dernière, MouseToCell renvoie les coordonnées de la dernière cellule, et MouseToGridZone ne renvoie pas gzInvalid : comment faire pour savoir si on a réellement cliqué dans une cellule survolée ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Grâce à une comparaison des coordonnées de la souris et des limites du rectangle de la cellule renvoyée, je sais si elle est en dehors lors du MouseDown.

    Ça me permet de ne pas lancer un traitement lors d'un DoubleClick en dehors d'une cellule, mais dans ce cas, comment bloquer l'entrée en mode édition de la cellule extrême dont il renvoie les coordonnées indûment ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Si j'ai bien compris, le problème est de neutraliser le placement "résiduel" avec le Click et le DblClick si le curseur est hors cellule ?

    Si tel est le cas, on pourrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    procedure TForm1.StringGrid1MouseDown(Sender : TObject; Button : TMouseButton;
      Shift : TShiftState; X, Y : Integer);
    {uses  LCLintf;}
    var
     P : TPoint;
     Rect : TRect;
    begin
     with StringGrid1 do begin
      Rect.TopLeft := CellRect(FixedCols,FixedRows).TopLeft;       
      Rect.BottomRight := CellRect(ColCount -1, Rowcount -1).BottomRight;
      P.X := X;
      P.Y := Y;
     end;
     if not PtInRect(Rect, P) then Abort;
    end;
    Si on place ce code dans une autre méhode qui ne contient pas "X,Y : Integer" ou par exemple dans procedure TForm1.StringGrid1(Dbl)Click(Sender : TObject); , alors on peut renseigner P ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      GetCursorPos(P) ;
      P:=StringGrid1.ScreenToClient(P);
    Mais à mon avis, le premier code est suffisant... Si on est hors cellule, le OnDbClick est court-circuité par le Abort du MouseDown : le StringGrid1DblClick n'est pas exécuté (cf code complet ci-dessous). Mais le OnClick l'est... et dans les 2 cas, le non-placement "quand il le faut" dans la cellule est géré correctement.

    Cordialement. Gilles

    PS : Code complet de la Form pour test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    unit Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
      LCLintf, StdCtrls;
     
    type
     
      { TForm1 }
      TForm1 = class(TForm)
        laDblClick : TLabel;
        laClick : TLabel;
        StringGrid1 : TStringGrid;
        procedure FormCreate(Sender : TObject);
        procedure StringGrid1Click(Sender : TObject);
        procedure StringGrid1DblClick(Sender : TObject);
        procedure StringGrid1MouseDown(Sender : TObject; Button : TMouseButton;
          Shift : TShiftState; X, Y : Integer);
     
      private
        { private declarations }
      public
        { public declarations }
      end;
     
    var
      Form1 : TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
    procedure TForm1.StringGrid1Click(Sender : TObject);
    begin
     laClick.caption := 'Click';
    end;
     
    procedure TForm1.FormCreate(Sender : TObject);
    begin
     laClick.caption := '';
     laDblClick.caption := '';
    end;
     
    procedure TForm1.StringGrid1DblClick(Sender : TObject);
    begin
     laDblClick.caption := 'DblClick';
    end;
     
    procedure TForm1.StringGrid1MouseDown(Sender : TObject; Button : TMouseButton;
      Shift : TShiftState; X, Y : Integer);
    var
     P : TPoint;
     Rect : TRect;
    begin
     laClick.caption := '';
     laDblClick.caption := '';
     with StringGrid1 do begin
      Rect.TopLeft := CellRect(FixedCols,FixedRows).TopLeft;
      Rect.BottomRight := CellRect(ColCount -1, Rowcount -1).BottomRight;
      P.X := X;
      P.Y := Y;
     end;
     if not PtInRect(Rect, P) then Abort;
    end;
     
    end.
    Dernière modification par Invité ; 07/03/2012 à 14h09. Motif: Précisions

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Chapeau !

    Bien vu.

    Je ne l'ai pas testé, mais ça semble parfaitement répondre au problème.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/11/2011, 15h52
  2. Réponses: 2
    Dernier message: 14/11/2009, 19h40
  3. Réponses: 4
    Dernier message: 05/01/2008, 21h07
  4. Comment faire pour savoir si on est connécté à un FTP ?
    Par MegaBigBoss dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 23/08/2006, 20h33
  5. Comment faire pour savoir quel processus utilise un DLL
    Par Furius dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 02/11/2005, 18h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo