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

Delphi Discussion :

Scrollbar avec visualisation des différence entre 2 colonnes de StringGrid


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Novembre 2012
    Messages : 27
    Par défaut Scrollbar avec visualisation des différence entre 2 colonnes de StringGrid
    Je voudrais développer (ou utiliser un composant existant) qui permettrait de scroller à travers une StringGrid et facilement visualiser les endroits ou il y a des différences entre 2 colonnes. Le StringGrid comporte de nombreuses lignes, j'aimerais implémenter un fonctionnement similaire au logiciel "Winmerge" avec son "Location Pane" (voir à gauche de la photo ci-jointe). J'utilise TAdvStringGrid du logiciel TMS.

    https://i.stack.imgur.com/hMQBV.pngNom : filecmp.png
Affichages : 362
Taille : 27,8 Ko

    Par quel bout commencer pour implémenter cela ?

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 679
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    J'avais utilisé le composant TDiff d'Angus Johnson dans mon éditeur de fichier texte GBEPad pour la fonctionnalité de comparaison de fichiers texte dont voici une capture d'écran :
    Nom : comparer.png
Affichages : 498
Taille : 25,0 Ko

    Apparemment ce composant a été repris et amélioré ici : https://github.com/rickard67/TextDiff
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Novembre 2012
    Messages : 27
    Par défaut
    Citation Envoyé par gbegreg Voir le message
    Bonjour,

    J'avais utilisé le composant TDiff d'Angus Johnson dans mon éditeur de fichier texte GBEPad pour la fonctionnalité de comparaison de fichiers texte dont voici une capture d'écran :
    Nom : comparer.png
Affichages : 498
Taille : 25,0 Ko

    Apparemment ce composant a été repris et amélioré ici : https://github.com/rickard67/TextDiff
    Comment as-tu gérer ta scrollbar avec les couleurs ?

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    l'image proposée au début induit une erreur d'interprétation de notre part. On a l'impression qu'il s'agit de faire de la différenciation de fichier texte alors que la demande (selon le post #4) concerne une seule grille et d'une coloration de colonne. Mais peut-être que je me trompe ?

  5. #5
    Membre très actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Par défaut
    Pour afficher les différences entre les deux colonnes de StringGrid voila ce qu'il faut faire a mon avis

    Utiliser un DrawGrid et fixer la hauteur par défaut des éléments au plus petit possible 3 ou 4 pixels
    Le DrawGrid doit contenir le même nombre de lignes que le StringGrid
    Dans OnDrawCell de DrawGrid comparer les deux cellules de la même ligne en StringGrid et utiliser cette information pour dessiner la cellule.

    La synchronisation entre les deux grilles est faite par OnSelectCell et OnTopLeftChanged

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Novembre 2012
    Messages : 27
    Par défaut
    Citation Envoyé par wheel Voir le message
    Pour afficher les différences entre les deux colonnes de StringGrid voila ce qu'il faut faire a mon avis

    Utiliser un DrawGrid et fixer la hauteur par défaut des éléments au plus petit possible 3 ou 4 pixels
    Le DrawGrid doit contenir le même nombre de lignes que le StringGrid
    Dans OnDrawCell de DrawGrid comparer les deux cellules de la même ligne en StringGrid et utiliser cette information pour dessiner la cellule.

    La synchronisation entre les deux grilles est faite par OnSelectCell et OnTopLeftChanged
    Merci pour ta réponse. Tu aurais un exemple à proposer stp ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Novembre 2012
    Messages : 27
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    l'image proposée au début induit une erreur d'interprétation de notre part. On a l'impression qu'il s'agit de faire de la différenciation de fichier texte alors que la demande (selon le post #4) concerne une seule grille et d'une coloration de colonne. Mais peut-être que je me trompe ?
    Bonjour, oui l'image induit un peu en erreur effectivement, pardon. Mais effectivement vous avez bien compris. J'ai uniquement un StringGrid avec 2 colonnes et disons par exemple 200 lignes. Et je souhaiterai afficher une barre latérale (comme celle sur la gauche du logiciel WInMerge) indiquant ou on se trouve actuellement dans le StringGrid et qui permet de visualiser les différences entre les deux colonnes. Cela devra être synchronisé avec la scrollbar du StringGrid.

  8. #8
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 679
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par theboss25 Voir le message
    Comment as-tu gérer ta scrollbar avec les couleurs ?
    Ce projet est en VCL (première version publiée sur Internet en décembre 2004...). J'avais fait de la même manière que la barre verticale représentant une mini map visible sur la capture d'écran de l'accueil de l'aide en ligne. Plus précisément, la "barre de mini carte" est la barre verticale entre l'ascenseur vertical de la zone d'édition et la fenêtre ancrable "Mini carte".

    C'est un simple TPanel aligné sur la droite de la fenêtre qui contient un TPaintBox. Le TPaintBox est aligné pour occuper tout le panel.
    Je dessine directement des rectangles plein d'une couleur unie (méthode FillRect) dans le canvas du TPaintBox via l'événement OnPaint. Les rectangles ont une largeur égale à la largeur du TPaintBox mais pour leur hauteur, un calcul est nécessaire. La hauteur du TPaintBox symbolise toutes les lignes du fichiers.
    On connait le nombre de ligne total du fichier, on connait la hauteur du TPaintBox, il est donc facile de déterminer la hauteur du rectangle à dessiner de couleur pleine.

    Dans mon cas (comparaison de fichiers textes), le composant TDiff a effectué la comparaison. Je boucle donc sur chaque ligne du résultat de la comparaison. En fonction du type de la ligne (si elle est inchangée, modifiée, supprimée, ajoutée), je dessine dans le TPaintBox un rectangle de la couleur symbolisant le type de ligne à la position x = 0, y = l'indice de la ligne * hauteur de TPaintBox / le nombre de ligne total. La largeur du rectangle à dessiner est la largeur du TPaintBox et d'une hauteur de (l'indice de la ligne + 1) * hauteur de TPaintBox / le nombre de ligne total.

    Pour compléter, je gère aussi le OnMouseDown du TPaintBox afin que si l'utilisateur clic sur la TPaintBox, la zone d'édition se déplace à l'endroit équivalent au clic.
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  9. #9
    Membre très actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Par défaut
    J'ai uniquement un StringGrid avec 2 colonnes et disons par exemple 200 lignes.
    200 lignes c'est dérisoire, j'ai cru que tu voulais comparer des fichiers sources qui peuvent dépasser des dizaines de millier de lignes voila pourquoi le choix de DrawGrid. .. si tu as des données limités il existe d'autre solutions plus légères comme TPaintBox ou TImage.

    Regarder cet exemple concernant DrawGrid

    Fichiers attachés Fichiers attachés

  10. #10
    Membre expérimenté
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Décembre 2014
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Décembre 2014
    Messages : 115
    Par défaut
    Bonjour,

    à mon avis il suffit d'écrire l'évènement OnDrawCell comme ci-dessous:
    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
     
    unit Unit1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids;
     
    type
      TForm1 = class(TForm)
        Grid1: TStringGrid;
        procedure FormCreate(Sender: TObject);
        procedure Grid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
          State: TGridDrawState);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        procedure RandomGrid;
      end;
     
    var
      Form1: TForm1;
     
    function RandomStr (aLen: Integer): String;
     
    implementation
     
    {$R *.dfm}
     
    // just for the test
    function RandomStr (aLen: Integer): String;
    var i: Integer;
    begin
      SetLength(result, aLen);
      for i := 1 to aLen do
        result[i] := Chr(Random(26) +65);
    end;
     
    procedure TForm1.RandomGrid;
    var i: Integer;
    begin
      for i := 0 to Grid1.RowCount-1 do
      begin
        Grid1.Cells[0, i] := RandomStr(50);
        if i  mod 6 <> 0  then
          Grid1.Cells[1, i] := Grid1.Cells[0, i]
        else
          Grid1.Cells[1, i] := 'à mettre en rouge';
      end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
        Grid1.Width := 1024;
        Grid1.ColCount := 2;
        Grid1.RowCount := 1000;
        Grid1.FixedCols := 0;
        Grid1.FixedRows := 0;
        Grid1.DefaultColWidth := 500;
        RandomGrid;
    end;
     
    procedure TForm1.Grid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    begin
      if (aCol=1) and (Grid1.Cells[0, aRow] <> Grid1.Cells[1, aRow] ) then
      with Grid1 do begin
        Canvas.Rectangle(Rect);
        Canvas.Font.Color := clRed;
        Canvas.TextOut(Rect.Left, Rect.Top, Cells[0, aRow]);
      end;
    end;
     
    end.
    Dans Grid1 DefaultDrawCell doit rester à True.

    solilog

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Novembre 2012
    Messages : 27
    Par défaut
    Citation Envoyé par wheel Voir le message
    200 lignes c'est dérisoire, j'ai cru que tu voulais comparer des fichiers sources qui peuvent dépasser des dizaines de millier de lignes voila pourquoi le choix de DrawGrid. .. si tu as des données limités il existe d'autre solutions plus légères comme TPaintBox ou TImage.

    Regarder cet exemple concernant DrawGrid

    C'est top, merci pour la proposition. Il faudrait qu'on ne puisse pas scroller dans le drawgrid, ce que je veux dire c'est que le DrawGrid sans scrollbar doit représenter l'ensemble de la StringGrid.

  12. #12
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 491
    Par défaut
    Salut

    le mieux est au debut de dissocier les deux
    tu as deux Canvas (image ,scrollbox) et deux TRichedit

    tu cherche les différences dans deux listes distinct pour une question de simplification une fois les liste obtenu
    tu redessine les Canvas avec comme unité de mesure le pixels

    pour les TRichedit c'est un peu pareil tu dessine la couleur ou se trouve l'erreur
    ensuite a toi de savoir ou tu te trouve dans le fichier afin de calculer et d'entourer la zone visible sur le Canvas


    Ps : il y a une etude de john Colibri sur le sujet ici

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Novembre 2012
    Messages : 27
    Par défaut
    Merci pour les réponses.

    Je reprécise que j'utilise un stringgrid et je vais uniquement comparer les cellules de 2 colonnes consécutives, en gros si StringGrid.Cell[0,1] <> StringGrid.Cell[1,1] alors je vais "colorier" le texte en rouge pour indiquer une différence sinon je ne fais rien.

    Comme le stringrid comporte beaucoup de lignes et qu'il n'y a possiblement que 2 différences entre les colonnes, c'est pourquoi j'aimerai dessiner dans la scrollbar les endroits ou il y a les différences.

Discussions similaires

  1. [XL-2007] Mettre en évidence des similitudes entre 2 colonnes de 2 Listbox
    Par BERRACHED SAID dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/11/2014, 20h00
  2. [XL-2007] Selection avec répartition des valeurs sur les colonnes
    Par lili31 dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 20/04/2012, 10h16
  3. SelectDirectory() avec visualisation des fichiers
    Par Pascale38 dans le forum C++Builder
    Réponses: 14
    Dernier message: 27/01/2011, 23h33
  4. Réponses: 0
    Dernier message: 29/04/2010, 16h50
  5. [XL-2003] Comparaison des données entre plusieurs colonnes
    Par floctc dans le forum Excel
    Réponses: 6
    Dernier message: 08/12/2009, 20h56

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