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

Composants FMX Delphi Discussion :

Grid (StringGrid) vers presse- papier


Sujet :

Composants FMX Delphi

  1. #1
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 135
    Points : 41 300
    Points
    41 300
    Billets dans le blog
    63
    Par défaut Grid (StringGrid) vers presse- papier
    Bonjour,

    ce que j'ai écrit comme code
    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
    if TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService,Clip) then
     begin
      sl := TStringList.Create;
      try
       sl.StrictDelimiter := true;
       sl.Delimiter := #9;
       for I := 0 to StringGrid1.RowCount-1 do
        begin
          clipText:=Format('%s'#9'%s'#9'%s'#9'%s',
                           [StringGrid1.Cells[0,i],
                            StringGrid1.Cells[1,i],
                            StringGrid1.Cells[2,i],
                            StringGrid1.Cells[3,i],
                            StringGrid1.Cells[4,i]]);
          Sl.Add(ClipText+SLineBreak);
       end;
      Clip.SetClipboard(sl.DelimitedText);
      Datas.MessageService.MessageDialogSync('Tableau copié dans le presse-papier',
                                                TMsgDlgType.mtInformation,
                                                [TMsgDlgBtn.mbOk],
                                                TMsgDlgBtn.mbOk,
                                                0);
     
      finally
        SL.Free;
      end;
    ne me donne pas tout à fait le résultat escompté quand je le récupère dans un tableau (open office, mais il en serait certainement de même avec MS Excel)
    voici un échantillon de la sortie (en rouge ce qui semble ne pas aller)
    "1 BADRAS/1404-001340 MU2020447001340 0
    " "2 BADRAS/1404-001345 MU2020447001345 1
    " "3 BADRAS/1404-001350 MU2020447001350 1
    " "4 BADRAS/1404-001355 MU2020447001355 1
    " "5 BADRAS/1404-001360 MU2020447001360 1
    " "6 BADRAS/1404-001365 MU2020447001365 1
    " "7 BADRAS/1404-001370 MU2020447001370 2
    " "8 BADRAS/1404-001375 MU2020447001375 2

    Donc, je me..e quelque part, mais la question est où ?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 597
    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 597
    Points : 25 280
    Points
    25 280
    Par défaut
    Pour ne pas le faire sans TStringList
    On dirait que le SLineBreak est considéré comme donnée donc retour à la ligne entre " " (QuoteChar)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       for I := 0 to StringGrid1.RowCount-1 do
        begin
          clipText:=clipText + Format('%0:s'#9'%1:s'#9'%2:s'#9'%3:s'#9'%4:s', // vérifie tes indices
                           [StringGrid1.Cells[0,i],
                            StringGrid1.Cells[1,i],
                            StringGrid1.Cells[2,i],
                            StringGrid1.Cells[3,i],
                            StringGrid1.Cells[4,i]])+ SLineBreak;
       end;
       Clip.SetClipboard(clipText);
    A toi de voir pour les " " en plus via

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          clipText:=clipText + AnsiQuotedStr(Format('...', []), '"') + SLineBreak;

  3. #3
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 614
    Points
    3 614
    Par défaut
    il ne te manquerait pas une chaîne dans le formatage ?

    m'est avis que le saut de ligne en fin de chaîne le perturbe pour une raison ou une autre, il devrait les faire tout seul lors de l'export, non ?

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 597
    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 597
    Points : 25 280
    Points
    25 280
    Par défaut
    Avec StrictDelimiter à #9 c'est plutôt eux qui devraient être perturbé
    la présence #9 provoque le QuoteChar, et le CRLF lui est une donnée comme une autre.
    d'ailleurs " " est surement "#9" puisque Delimiter est ajouté, du coup tu as un problème d'avoir le même délimiteur entre colonne et ligne.

    On mon avis un .Text avec par défaut Delimiter CRLF, QuoteChar " fonctionnerait très bien
    Il y a une confusion, entre le le délimiteur de colonne et délimiteur de ligne, c'est à deux dimensions, alors que la TStringList n'est que sur une seule dimension

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 135
    Points : 41 300
    Points
    41 300
    Billets dans le blog
    63
    Par défaut
    Finalement avec acharnement et simplifications
    ceci fonctionne
    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
     
    if TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService,Clip) then
     begin
      sl := TStringList.Create;
      try
       for I := 0 to StringGrid1.RowCount-1 do
        begin
          clipText:=Format('%s,%s,%s,%s,%s',
                           [StringGrid1.Cells[0,i],
                            StringGrid1.Cells[1,i],
                            StringGrid1.Cells[2,i],
                            StringGrid1.Cells[3,i],
                            StringGrid1.Cells[4,i]]);
          Sl.Add(ClipText);
       end;
      Clip.SetClipboard(sl.Text);
      Datas.MessageService.MessageDialogSync('Tableau copié dans le presse-papier',
                                                TMsgDlgType.mtInformation,
                                                [TMsgDlgBtn.mbOk],
                                                TMsgDlgBtn.mbOk,
                                                0);
     
      finally
        SL.Free;
      end;
     end;
    On ne serait donc pas obligé d'utiliser tabulation comme séparateur (il faut juste faire attention au moment de la copie)
    à moins que par convention le #9 soit recommandé ?

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 135
    Points : 41 300
    Points
    41 300
    Billets dans le blog
    63
    Par défaut
    Merci à tout les deux
    Citation Envoyé par pprem Voir le message
    il ne te manquerait pas une chaîne dans le formatage ?
    si, vu après coup
    On dirait que le SLineBreak est considéré comme donnée
    il fallait le virer, j'ai mélangé un traitement via un string qui ne me plaisait guère par un traitement d'une stringlist

    j'ai quand même refait une tentative avec de #9 histoire de me rassurer sans cette histoire de StrictDelimiter (j'ai du mal maitriser), ça passe très bien (ouf, c'est pas encore aujourd'hui que je sauterai par ma porte fenêtre au rez de chaussée )

    Cela donnera de l'eau au moulin de certains qui s'écrieront que la stringgrid VCL à moins que ce soit Lazarus a une fonction pour le faire (mais est-ce bien sûr ?) cela dit, un helper est facile à ajouter @Gilles
    pour bien faire il faudrait ajouter la prise en compte de sélection de lignes et de colonnes mais il s'agit d'un besoin si ponctuel que je vais procrastiner, régler l'urgence et, peut-être, rédiger plus tard un billet ou une FAQ si elle n'existe pas ?

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 135
    Points : 41 300
    Points
    41 300
    Billets dans le blog
    63
    Par défaut
    Ce n'est pas encore peaufiné dans une unité indépendante mais, que pensez-vous de cette ébauche ?

    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
    uses FMX.Platform, FMX.Grid;
     
      TStringGrid2Clipboard = class helper for TStringGrid
      public
        function FullGrid2Clipboard(const addheader : boolean = true; const stringseparator : String ='') : boolean;
        function SelectedCells2Clipboard(const addheader : boolean = false; const stringseparator : String ='') : boolean;
      end;
     
    { TStringGrid2Clipboard }
     
    function TStringGrid2Clipboard.FullGrid2Clipboard(const addheader : boolean = true;
      const stringseparator : String =''): boolean;
    var Clip : IFMXClipboardService;
        ct : String;
        sl: TStringList;
        r,c : word;
    begin
    result:=false;
    if TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService,Clip) then
     begin
      sl := TStringList.Create;
      try
       if addheader then
         begin
           ct:='';
           for c:=0 to self.ColumnCount-1 do
            begin
              if c>0 then ct:=ct+#9;
              ct:=ct+StringSeparator+Self.Columns[c].Header+StringSeparator;
            end;
            Sl.Add(ct);
         end;
       for r := 0 to Self.RowCount-1 do
        begin
          ct:='';
          for c := 0 to Self.ColumnCount-1 do
          begin
           if c>0 then ct:=ct+#9;
           ct:=ct+StringSeparator+Self.Cells[c,r]+StringSeparator;
          end;
           Sl.Add(ct);
       end;
       Clip.SetClipboard(sl.Text);
       result:=true;
      finally
        SL.Free;
      end;
     end;
    end;
     
    function TStringGrid2Clipboard.SelectedCells2Clipboard(const addheader: boolean;
      const stringseparator: String): boolean;
    begin
    // todo : prendre en compte sélection
    end;

  8. #8
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 135
    Points : 41 300
    Points
    41 300
    Billets dans le blog
    63
    Par défaut
    Je viens de m'apercevoir que mon ambition sur la récupération des cellules sélectionnées se heurte en FMX à un truc de taille,
    on ne peut pas sélectionner un ensemble de cellules (pas d'option gomultiselect !)

    j'en suis quitte pour proposer ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      TStringGrid2Clipboard = class helper for TStringGrid
      public
        function FullGrid2Clipboard(const addheader : boolean = true; const stringseparator : String ='') : boolean;
        function SelectColumns2Clipboard(var Cols : TArray<integer>; const addheader : boolean = false; const stringseparator : String ='') : boolean;
        function SelectRows2Clipboard(var Rows : TArray<integer>; const addheader : boolean = false; const stringseparator : String ='') : boolean;
        function SelectColRowsClipboard(var Cols,Rows : TArray<integer>; const addheader : boolean = false; const stringseparator : String ='') : boolean;
      end;

  9. #9
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 135
    Points : 41 300
    Points
    41 300
    Billets dans le blog
    63
    Par défaut
    Sujet rouvert pour discuter des solutions pour pallier le défaut de l'option de sélection de plusieurs cellules
    - le premier choix serait, bien sur, une opération longue de composant dérivé
    - le second choix, créé une nouvelle fonction dans le helper (maintenant j'ai l'habitude), l'inconvénient va résider dans la partie visuelle (encadrement de la sélection) et pratique (utilisation des onkeypress , adieu os mobiles)

    La fonction sera très certainement exprimée ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        function RangeCell2Clipboard(var Selected : TRect ; const addheader : boolean = false; const stringseparator : String ='') : boolean;
    Ah, oui, il y a aussi une chose qui me dérange, par flemme, hier soir, j'ai déclaré le paramètre stringseparator comme un string et non un Char (ce qui serait plus juste) car l'instruction qui suit me renvoyait une erreur
    donc, toute suggestion pour remplacer cette instruction (je pense déjà à une fonction privée)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ct:=ct+StringSeparator+Self.Columns[c].Header+StringSeparator;
    permettant d'ajouter un caractère à une chaine sera bienvenue.

    Bien évidemment, en plus de 30 ans de carrière, je n'ai dû utiliser le copier-coller qu'au max une poignée de fois (à part celle de ce sujet, la dernière fois fut par l'intermédiaire de TMSFMXGrid où c'est inclus) ma démarche est donc plus par curiosité que besoin pour la suite de ma demande. Je suis incorrigible

  10. #10
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 135
    Points : 41 300
    Points
    41 300
    Billets dans le blog
    63
    Par défaut
    Billet rédigé https://www.developpez.net/forums/bl...presse-papier/
    au sein de celui-ci, vous retrouverez les sources du Class Helper et l'adresse d'un dépôt GitHub pour les intéressés.

    J'ai d'autres idées en tête, qui feront certainement l'objet de futures questions, mais je marque ce sujet comme résolu

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

Discussions similaires

  1. Déplacer un bloc de texte vers un bloc note en jquery
    Par aioliamu dans le forum jQuery
    Réponses: 1
    Dernier message: 23/12/2021, 10h37
  2. Réponses: 2
    Dernier message: 24/04/2011, 19h56
  3. [VBA]Transfert Excel vers Bloc-Note
    Par Look dans le forum Excel
    Réponses: 2
    Dernier message: 05/05/2007, 16h33
  4. piloter le bloc-notes
    Par greg778 dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 23/08/2005, 11h39
  5. copier les infos d'une fenêtre dos vers le bloc notes
    Par beegees dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 16/08/2005, 13h06

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