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

Bases de données Delphi Discussion :

[D7] DbGrid Multiselect et Shift


Sujet :

Bases de données Delphi

  1. #1
    LHT
    LHT est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 26
    Points : 27
    Points
    27
    Par défaut [D7] DbGrid Multiselect et Shift
    Bonjour,

    lors d'une sélection multiple avec la dbgrid, il n'y a que le CTRL+click qui fonctionne.

    Mon objectif est de pouvoir sélectionner une intervalle grâce au SHIFT+CLICK (comme dans la plupart des applis...)

    voici la manière dont je procède (qui ne marche pas )

    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
     
     
    procedure TFrm.dbgCellClick(Column: TColumn);
    begin
      IndexPrecedent := EmissionEnCours;
      IndexEnCours := dbg.DataSource.DataSet.RecNo;
     
     
    end;
     
    procedure TFrm.dbgKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    var
     i : integer;
    begin
     
      If Key = VK_SHIFT Then Begin
        if not(IndexEnCours = IndexPrecedente) then begin
          If (IndexEnCours > IndexPrecedente) Then Begin
            for i := IndexPrecedente to IndexEnCours do begin
              dbg.DataSource.DataSet.GotoBookmark(Pointer(dbg.SelectedRows.items[i]));
              if not(dbg.SelectedRows.CurrentRowSelected) then dbg.SelectedRows.CurrentRowSelected := True;
            end;
          End
          Else Begin
            for i := IndexEnCours to IndexPrecedente do begin
              dbg.DataSource.DataSet.GotoBookmark(Pointer(dbg.SelectedRows.items[i]));
              if not(dbg.SelectedRows.CurrentRowSelected) then dbg.SelectedRows.CurrentRowSelected := True;
            end;
          End;
     
        end;
      End;
     
    end;

    Si quelqu'un à une petite idée ...

  2. #2
    LHT
    LHT est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 26
    Points : 27
    Points
    27
    Par défaut
    Bonjour tout le monde.

    En fait je souhaite récuperer la position courante de la ligne sélectionnée pour permette après une sélection des enregistrements entre le click précedent et le click actuel.

    En effet le shift ne fonctionne pas.

    Si vous avez une piste, siouplait ! merci !!!!

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 460
    Points : 24 874
    Points
    24 874
    Par défaut
    Effectivement, je suis dans le même problème que toi, j'aimerais améliorer la multi-selection !
    Je n'ai qu'implémenter le Ctrl-A pour le moment !

    Pour ton cas, tu dois parcourir le DataSet avec des Next\Prior en mémorisant un champ (l'ID par exemple)

    Click simple, tu enregistre l'ID,
    Click + Shift, tu es normalement positionné sur la nouvelle ligne, tu as un autre ID, il faut que ta liste ne soit pas triable, et dans selon la valeur de ce second ID, tu sais si il faut remonter (prior) ou descendre (next)

    en fait ce qui ne va pas dans ton code c'est ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for i := IndexPrecedente to IndexEnCours do begin
        dbg.DataSource.DataSet.GotoBookmark(Pointer(dbg.SelectedRows.items[i]));
              if not(dbg.SelectedRows.CurrentRowSelected) then dbg.SelectedRows.CurrentRowSelected := True;
            end;
    Si tu parcours SelectedRows.Items, et que tu fais un GotoBookmark, normalement CurrentRowSelected est toujours à True, tu ne sors jamais de la liste

    Moi, j'ai un autre problème, je clique sur une ligne, et lorsque j'utilise la molette, une seconde ligne de couleur (genre selectionné) apparait, mais en fait cela ne correspond ni l'enregistrement en cours, ni à une selection ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    LHT
    LHT est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 26
    Points : 27
    Points
    27
    Par défaut
    C'est bon j'ai trouvé !


    Voici la démarche que j'ai suivi :
    Enregistrement de l'index en cours et de l'index precedent sur le OnClick.
    Selection de(s) intervalle(s) sur le OnMouseUp

    On peut aussi rendre ces deux procédures "générique" en incluant dans les paramètres DBGrid : TDBGrid.

    Après pour chaque grille, il n'y a qu'a appeller dans les onCellClick et OnMouseUp les procédures "générique" en y passant la grille !

    Bon code à tous !

    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    TFrame = class(TForm)
        [...]
      private
        { Déclarations privées}
        [...]
         IndexEnCours, IndexPrecedent : TBookmark;
      public
        [...]
    end;
     
    procedure TFrame.DBGridCellClick(Column: TColumn);
    begin
      inherited;
     
      if DBGrid.SelectedRows.count > 0 then begin
        if DBGrid.SelectedRows.CurrentRowSelected then begin
          IndexPrecedent := IndexEnCours ;
          IndexEnCours :=  DBGrid.DataSource.DataSet.GetBookmark;
        end;
      end
        else if DBGrid.SelectedRows.count = 0 then begin
               IndexPrecedent := nil;
               IndexEnCours := nil;
             end;
    end;
     
     
    procedure TFrame.DBGridMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
     i, diffIndex : integer;
    begin
     
      //Rafraîchissement des indexs
      DBGridCellClick(DBGrid.Columns.Items[0]);
     
      //comparaison des index
      diffIndex := dgValise.DataSource.DataSet.CompareBookmarks(IndexEnCours, IndexPrecedent);
     
    // Si on a appuyé sur shift ou sur controle et shift
    // et qu'on a un index en cours et précedent et que ceux ci sont différents
      If ((Shift = [ssShift, ssCtrl]) or (Shift = [ssShift]))
         and ((IndexEnCours <> nil) and ( IndexPrecedent<> nil) and ( diffIndex <> 0))
      Then Begin
     
        //Si l'index en cours est supérieur à l'index precedent
        if (diffIndex = 1) then begin
          //On se place sur l'index precedent
          DBGrid.DataSource.DataSet.GotoBookmark(IndexPrecedent);
     
          //On le selectionne si il n'est pas selectionne (du au problème de non selection avec le shift)
          if not(DBGrid.SelectedRows.CurrentRowSelected) then DBGrid.SelectedRows.CurrentRowSelected := True;
     
          // Tant que nous ne somme pas arrivé à l'index en cours
          while (DBGrid.DataSource.DataSet.CompareBookmarks(Pointer(DBGrid.DataSource.DataSet.Bookmark), IndexEnCours) <> 0) do begin
     
            //On sélectionne l'enregistrement suivant
            DBGrid.DataSource.DataSet.next;
            if not(DBGrid.SelectedRows.CurrentRowSelected) then DBGrid.SelectedRows.CurrentRowSelected := True;
           //on se place sur l'enregistrement (sinon on tourne en boucle)
           DBGrid.DataSource.DataSet.GotoBookmark(Pointer(DBGrid.SelectedRows.CurrentRowSelect));
          end;
        end
        else begin
          //Si l'index en cours est inférieur à l'index precedent
          if (diffIndex = -1) then begin
     
            DBGrid.DataSource.DataSet.GotoBookmark(IndexPrecedent);
     
            if not(DBGrid.SelectedRows.CurrentRowSelected) then DBGrid.SelectedRows.CurrentRowSelected := True;
           // Tant que nous ne somme pas arrivé à l'index precedent
            while (DBGrid.DataSource.DataSet.CompareBookmarks(DBGrid.DataSource.DataSet.GetBookmark, IndexEnCours) <> 0) do begin
     
            //On sélectionne l'enregistrement precedent
            DBGrid.DataSource.DataSet.prior;
     
              if not(DBGrid.SelectedRows.CurrentRowSelected) then DBGrid.SelectedRows.CurrentRowSelected := True;
            end;
          end;
        end;
     End;
     
    end;

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

Discussions similaires

  1. synchronisation 2 DBGrids avec multiselect
    Par prat381 dans le forum Bases de données
    Réponses: 2
    Dernier message: 29/03/2012, 08h53
  2. TurboDelphi 2006, dbgrid et SHIFT
    Par dleu dans le forum Composants VCL
    Réponses: 0
    Dernier message: 21/08/2007, 08h59
  3. [VB6]shift ou ctrl-droit sur un DBGrid
    Par riesseg dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 05/05/2006, 14h20
  4. utiliser la touche SHIFT ou CTRL+A dans un DBGRID
    Par richard038 dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/10/2005, 09h06
  5. DBLookupComboBox dans DBGrid
    Par KThrax dans le forum Bases de données
    Réponses: 7
    Dernier message: 24/08/2004, 15h18

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