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 :

[0.9.31/fpc 2.4.5] StringGrid : Multiselect et MouseWheel [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut [0.9.31/fpc 2.4.5] StringGrid : Multiselect et MouseWheel
    Bonjour,

    dans une StringGrid, j'aimerais obtenir un traitement similaire à Office:

    Je sélectionne un groupe de cellules à la souris, relâche son bouton gauche puis immédiatement après cette action, me déplace verticalement avec la roulette de la souris... Evidemment à ce moment, visuellement le bloc "sélectionné" ne s'agrandit pas : il se déplace verticalement dans la feuille.

    Or avec Lazarus, une même procédure, produit un bloc continu qui s'allonge avec la MouseWheel... à moins qu'une option de la StringGrid m'ait échappée. J'avais "en attendant" partiellement réglé ce problème dans un composant, en associant la sélection à un array de booleans... et à une image dans la FixedColumn... tout en délaissant ce problème de "SelectedColor" des lignes ou cellules sélectionnées. J'ai un peu de temps pour le retravailler.

    Actuellement, avec l'array de booleans, je serais capable de gérer le problème des couleurs, si après une sélection (au clic gauche), je pouvais avant l'usage du OnMouseWheel remettre en quelque sorte le "Flag de sélection à false"... Et là, je ne sais pas faire.
    Cette petite vidéo illustre mon problème : le SelectedColor (le vrai) de la SG est clRed alors que mon émulation des lignes sélectionnées est clBlue. Ici, j'opère avec le bouton Ctrl du clavier enfoncé pour pouvoir faire des pseudo-sélections non contigües mais son usage est neutre dans mon problème.

    Ce qui est curieux, c'est la différence de traitement pratiquée par Lazarus aussi bien sous Win que sous Nux : après la deuxième ligne bleue pseudo-sélectionnée, j'utilise MouseWheel et cela fonctionne correctement : chaque ligne est sélectionnée (en clRed) une par une. Ma dernière pseudo-sélection est le bloc bleu... et là, l'usage de MouseWheel immédiatement après avoir relâché le bouton de la souris, allonge le bloc de "vraie" sélection (clRed) comme si, la StringGrid était restée en mode sélection et le restait après chaque ligne contrairement à la description précédente... donc en fait, comme si le OnMouseUp n'avait entraîné aucune action à ce niveau.

    Cela m'ennuirait quelque peu d'envisager une autre approche que celle de l'array de booleans qui de plus est simple conceptuellement parlant... et reste insensible aux variations du composant de base qui ont été nombreuses depuis la 0.9.28. Et même si sa maintenance l'exigeait, il resterait probablement très facilement adaptable. Mais à défaut...

    Cordialement. Gilles
    Dernière modification par Invité ; 13/10/2011 à 18h04. Motif: Meilleure formulation (enfin j'espère)

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

    J'ai résolu provisoirement le problème ainsi :
    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
    procedure TForm1.StringGrid1MouseWheelDown(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    var
      iLast :integer;
    begin
     with StringGrid1 do begin
      if not (goRowSelect in Options) then exit;
      {Détermination de la ligne sélectionnée la plus basse}
      iLast := Row;
      if  not (iLast = RowCount -1) then begin
       repeat
        inc(ilast);
       until not IsCellSelected[FixedCols, iLast];
        dec(iLast);
      end else
       iLast := RowCount;
      {Effacement de la sélection actuelle}
      Selection := Rect(-1, -1, -1, -1);
      {Se placer ligne suivante}
      if not( iLast = RowCount) then
       Row := iLast
      else
       Row := RowCount -1;
     end;
    end;
     
    procedure TForm1.StringGrid1MouseWheelUp(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    var
      iFirst :integer;
    begin
     with StringGrid1 do begin
      if not (goRowSelect in Options) then exit;
      {Détermination de la ligne sélectionnée la plus haute}
      iFirst := Row;
      if  not (iFirst = FixedRows) then begin
       repeat
        Dec(iFirst);
       until not IsCellSelected[FixedCols, iFirst];
       Inc(iFirst);
      end else
       iFirst := FixedRows;
      {Effacement de la sélection actuelle}
      Selection := Rect(-1, -1, -1, -1);
      {Se placer ligne précédente}
      if not( iFirst = FixedRows) then
       Row := iFirst
      else
       Row := FixedRows;
     end;
    end;
    La difficulté réside dans le fait qu'on peut sélectionner un bloc de bas en haut et utiliser juste après MouseWheelDown : il faut alors "laisser penser" que la dernière ligne sélectionnée n'est pas la dernière mais la première...

    Je précise également que mes StringGrids sont en option goRowSelect := True lorsque je fais de la multisélection... Si l'option est à false, le problème ne se pose pas... de la même façon . Mais c'est un autre problème intéressant. Comment sélectionner -comme on le fait dans un tableur- des blocs de cellules non contiguës ? A mon avis de la même façon : soit avec une 2ème SG invisible soit avec un tableau à 2 dimensions de booleans et en affichant une pseudo-sélection... en jouant avec les couleurs dans OndrawCell..

    J'ai également interrogé le bug tracker mais sans conviction. Je suppose que la réponse classique va être que le "grand frère" fait de même... En fait, je n'en sais rien. Je n'ai pas vérifié. Je n'ai plus un seul "grand frère" d'installé sur aucun de mes postes.

    Cordialement. Gilles
    Dernière modification par Invité ; 16/10/2011 à 12h12. Motif: Précisions

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

    L'équipe Lazarus a réglé le problème à partir de la version 32947.

    Pour ceux, qui ne veulent pas (ou ne peuvent pas) utiliser cette version, le correctif que j'ai proposé doit être légèrement modifié pour fonctionner comme l'a décidé l'équipe Lazarus. Le code proposé au départ fonctionne ainsi : Supposons que je sélectionne un bloc avec les lignes 2-3-4 (sélection de haut en bas donc), la dernière ligne sélectionnée est la 4, un MouseWheelUp place le focus sur la ligne 1 directement sur la ligne au-dessus du bloc sélectionné... alors que le correctif Lazarus préfère placer le focus sur la ligne 3 et donc "parcourir" le bloc "sélectionné".

    Pour reproduire ce dernier fonctionnement dans les versions antérieures à la 32947, une partie du code proposé ci-dessus est à supprimer dans les 2 procédures.
    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
    procedure TForm1.StringGrid1MouseWheelDown(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    var
      iLast :integer;
    begin
     with StringGrid1 do begin
      if not (goRowSelect in Options) then exit;
      {Détermination de la ligne sélectionnée la plus basse}
      iLast := Row;
    {if  not (iLast = RowCount -1) then begin
       repeat
        inc(ilast);
       until not IsCellSelected[FixedCols, iLast];
        dec(iLast);
      end else
       iLast := RowCount;}
      {Effacement de la sélection actuelle}
      Selection := Rect(-1, -1, -1, -1);
      {Se placer ligne suivante}
      if not( iLast = RowCount) then
       Row := iLast
      else
       Row := RowCount -1;
     end;
    end;
     
    procedure TForm1.StringGrid1MouseWheelUp(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    var
      iFirst :integer;
    begin
     with StringGrid1 do begin
      if not (goRowSelect in Options) then exit;
      {Détermination de la ligne sélectionnée la plus haute}
      iFirst := Row;
    {if  not (iFirst = FixedRows) then begin
       repeat
        Dec(iFirst);
       until not IsCellSelected[FixedCols, iFirst];
       Inc(iFirst);
      end else
       iFirst := FixedRows;}
      {Effacement de la sélection actuelle}
      Selection := Rect(-1, -1, -1, -1);
      {Se placer ligne précédente}
      if not( iFirst = FixedRows) then
       Row := iFirst
      else
       Row := FixedRows;
     end;
    end;
    Cordialement. Gilles

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Lazarus] [0.9.26.2] StringGrid : multiselect
    Par Invité dans le forum Lazarus
    Réponses: 2
    Dernier message: 03/08/2009, 09h49
  2. StringGrid sort
    Par clovis dans le forum C++Builder
    Réponses: 4
    Dernier message: 20/10/2004, 21h46
  3. StringGrid, multiligne et word wrap
    Par Dajon dans le forum C++Builder
    Réponses: 7
    Dernier message: 17/09/2003, 17h15
  4. Multi lignes dans un StringGrids ?
    Par Xavier dans le forum C++Builder
    Réponses: 3
    Dernier message: 27/11/2002, 23h15
  5. StringGrid et colonnes
    Par Delph dans le forum Composants VCL
    Réponses: 2
    Dernier message: 02/08/2002, 11h35

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