IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Blog de Serge Girard (aka SergioMaster)

[FMX] TStringGrid, copie des données vers le presse-papier

Note : 2 votes pour une moyenne de 3,00.
par , 04/07/2022 à 10h58 (817 Affichages)
Le contexte
Récemment, je me suis confronté à un échange de données entre deux sociétés (un fabricant et un prestataire logistique) et ai découvert de nombreuses incohérences de codification entre celles-ci. Mauvaise orthographe de nom de produit ou, pire, mauvaise codification de l'article et même doublons font partie du recensement.
Pour pallier les problèmes d'échanges, il m'a fallu écrire un programme pour d'un côté lire le fichier CSV et le contrôler par rapport aux données du fabricant, le rapport étant mis dans un tableau (TStringGrid). L'idée de pouvoir copier les données du tableau dans le presse-papier pour pouvoir ensuite traiter celles-ci indifféremment dans un tableur ou autre s'est alors imposée assez naturellement.

Je vous avoue que lorsque j'écris des programmes FMX, je n'utilise que très rarement des grilles, et plus souvent le TGrid d'ailleurs, aussi ai-je été étonné de certains manques par rapport aux "mêmes" grilles VCL. Par "même", j'entends de mêmes noms, aussi, pour les distinguer, j'ai désormais tendance à mettre le préfixe devant.
Des différences essentielles dans ce contexte sautent aux yeux :
  • VCL.StringGrid permet de fixer des lignes et des colonnes (propriétés FixedRows et FixedCols) ce qui n'est pas le cas pour son synonyme FMX.
  • VCL.StringGrid offre une option de sélection multiple (goRangeSelect) totalement absente de FMW.StringGrid.Options.

D'autres différences seront plus "subtiles" pour tout ce qui est dessin de cellule mais, j'y reviendrai plus tard.

Alors que mon objectif de départ était de faire une copie entière du tableau, de fil en aiguille, je me suis pris au jeu de proposer une solution plus indépendante et plus sélective. Assez vite s'est imposée dans mon esprit l'utilisation d'un Helper (les Class Helpers sont apparus avec la version Delphi 2005 et ont largement évolués au fil des versions suivantes), dans une unité indépendante pour réutilisation possible.

Proposition de code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
TStringGrid2Clipboard = class helper for TStringGrid
  private
    function AddStringSeparator(const s : String; const stringseparator : Char) : String;
  public
    // fonctions sur tableau
    function FullGrid2Clipboard(const addheader : boolean = true; const stringseparator : char =#0) : boolean;
    function SelectColumns2Clipboard(var Cols : TArray<integer>; const addheader : boolean = false; const stringseparator : char =#0) : boolean;
    function SelectRows2Clipboard(var Rows : TArray<integer>; const addheader : boolean = false; const stringseparator : char =#0) : boolean;
    function SelectColRows2Clipboard(var Cols,Rows : TArray<integer>; const addheader : boolean = false; const stringseparator : char = #0) : boolean;
    // fonction sur sélection de cellules
    function CellRange2ClipBoard(var Selected : TRect ; const addheader : boolean = false; const stringseparator : char =#0) : boolean;
  end;
Code complet FMX.StringGridHelper.pas

Il ne me restait plus alors qu'à élaborer un programme de test.

Nom : Capture.PNG
Affichages : 188
Taille : 70,8 Ko

Qui m'a permis de me confronter aux diverses difficultés de l'interface utilisateur concernant les sélections, mais aussi affichages.
N'étant le sujet principal de ce billet, vous retrouverez les sources de ce test à jour dans ce dépôt Github

N.B. Loin d'être parfait, mon attention étant surtout tournée vers les applications Desktop, n'hésitez pas à participer à son évolution via vos commentaires ou des interventions directes sur mon dépôt (Issues ou Pull request).

D'ores et déjà, je prévois :
  • Une étude de l'affichage prenant en compte les styles,
  • Des tests plus poussés en cas de cibles "mobiles" impliquant donc les gestes,
  • Une intégration plus poussée passant par une modification du composant FMX.StringGrid

Enfin, si vous ne voulez pas réinventer la roue, des composants tiers proposent déjà ces fonctionnalités, je pense en particulier au TMSFMXGrid qu'il m'est arrivé d'utiliser à cet effet.

Envoyer le billet « [FMX] TStringGrid, copie des données vers le presse-papier » dans le blog Viadeo Envoyer le billet « [FMX] TStringGrid, copie des données vers le presse-papier » dans le blog Twitter Envoyer le billet « [FMX] TStringGrid, copie des données vers le presse-papier » dans le blog Google Envoyer le billet « [FMX] TStringGrid, copie des données vers le presse-papier » dans le blog Facebook Envoyer le billet « [FMX] TStringGrid, copie des données vers le presse-papier » dans le blog Digg Envoyer le billet « [FMX] TStringGrid, copie des données vers le presse-papier » dans le blog Delicious Envoyer le billet « [FMX] TStringGrid, copie des données vers le presse-papier » dans le blog MySpace Envoyer le billet « [FMX] TStringGrid, copie des données vers le presse-papier » dans le blog Yahoo

Commentaires