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 :

SplitString d'un texte saisi, problème de séparateur


Sujet :

Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 298
    Par défaut SplitString d'un texte saisi, problème de séparateur
    bonjour
    j'ai encore besoin d'un conseil
    quand je sépare mon edit2.text avec la commande ch1:=SplitString(edit2.text,' ');
    si j'ai un espace avant les chiffres ou après sa me fait une erreur donc j'ai fait sa
    merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    edit2.text:=TrimRight(form1.Edit2.Text);
    edit2.text:=Trimleft(form1.Edit2.Text);
    saisie:=edit2.text;
    Edit2.Text:=saisie;
    if form1.Edit2.Text='' then begin
     showmessage('edit vide pas de chiffre');
     exit;
     end;
     ch1:=SplitString(saisie,' ');
     l:=length(ch1);

  2. #2
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 630
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tintin62 Voir le message
    bonjour
    j'ai encore besoin d'un conseil
    quand je sépare mon edit2.text avec la commande ch1:=SplitString(edit2.text,' ');
    si j'ai un espace avant les chiffres ou après sa me fait une erreur donc j'ai fait sa
    merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    edit2.text:=TrimRight(form1.Edit2.Text);
    edit2.text:=Trimleft(form1.Edit2.Text);
    saisie:=edit2.text;
    Edit2.Text:=saisie;
    if form1.Edit2.Text='' then begin
     showmessage('edit vide pas de chiffre');
     exit;
     end;
     ch1:=SplitString(saisie,' ');
     l:=length(ch1);
    Pourquoi utiliser TrimRight/TrimLeft quand Trim nettoie les deux côtés d’une chaîne ?

    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
    var
      saisie: string;
      SL: TStringList;
      i: Integer;
      value: Integer;
      Ints: TArray<Integer>;
    begin
      saisie := Trim(Edit2.Text);
     
      if saisie = '' then
      begin
        ShowMessage('Edit vide pas de chiffre');
        Exit;
      end;
     
      SL := TStringList.Create;
      try
        SL.Delimiter := ' ';
        SL.StrictDelimiter := True; 
        SL.DelimitedText := saisie;
     
        SetLength(Ints, 0);
        for i := 0 to SL.Count - 1 do
        begin
          if SL[i] = '' then
            Continue;
     
          if TryStrToInt(SL[i], value) then
          begin
            SetLength(Ints, Length(Ints) + 1);
            Ints[High(Ints)] := value;
          end
          else
          begin
            ShowMessage(Format('Token non entier trouvé: "%s" (position %d)', [SL[i], i+1]));
            Exit;
          end;
        end;
     
        // Utilisation des entiers récupérés
        if Length(Ints) = 0 then
          ShowMessage('Aucun entier trouvé')
        else
          ShowMessage(Format('%d entier(s) valides trouvés. Premier = %d', [Length(Ints), Ints[0]]));
      finally
        SL.Free;
      end;
    end;
    Si tu as une nouvelle question, crée un nouveau sujet dans le forum correspondant (Débuter, etc...).
    On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 727
    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 727
    Billets dans le blog
    65
    Par défaut Si tu as une nouvelle question, crée un nouveau sujet dans le forum correspondant (Débuter, etc...).
    Fait
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 630
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Fait
    Merci SergioMaster.
    On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 746
    Par défaut
    Pourquoi utiliser TrimRight/TrimLeft quand Trim nettoie les deux côtés d’une chaîne ?
    Oui mais il ne touche pas ce qu'il y a au milieu de la chaîne.

    de [espace][espace]10[espace][espace]20[espace] avec Trim vous arrivez à cela 10[espace][espace]20
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  6. #6
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 630
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Oui mais il ne touche pas ce qu'il y a au milieu de la chaîne.

    de [espace][espace]10[espace][espace]20[espace] avec Trim vous arrivez à cela 10[espace][espace]20
    Bonjour Fred1599,

    Oui mais il ne touche pas ce qu'il y a au milieu de la chaîne.
    Effectivement
    si j'ai un espace avant les chiffres ou après sa me fait une erreur
    Avant toute opération d'extraction, il est conseillé de normaliser la chaîne en réduisant les séquences d'espaces multiples à un seul espace délimiteur, ce qui garantit une segmentation fiable des données.

    Pour ma part, c'est de cette façon que j'aurais procédé, Si l'on suppose que le sujet est toujours lié au numéro de l'Euromillion :

    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
    function NormaliserChaine(const S: string): string;
    begin
      Result := Trim(S);
      while Pos('  ', Result) > 0 do
        Result := StringReplace(Result, '  ', ' ', [rfReplaceAll]);
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      saisie: string;
      SL: TStringList;
      i: Integer;
      value: Integer;
      Ints: TArray<Integer>;
    begin
      // Normalisation de la chaîne
      saisie := NormaliserChaine(Edit1.Text);
     
      if saisie = '' then
      begin
        ShowMessage('Edit vide, pas de chiffre');
        Exit;
      end;
     
      Edit1.Text := saisie;
     
      SL := TStringList.Create;
      try
        SL.Delimiter := ' ';
        SL.StrictDelimiter := True;
        SL.DelimitedText := saisie;
     
        SetLength(Ints, 0);
        for i := 0 to SL.Count - 1 do
        begin
          if SL[i] = '' then
            Continue;
     
          if TryStrToInt(SL[i], value) then
          begin
            SetLength(Ints, Length(Ints) + 1);
            Ints[High(Ints)] := value;
          end
          else
          begin
            ShowMessage(Format('Token non entier trouvé: "%s" (position %d)', [SL[i], i + 1]));
            Exit;
          end;
        end;
     
        if Length(Ints) = 0 then
          ShowMessage('Aucun entier trouvé')
        else
          ShowMessage(Format('%d entier(s) valides trouvés. Premier = %d', [Length(Ints), Ints[0]]));
      finally
        SL.Free;
      end;
    end;
    Nom : Video_2025_11_01-1_edit_0.gif
Affichages : 128
Taille : 151,4 Ko

    Et, pour garantir une extraction fiable des entiers, il serait aussi judicieux de supprimer tous les caractères non numériques (hors espaces) avant de normaliser la chaîne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var
      i: Integer;
      temp: string;
    begin
      temp := '';
      for i := 1 to Length(S) do
      begin
        if S[i].IsDigit or (S[i] = ' ') then
          temp := temp + S[i];
      end;
    On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 746
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := StringReplace(Result, '  ', ' ', [rfReplaceAll]);
    Avec rfReplaceAll, la boucle while est inutile car StringReplace remplace déjà toutes les occurrences. Cependant, si vous avez plus de 3 espaces consécutifs (ex: "1 2"), un seul passage ne suffira pas.

    J'utiliserai plutôt une expression régulière,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    uses System.RegularExpressions;
     
    function NormaliserChaine(const S: string): string;
    begin
      Result := Trim(TRegEx.Replace(S, '\s+', ' '));
    end;
    Niveau perf, même si on s'en fou dans ce cas de figure, utilisez TList<Integer> au lieu de redimensionner constamment le tableau avec SetLength serait je pense une bonne idée
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 298
    Par défaut
    bonjour
    sa marche et sa avec seulement une ligne chapeau
    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
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,system.RegularExpressions;
     
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Button2: TButton;
        procedure Button2Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
     Form1: TForm1;
    implementation
     
    {$R *.dfm}
     
     function NormaliserChaine(const S: string): string;
    begin
      Result := Trim(TRegEx.Replace(S, '\s+', ' '));
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      edit1.Text:=NormaliserChaine(edit1.text);
    end;
     
    end.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 298
    Par défaut
    bonjour
    même si sa marche le version de Fred1599
    je voulais tous de même essayer de créer ma propre version
    pas jolie comme code mais sa marche aussi
    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
     
     
    unit Unit1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
     
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      lett: set  of '0'..'9';
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
     var
    f,l,a:integer;
     saisie,mot:string;
     ligne:char;
     chiffre:array[1..6] of string;
     
    begin
    lett:= ['0'..'9'];
     
    edit1.Text:=trim(edit1.text);
    saisie:=trim(form1.Edit1.text);
    saisie:=saisie+' ';
     
     l:=length(saisie);
     f:=1;
     a:=1;
     
      while f<l-1 do begin
      ligne:=saisie[f];
     
      while ligne in lett do begin
        chiffre[a]:=chiffre[a]+saisie[f] ;
        f:=f+1;
        ligne:=saisie[f];
        if ligne=' ' then begin
          a:=a+1;
          f:=f-1;
        end;
     
      end;
        f:=f+1
      end;
     
      for f:=1 to a do mot:=mot+chiffre[f]+' ';
      edit1.Text:=mot;
    end;
     
    end.

  10. #10
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 630
    Billets dans le blog
    1
    Par défaut Version encore plus simple TRegEx
    Citation Envoyé par tintin62 Voir le message
    bonjour
    même si sa marche le version de Fred1599
    je voulais tous de même essayer de créer ma propre version
    pas jolie comme code mais sa marche aussi
    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
     
     
    unit Unit1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
     
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      lett: set  of '0'..'9';
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
     var
    f,l,a:integer;
     saisie,mot:string;
     ligne:char;
     chiffre:array[1..6] of string;
     
    begin
    lett:= ['0'..'9'];
     
    edit1.Text:=trim(edit1.text);
    saisie:=trim(form1.Edit1.text);
    saisie:=saisie+' ';
     
     l:=length(saisie);
     f:=1;
     a:=1;
     
      while f<l-1 do begin
      ligne:=saisie[f];
     
      while ligne in lett do begin
        chiffre[a]:=chiffre[a]+saisie[f] ;
        f:=f+1;
        ligne:=saisie[f];
        if ligne=' ' then begin
          a:=a+1;
          f:=f-1;
        end;
     
      end;
        f:=f+1
      end;
     
      for f:=1 to a do mot:=mot+chiffre[f]+' ';
      edit1.Text:=mot;
    end;
     
    end.
    On recherche dans Edit1 toutes les suites de chiffres avec la regex \d+, on parcourt la collection de correspondances et on concatène chaque nombre trouvé en les séparant par un espace, puis on remplace le contenu de Edit1 par cette nouvelle chaîne.

    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
    uses
      System.Classes, System.RegularExpressions;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Matches: TMatchCollection;
      i: Integer;
      sb: TStringBuilder;
    begin
      Matches := TRegEx.Matches(Edit1.Text, '\d+');
      sb := TStringBuilder.Create;
      try
        for i := 0 to Matches.Count - 1 do
        begin
          if sb.Length > 0 then sb.Append(' ');
          sb.Append(Matches[i].Value);
        end;
        Edit1.Text := sb.ToString;
      finally
        sb.Free;
      end;
    end;
    Nom : Video_2025_11_02-6_edit_0.gif
Affichages : 95
Taille : 42,6 Ko
    On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:

Discussions similaires

  1. Vérification du texte saisi
    Par Attilius dans le forum Flash
    Réponses: 7
    Dernier message: 14/07/2006, 18h45
  2. [D7] Longueur du texte saisi dans un Tedit
    Par Thierry Laborde dans le forum Delphi
    Réponses: 6
    Dernier message: 11/07/2006, 20h08
  3. transferer un texte saisi d'un EDIT vers un autre EDIT
    Par yoyothebest dans le forum MFC
    Réponses: 2
    Dernier message: 22/03/2006, 16h32
  4. [FLASH MX2004] Test si texte saisie vide
    Par mohican13 dans le forum Flash
    Réponses: 2
    Dernier message: 03/03/2005, 09h26
  5. [VB.NET] [VS.NET] Tester si le texte saisi est un entier
    Par San Soussy dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/10/2004, 11h41

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