begin process at 2010 09 06 05:29:58
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > LIBRAIRIE DE FONCTIONS DE GESTION DE SOUS-CHAINES.

LIBRAIRIE DE FONCTIONS DE GESTION DE SOUS-CHAINES.


 Information sur la source

Note :
9,67 / 10 - par 3 personnes
9,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Divers Classé sous :sous, chaine, substring, mauricio, string Niveau :Débutant Date de création :29/01/2009 Date de mise à jour :29/01/2009 18:58:40 Vu :2 333

Auteur : MAURICIO

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (15)
Ajouter un commentaire et/ou une note


 Description

Quelques fois, on aimerai avoir une sorte de "structure" de plusieurs éléments variable en taille et en nature.
Difficile donc à part si on passe par une Array of Variant. Ça devient vite saoulant  lorsqu' il faut la garder dans un fichier Ini par exemple, il faut une fonction load et une autre Save ... mouai ...

Les problèmes continuent à survenir lorsque l' on veut:
- ajouter un élément
- Supprimer un élement
- Modifier un élément
- Rechercher un élement
etc etc etc ...

Les fonctions de sous-chaines nous permettent très facilement de faire tout ça juste en utilisant une String! Vous avez dit formidable?


Historique :

Source de Kenavo :
http://www.delphifr.com/codes/SOUS-CHAINES_23762. aspx

Qui a donné naissance à ma source :
http://www.delphifr.com/codes/FONCTIONS-GESTION-S OUS-CHAINES_24099.aspx
(J'ai modifié le lien qui pointait sur une page d'ajout de code et non sur le code "Cirec")

J' ai décidé de ne pas modifier ma source précédente car le principe de gestion des sous-chaines n' est pas à 100% le même (comme par exemple le fait que cette nouvelle version admet qu' il existe toujours au moins une sous-chaine, que j' appelle "élément" maintenant).

Voilà  :)

Source

  • { SUBSTRING DEFINITION FOR DEVELOPPERS:
  • Admettons une chaine de caractères de plusieurs éléments (subStrings) séparés par n' importe quel caractère comme par exemple ';
  • !!! TRÈS IMPORTANT !!!
  • On ne peut distinguer une chaine à 1 élément vide d' une chaine sans élément.
  • Donc, si Chaine = '', on admet toujours qu' il existe 1 élément dans la chaine.
  • Pour initialiser une chaine avec son 1er élément, on fait Chaine := 'mon 1er élément';
  • Le 1er élément est sur l' Index 1.
  • Pour récupérer le 3ème élément on fait:
  • MonElement := SUBSTRING_GET('aaa;bb;ccccc;ddd;e;;g', ';', 3);
  • !!! FIM TRÈS IMPORTANT !!!
  • Exemple: Str = '' 1 élément vide
  • Exemple: Str = 'xxx' 1 élément rempli ...
  • Exemple: Str = ';' 2 éléments (vides) ...
  • Exemple: Str = 'xxx;' 2 éléments (dont 1 vide) ...
  • Exemple: Str = ';xxx' 2 éléments (dont 1 vide) ...
  • Exemple: Str = 'xxx;yyy' 2 éléments ...
  • }
  • function SUBSTRING_START(Str: String; Separateur: Char; SubStringIndex: Word): Integer;
  • function SUBSTRING_GET(Str: String; Separateur: Char; SubStringIndex: Word): ShortString;
  • procedure SUBSTRING_EDIT(Var Str: String; Separateur: Char; SubStringIndex: Word; Novovaleur: String);
  • function SUBSTRING_COUNT(Str: String; Separateur: Char): Integer;
  • procedure SUBSTRING_ADD(var Str: String; Separateur: Char; valeur: String);
  • function SUBSTRING_LENGTH(Str: String; Separateur: Char; SubStringIndex: Word): Integer;
  • procedure SUBSTRING_INSERT(var Str: String; Separateur: Char; SubStringIndex: Word; valeur: String);
  • function SUBSTRING_DELETE(var Str: string; Separateur: Char; SubStringIndex: Word): Boolean;
  • function SUBSTRING_LOCATE(Str: string; Separateur: Char; SubString: String; Options: TLocateOptions): Integer;
  • function SUBSTRING_RIBBON(Str: string; Separateur: Char; Current: Word; MoveBy: Integer): Integer; overload;
  • function SUBSTRING_RIBBON(Str: string; Separateur: Char; Current: String; MoveBy: Integer): String; overload;
  • // Nombre d' éléments :
  • function SUBSTRING_COUNT(Str: String; Separateur: Char): Integer;
  • var i, nbCars: Integer;
  • begin
  • RESULT := 1;
  • nbCars := length(Str);
  • for i := 1 to nbCars do
  • if Str[i] = Separateur
  • then RESULT := RESULT + 1;
  • end;
  • // Position dans Str du 1er caractère d' un élément :
  • function SUBSTRING_START(Str: String; Separateur: Char; SubStringIndex: Word): Integer;
  • var nbCars, curSubStringIndex, i: Integer;
  • begin
  • RESULT := 0;
  • if SubStringIndex = 0 then raise ERangeError.Create('SubStringIndex = 0!');
  • nbCars := length(Str);
  • curSubStringIndex := 1;
  • i := 0;
  • while (curSubStringIndex <> SubStringIndex) and (i < nbCars) do
  • begin
  • i := i + 1;
  • if Str[i] = Separateur
  • then curSubStringIndex := curSubStringIndex + 1; // On va passer à l' élément suivant :
  • end;
  • if curSubStringIndex = SubStringIndex
  • then RESULT := i + 1; // 'Sauter' le separateur ou i = 0...
  • end;
  • // Ajouter un élément à la fin (Très con, je sais):
  • procedure SUBSTRING_ADD(var Str: String; Separateur: Char; valeur: String);
  • begin
  • // On considère donc que Str possède déjà un élément même si Str = '',
  • // Pour insérer le 1er élément faites dans votre programme Str := 'c est mon 1er élément';
  • Str := Str + Separateur + valeur;
  • end;
  • // Récupérer un élément :
  • function SUBSTRING_GET(Str: String; Separateur: Char; SubStringIndex: Word): ShortString;
  • var nbCars, i: Integer;
  • begin
  • RESULT := '';
  • i := SUBSTRING_START(Str, Separateur, SubStringIndex);
  • nbCars := length(Str);
  • while i <= nbCars do
  • begin
  • if Str[i] <> Separateur
  • then RESULT := RESULT + Str[i]
  • else i := nbCars;
  • i := i + 1;
  • end;
  • end;
  • // Nombre de caractères d' un élément :
  • function SUBSTRING_LENGTH(Str: String; Separateur: Char; SubStringIndex: Word): Integer;
  • var i, nbCars: Integer;
  • begin
  • RESULT := Length(SUBSTRING_GET(Str, Separateur, SubStringIndex));
  • end;
  • // Insérer un élément :
  • procedure SUBSTRING_INSERT(var Str: String; Separateur: Char; SubStringIndex: Word; valeur: String);
  • var i, SubStrCount: Integer;
  • begin
  • SubStrCount := SUBSTRING_COUNT(Str, Separateur);
  • if (SubStringIndex > 0) and (SubStringIndex <= SubStrCount)
  • then begin
  • i := SUBSTRING_START(Str, Separateur, SubStringIndex);
  • Insert(valeur + Separateur, Str, i);
  • end
  • else
  • raise ERangeError.CreateFmt('%d is not within the valid range of %d..%d', [SubStringIndex, 1, SubStrCount]);
  • end;
  • // Modifier un élément même dans une position qui n' existe pas :
  • procedure SUBSTRING_EDIT(var Str: string; Separateur: Char; SubStringIndex: Word; Novovaleur: string);
  • var i, SubStrCount, nbCars: Integer;
  • begin
  • i := SUBSTRING_START(Str, Separateur, SubStringIndex);
  • if i = 0 // L' élément n' existe pas ...
  • then begin
  • SubStrCount := SUBSTRING_COUNT(Str, Separateur);
  • while SubStrCount < SubStringIndex do
  • begin
  • Str := Str + Separateur; // Ajouter um élément vide ...
  • SubStrCount := SubStrCount + 1;
  • end;
  • Str := Str + Novovaleur;
  • end
  • else begin // L' élément existe à la position i ...
  • nbCars := length(Str);
  • // Retirer valeur actuelle :
  • while i <= nbCars do
  • if Str[i] <> Separateur
  • then begin
  • Delete(Str, i, 1);
  • nbCars := nbCars - 1;
  • end
  • else
  • nbCars := 0; // fim do elemento ...
  • // Insérer la nouvelle valeur de l' élément :
  • Insert(Novovaleur, Str, i);
  • end;
  • end;
  • // Récupérer l' indice d' un élément :
  • function SUBSTRING_LOCATE(Str: string; Separateur: Char; SubString: String; Options: TLocateOptions): Integer;
  • var
  • SubStrCount, CurSubStrIndex: Integer;
  • FindPartialKey, FindCaseInsensitive: Boolean;
  • begin
  • RESULT := 0;
  • CurSubStrIndex := 1;
  • SubStrCount := SUBSTRING_COUNT(Str, Separateur);
  • FindPartialKey := loPartialKey in Options;
  • FindCaseInsensitive := loCaseInsensitive in Options;
  • if FindCaseInsensitive
  • then begin
  • Str := STRING_MAIUSCULAS(Str, []);
  • SubString := STRING_MAIUSCULAS(SubString, []);
  • end;
  • while (RESULT = 0) and (CurSubStrIndex <= SubStrCount) do
  • begin
  • if FindPartialKey
  • then begin
  • if Pos(SubString, SUBSTRING_GET(Str, Separateur, CurSubStrIndex)) = 1
  • then RESULT := CurSubStrIndex;
  • end
  • else
  • if SubString = SUBSTRING_GET(Str, Separateur, CurSubStrIndex)
  • then RESULT := CurSubStrIndex;
  • inc(CurSubStrIndex, 1);
  • end;
  • end;
  • // Permet, à la manière d' un DataSet, sauter de "MoveBy" éléments, avec la particularité de revenir au début lorsqu' on atteind le
  • dernier élément (de même si on atteind le début quand MoveBy négatif, on revient au dernier) :
  • function SUBSTRING_RIBBON(Str: string; Separateur: Char; Current: Word; MoveBy: Integer): Integer;
  • var Count: Integer;
  • begin
  • Count := SUBSTRING_COUNT(Str, Separateur);
  • RESULT := Current + MoveBy;
  • if RESULT > 0
  • then begin
  • while RESULT > Count do
  • RESULT := RESULT - Count;
  • end
  • else begin
  • while RESULT <= 0 do
  • RESULT := RESULT + Count;
  • end;
  • end;
  • // La même mais sans l' indice (par la valeur de l' élément) :
  • function SUBSTRING_RIBBON(Str: string; Separateur: Char; Current: String; MoveBy: Integer): String;
  • var SubStringIndex: Integer;
  • begin
  • SubStringIndex := SUBSTRING_LOCATE(Str, Separateur, Current, []);
  • if SubStringIndex = 0
  • then SubStringIndex := 1
  • else SubStringIndex := SUBSTRING_RIBBON(Str, Separateur, SubStringIndex, MoveBy);
  • RESULT := SUBSTRING_GET(Str, Separateur, SubStringIndex);
  • end;
  • // Retirer un élément :
  • function SUBSTRING_DELETE(var Str: string; Separateur: Char; SubStringIndex: Word): Boolean;
  • var nbCars: Integer;
  • begin
  • RESULT := false;
  • i := SUBSTRING_START(Str, Separateur, SubStringIndex);
  • if i <> 0
  • then begin
  • RESULT := True;
  • nbCars := length(Str);
  • // Remover valeur actual :
  • while i <= nbCars do
  • begin
  • if Str[i] = Separateur
  • then nbCars := 0 // fim do elemento ...
  • else nbCars := nbCars - 1;
  • Delete(Str, i, 1);
  • end;
  • end;
  • end;
{ SUBSTRING DEFINITION FOR DEVELOPPERS:
  Admettons une chaine de caractères de plusieurs éléments (subStrings) séparés par n' importe quel caractère comme par exemple ';

  !!! TRÈS IMPORTANT !!!
  On ne peut distinguer une chaine à 1 élément vide d' une chaine sans élément.
  Donc, si Chaine = '', on admet toujours qu' il existe 1 élément dans la chaine.
  Pour initialiser une chaine avec son 1er élément, on fait Chaine := 'mon 1er élément';

  Le 1er élément est sur l' Index 1.
  Pour récupérer le 3ème élément on fait:
  MonElement := SUBSTRING_GET('aaa;bb;ccccc;ddd;e;;g', ';', 3);
  !!! FIM TRÈS IMPORTANT !!!

  Exemple: Str = ''                 1 élément vide
  Exemple: Str = 'xxx'              1 élément rempli ...
  Exemple: Str = ';'                2 éléments (vides) ...
  Exemple: Str = 'xxx;'             2 éléments (dont 1 vide) ...
  Exemple: Str = ';xxx'             2 éléments (dont 1 vide) ...
  Exemple: Str = 'xxx;yyy'          2 éléments ...
}

     function SUBSTRING_START(Str: String; Separateur: Char; SubStringIndex: Word): Integer;
     function SUBSTRING_GET(Str: String; Separateur: Char; SubStringIndex: Word): ShortString;
     procedure SUBSTRING_EDIT(Var Str: String; Separateur: Char; SubStringIndex: Word; Novovaleur: String);
     function SUBSTRING_COUNT(Str: String; Separateur: Char): Integer;
     procedure SUBSTRING_ADD(var Str: String; Separateur: Char; valeur: String);
     function SUBSTRING_LENGTH(Str: String; Separateur: Char; SubStringIndex: Word): Integer;
     procedure SUBSTRING_INSERT(var Str: String; Separateur: Char; SubStringIndex: Word; valeur: String);
     function SUBSTRING_DELETE(var Str: string; Separateur: Char; SubStringIndex: Word): Boolean;
     function SUBSTRING_LOCATE(Str: string; Separateur: Char; SubString: String; Options: TLocateOptions): Integer;
     function SUBSTRING_RIBBON(Str: string; Separateur: Char; Current: Word; MoveBy: Integer): Integer; overload;
     function SUBSTRING_RIBBON(Str: string; Separateur: Char; Current: String; MoveBy: Integer): String; overload;


// Nombre d' éléments :
function SUBSTRING_COUNT(Str: String; Separateur: Char): Integer;
var i, nbCars: Integer;
begin
  RESULT := 1;
  nbCars := length(Str);

  for i := 1 to nbCars do
    if Str[i] = Separateur
    then RESULT := RESULT + 1;
end;

// Position dans Str du 1er caractère d' un élément : 
function SUBSTRING_START(Str: String; Separateur: Char; SubStringIndex: Word): Integer;
var nbCars, curSubStringIndex, i: Integer;
begin
  RESULT := 0;
  if SubStringIndex = 0 then raise ERangeError.Create('SubStringIndex = 0!');
  
  nbCars := length(Str);
  curSubStringIndex := 1;
  i := 0;

  while (curSubStringIndex <> SubStringIndex) and (i < nbCars) do
  begin
    i := i + 1;

    if Str[i] = Separateur
    then curSubStringIndex := curSubStringIndex + 1;   // On va passer à l' élément suivant : 
  end;

  if curSubStringIndex = SubStringIndex
  then RESULT := i + 1;    // 'Sauter' le separateur ou i = 0...
end;

// Ajouter un élément à la fin (Très con, je sais): 
procedure SUBSTRING_ADD(var Str: String; Separateur: Char; valeur: String);
begin                  
  // On considère donc que Str possède déjà un élément même si Str = '',
  // Pour insérer le 1er élément faites dans votre programme Str := 'c est mon 1er élément';
  Str := Str + Separateur + valeur;
end;

// Récupérer un élément : 
function SUBSTRING_GET(Str: String; Separateur: Char; SubStringIndex: Word): ShortString;
var nbCars, i: Integer;
begin
  RESULT := '';
  i := SUBSTRING_START(Str, Separateur, SubStringIndex);
  nbCars := length(Str);

  while i <= nbCars do
  begin
    if Str[i] <> Separateur
    then RESULT := RESULT + Str[i]
    else i := nbCars;

    i := i + 1;
  end;
end;

// Nombre de caractères d' un élément :
function SUBSTRING_LENGTH(Str: String; Separateur: Char; SubStringIndex: Word): Integer;
var i, nbCars: Integer;
begin
  RESULT := Length(SUBSTRING_GET(Str, Separateur, SubStringIndex));
end;

// Insérer un élément : 
procedure SUBSTRING_INSERT(var Str: String; Separateur: Char; SubStringIndex: Word; valeur: String);
var i, SubStrCount: Integer;
begin
  SubStrCount := SUBSTRING_COUNT(Str, Separateur);

  if (SubStringIndex > 0) and (SubStringIndex <= SubStrCount)
  then begin
    i := SUBSTRING_START(Str, Separateur, SubStringIndex);
    Insert(valeur + Separateur, Str, i);  
  end
  else
    raise ERangeError.CreateFmt('%d is not within the valid range of %d..%d', [SubStringIndex, 1, SubStrCount]);
end;

// Modifier un élément même dans une position qui n' existe pas : 
procedure SUBSTRING_EDIT(var Str: string; Separateur: Char; SubStringIndex: Word; Novovaleur: string);
var i, SubStrCount, nbCars: Integer;
begin
  i := SUBSTRING_START(Str, Separateur, SubStringIndex);

  if i = 0          // L' élément n' existe pas ...
  then begin
    SubStrCount := SUBSTRING_COUNT(Str, Separateur);

    while SubStrCount < SubStringIndex do
    begin
      Str := Str + Separateur;          // Ajouter um élément vide ...
      SubStrCount := SubStrCount + 1;
    end;

    Str := Str + Novovaleur;
  end
  else begin        // L' élément existe à la position i ...
    nbCars := length(Str);
    // Retirer valeur actuelle :
    while i <= nbCars do
      if Str[i] <> Separateur
      then begin
        Delete(Str, i, 1);
        nbCars := nbCars - 1;
      end
      else
        nbCars := 0;   // fim do elemento ...

    // Insérer la nouvelle valeur de l' élément :
    Insert(Novovaleur, Str, i);
  end;
end;

// Récupérer l' indice d' un élément :
function SUBSTRING_LOCATE(Str: string; Separateur: Char; SubString: String; Options: TLocateOptions): Integer;
var
  SubStrCount, CurSubStrIndex: Integer;
  FindPartialKey, FindCaseInsensitive: Boolean;
begin
  RESULT := 0;
  CurSubStrIndex := 1;
  SubStrCount := SUBSTRING_COUNT(Str, Separateur);
  FindPartialKey := loPartialKey in Options;
  FindCaseInsensitive := loCaseInsensitive in Options;

  if FindCaseInsensitive
  then begin
    Str := STRING_MAIUSCULAS(Str, []);
    SubString := STRING_MAIUSCULAS(SubString, []);
  end;

  while (RESULT = 0) and (CurSubStrIndex <= SubStrCount) do
  begin
    if FindPartialKey
    then begin
      if Pos(SubString, SUBSTRING_GET(Str, Separateur, CurSubStrIndex)) = 1  
      then RESULT := CurSubStrIndex;
    end
    else
      if SubString = SUBSTRING_GET(Str, Separateur, CurSubStrIndex)
      then RESULT := CurSubStrIndex;

    inc(CurSubStrIndex, 1);
  end;
end;

// Permet, à la manière d' un DataSet, sauter de "MoveBy" éléments, avec la particularité de revenir au début lorsqu' on atteind le 

dernier élément (de même si on atteind le début quand MoveBy négatif, on revient au dernier) : 
function SUBSTRING_RIBBON(Str: string; Separateur: Char; Current: Word; MoveBy: Integer): Integer;
var Count: Integer;
begin
  Count := SUBSTRING_COUNT(Str, Separateur);

  RESULT := Current + MoveBy;

  if RESULT > 0
  then begin
    while RESULT > Count do
      RESULT := RESULT - Count;
  end
  else begin
    while RESULT <= 0 do
      RESULT := RESULT + Count;
  end;
end;

// La même mais sans l' indice (par la valeur de l' élément) : 
function SUBSTRING_RIBBON(Str: string; Separateur: Char; Current: String; MoveBy: Integer): String;
var SubStringIndex: Integer;
begin
  SubStringIndex := SUBSTRING_LOCATE(Str, Separateur, Current, []);

  if SubStringIndex = 0
  then SubStringIndex := 1
  else SubStringIndex := SUBSTRING_RIBBON(Str, Separateur, SubStringIndex, MoveBy);

  RESULT := SUBSTRING_GET(Str, Separateur, SubStringIndex);
end;

// Retirer un élément : 
function SUBSTRING_DELETE(var Str: string; Separateur: Char; SubStringIndex: Word): Boolean;
var nbCars: Integer;
begin
  RESULT := false;
  i := SUBSTRING_START(Str, Separateur, SubStringIndex);

  if i <> 0
  then begin
    RESULT := True;
    nbCars := length(Str);
    // Remover valeur actual :
    while i <= nbCars do
    begin
      if Str[i] = Separateur
      then nbCars := 0             // fim do elemento ...
      else nbCars := nbCars - 1;

      Delete(Str, i, 1);
    end;
  end;
end;



 Historique

29 janvier 2009 18:46:33 :
Amélioration de mon Français :)

 Sources du même auteur

Source avec Zip COMPOSANT TCYCOMMROOMCONNECTOR - UTILISER LE COMPO TCYCOMMUN...
Source avec Zip COMPOSANT TCYCOMMUNICATE - COMMUNIQUER AVEC VOS AUTRES APPLI...
Source avec Zip COMPOSANT TCYAPPINSTANCES - EMPÊCHER PLUSIEURS INSTANCES DE ...
Source avec Zip Source avec une capture CINDY PACK V3.23
Source avec une capture VOTRE PROGRAMME DE MAIL COMME CLIENT MAIL PAR DÉFAUT SOUS WI...

 Sources de la même categorie

Source avec Zip ARBRES N-ARIES par Kagemaru
Source avec Zip Source avec une capture UN LOGICIEL POUR ÊTRE AVERTI QUAND UN BUS ARRIVE par pseudomino
Source avec Zip ALPHA DE CRONBACH (INDICE UTILISÉ EN PSYCHO) par fredelem
Source avec Zip Source avec une capture SIMULATION D'UN VIEUX PC par Debiars
Source avec Zip Source avec une capture NDKEYGEN (GÉNERER LES SERIAL NUMMER) par diglas

 Sources en rapport avec celle ci

Source avec Zip COMPOSANT TCYCOMMROOMCONNECTOR - UTILISER LE COMPO TCYCOMMUN... par MAURICIO
Source avec Zip COMPOSANT TCYCOMMUNICATE - COMMUNIQUER AVEC VOS AUTRES APPLI... par MAURICIO
Source avec Zip Source avec une capture DELPHI : PROCEDURE SPLIT SIMILAIRE A LA FONCTION EPONYME EN ... par FENETRES
Source avec Zip DISTANCE LEVENSHTEIN (DISTANCE ENTRE DEUX CHAINES) par DevNul
Source avec Zip FONCTIONS DE GESTION DE SOUS-CHAINES !!! par MAURICIO

Commentaires et avis

Commentaire de Caribensila le 29/01/2009 19:17:02 10/10

Content de te revoir Mauricio.  :)

Tout ça m'a l'air bien intéressant !
Dis-moi si je me trompe, mais je verrais bien une telle structure en tête d'un TFileStream pour en facilité l'utilisation.
Qu'en penses-tu?

Commentaire de Caribensila le 29/01/2009 19:18:57

... Et un 'tit zip? Histoire de pouvoir garder ça sous la main...  ;)

Commentaire de Caribensila le 30/01/2009 00:03:53

Après avoir parcouru l'historique...

Y'a pas à dire. T'as de la suite dans les idées, depuis 2004!
J'espère que t'es pas devenu accro au Chouchen de Kenavo.  lolll

Commentaire de L_art_ment le 30/01/2009 08:20:46

Merci Mauricio, moi qui travail souvent avec les sous-chaines, ca m'évitera des manipulations fastidieuses des sous-chaines...

a+ !

Commentaire de MAURICIO le 30/01/2009 10:45:16

Merci à tous les 2 pour vos commentaires.

D' abord, je tiens à signaler 2 petites choses:

- La fonction STRING_MAIUSCULAS() qui est utilisée par la fonction STRING_LOCATE doit être remplacée par AnsiUpperCase().

- AVANT, je considérais que Str ne pouvait pas avoir d´éléments:
Str = ''  il n' y a pas d' éléments.
Str = ';' un élément vide
Str = 'xxx;' un élément de valeur xxx
Str = ';yy;' 2 éléments dont le 1er vide
Str = 'xxx;yyy;' 2 éléments
Ce qui obligeait tous les élémemts à finir par le séparateur ...
Donc, Str = 'xxx;yy' n' est pas valide puisqu' on ne pourrait pas distinguer une chaine d' un élément vide d' une chaine de 0 élément (Tout les 2 serait Str = '').
Le fait de devoir toujours finir par le séparateur ne me plaisait pas donc j' ai réécrit mes fonctions sachant qu' il y a toujours un élément.

En pratique, je fais toujours comme cela :
soit j' inicialise une fois (le cas oú on lit la chaine d' un fichier Ini):
str := 'aaax;dfef;erewrew;ewrertet';

Soit je le fais en plusieurs fois :
Str := 'aa';
Str := Str + ';' + 'bbb';
etc ...

Voilà pour la petite histoire ...


@Cari: En ce qui concerne ce que tu veux faire avec les FileStreams, je suppose que c' est pour savoir la structure du FileStream: c' est une bonne utilistation!
En ce qui concerne le zip, ça m' obligerait à faire une démo un peu abstraite vu le sujet. De plus, je bosse sur ma version 2.0 de mes compos et je suis en train de revoir toutes mes fonctions crées ces 10 dernières années (d' oú ce post) afin de repartir avec des fonctions plus souples, plus performantes et plus partiques. Je vais faire le saut vers Delphi 2009 dans peu de temps!!!
J' ai de la suite dans les idées? Je dirais oui, mais ça montre surtout que delphifr.com sert à quelques chose et que les sources postées sont utiles et m' inspirent (même si certaines inspirent plus au suicide ... lol).

@L_art_ment: On finit tous par utiliser les sous-chaines :)


Sur ce, et dans l' espoir qu' on se retrouve pas tous au chômage technique (ou c' est la technique utilisée par les entreprises pour nous mettre dehors?) ...

A+

Commentaire de cirec le 30/01/2009 11:09:40 administrateur CS

"Je vais faire le saut vers Delphi 2009 dans peu de temps!!!"

fait le de suite sinon tu risques de devoir reprendre une partie de tes modifications rien que pour Delphi2009 !!!

il vaut mieux le faire de suite afin de comprendre les nouvelles subtilités de Delphi2009 ... surtout dans le travail avec chaine et sous-chaine.

ps: t'avais même pas vu que je t'ai changé le lien qui pointe vers ta source d'exemple ^^
testez vos liens avant de les mettre en ligne ;)

ps2: comment ça; t'as pas encore testé Delphi2009 !!!! lol

Commentaire de MAURICIO le 30/01/2009 11:15:33

J' ai déjà étudié les particularités de D2009 car j' ai Delphi 2009 chez moi.
J' attends de le recevoir au boulot pour passer le tout vers Delphi 2009.
J' ai déjà passé mon pack de compos pour toutes les versions de Delphi, D2009 inclu!

Désolé pour le lien ^^

A+

Commentaire de cantador le 30/01/2009 11:43:49 10/10

Bonjour,

Un ressemblance certaine avec une bonne vieille gestion de tables..
cela mériterait une démo afin d'apprécier l'utilité et les performances.
En tout cas, bravo pour cette approche Mauricio.
Très intéressant..

Commentaire de Caribensila le 30/01/2009 12:19:03

Oui, ce serait pour connaître la structure du FileStream. Il commencerait toujours par un Integer indiquant la longueur de ta chaîne, puis la chaîne elle-même (signature incluse) indiquant la structure du FileStream... à voir en pratique.

Mais moi, j'aime bien ton idée :  
Str =   ''  => 1 élément vide
Str = 'xxx' => 1 élément rempli, etc...
Ca n'a l'air de rien, comme ça, une fois expliqué. Mais c'est ce qui fait toute la différence, je trouve.
Bravo!

Commentaire de MAURICIO le 30/01/2009 12:25:40

@Cari:
Tu es donc d' accord avec moi pour dire que:

Str = ''   => 1 élément vide

au lieu de :

Str = ''   => 0 élément
Str = ';'   => 1 élément vide

Je trouve que c' est bien plus simple à gérer mais c' est à chacun de voir ...

@Cantador: une démo c' est bien, mais comme Cari le montre, tout dépend de l' imagination de chacun! Si je fais une démo utilisant le FileStream, ça va limiter à cette application alors que les sous-chaines c' est comme les chaines: on les utilise pour tout! C' est comme vouloir faire une démo sur les Integer, ça pas trop de sens ...

A+

Commentaire de MAURICIO le 30/01/2009 12:26:43

J' ai aussi des fonctions pour les TStrings et pour les TreeNode, faut voir si ça interesse ...

A+

Commentaire de cirec le 30/01/2009 19:38:04 administrateur CS

ah je me disais bien ... d'où mon étonnement ^^

Mais je le savais déjà ;)
quand le père noël m'a emmener le miens il m'a dit qu'il devait encore passer chez toi pour t'en déposer un :D

sinon coté code ... je vais encore passer pour le relou de service mais on peut faire la même chose avec les StringList & delimitedChar + DelimitedText !!!!

pareil on peut choisir le délimiteur que l'on veut.
pareil il ne différencie pas une chaine vide d'un enregistrement vide.

la différence est là:
Exemple: Str = '' pas d'élément
et le reste est strictement pareil:
Exemple: Str = 'xxx' 1 élément rempli ...
Exemple: Str = ';' 2 éléments (vides) ...
Exemple: Str = 'xxx;' 2 éléments (dont 1 vide) ...
Exemple: Str = ';xxx' 2 éléments (dont 1 vide) ...
Exemple: Str = 'xxx;yyy' 2 éléments ...

et l'index commence à 0 "Zéro" et pas à 1

avec tout les avantages de la classe TStrings en plus ;)

Commentaire de MAURICIO le 31/01/2009 15:32:00

Salut Cirec,

tes commentraires sont toujours pertinents.
Vu que c' est objectif je vois pas le problème.

StringList & delimitedChar permettent en effet d' utiliser les sous-chaines j' y avais pas pensé.
De toute façon, on passe souvent du temps à réinventer la roue ^^

Cependant:
"la différence est là:
Exemple: Str = '' pas d'élément
et le reste est strictement pareil:
Exemple: Str = 'xxx' 1 élément rempli ...
Exemple: Str = ';' 2 éléments (vides) ..."

Bem justement, comment différencier un élément vide de 0 élément?
"Str = '' pas d'élément".
Comment distinguer d' un élément vide (un élément de valeur = "") ?

J' ai fait le test suivant :
procedure TFrmPrin.SpeedButton1Click(Sender: TObject);
begin
  ListBox1.Items.Delimiter := ';';
  ListBox1.Items.DelimitedText := '';
  SpeedButton1.Caption := IntToStr(ListBox1.Items.Count);
end;
SpeedButton1.Caption est 0

Si on fait :
  ListBox1.Items.Delimiter := ';';
  ListBox1.Items.DelimitedText := 'xx';
SpeedButton1.Caption est 1

Si on fait :
  ListBox1.Items.Delimiter := ';';
  ListBox1.Items.DelimitedText := ';';
SpeedButton1.Caption est de 2

Impossible d' avoir une chaine vide de 1 élément!
C' est vrai que mes fonctions se basent sur le fait qu' il y ait au moins un élément lorsque la chaine est vide!

Il y a autre chose qui me chagrine qui possède un bon et un mauvais côté:
Si je fais cela:
  ListBox1.Items.Delimiter := ';';
  ListBox1.Items.DelimitedText := 'aaa';
  ListBox1.Items.Add('xxx;yyy');
  ListBox1.Items.Add('zzz');
Le résultat est que j' ai 3 éléments:
- aaa
- xxx;yyy
- zzz

xxx;yyy est considéré un élément à part entière!

A+

Commentaire de simonpelloquin le 10/02/2009 08:53:52 9/10

Salut Mauricio et bravo pour cette source. Une petite remarque, si je peux me permettre : Placer les séparateur en dernier paramètre des fonctions et procédures pour leur donner une valeur par défaut. On s'économise ainsi la saisie du ";" à chaque appel, tout en gardant la possibilité d'utiliser un autre séparateur ponctuellement...
Sinon c'est très pratique, merci encore.

Commentaire de MAURICIO le 10/02/2009 10:15:40

Salut Simon,

Oui, pourquoi pas ^^

De toute façon, chacun est libre de transformer cet exemple car d toute façon il n' y a pas de standard sur l' utilisation des sous-chaines :)

A+

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

String et Retour chariot [ par lomig ] J'ai une chaine de caractere constituée de deux mots que je veuxséparer par un retour chariot et ensuite insérer cette chaine dans unfichier texte. Si Integer et string [ par Programmeur1987 ] Bonjour j'aimerais savoir si il y a moyen d'intégrer un integer dans une chaine de string.Example dans mon cas :VarChangePass : Integer;beginChangePas Renverser une chaine de caractère [ par AMokers ] Salut à tous !Voila je voudrais renverser une chaine de caractere, j'ai trouver ce script :function InverseStr(sDep : string) : string;varsFin : strin conversion bit en string [ par biloue ] BonjourDans un programme je récupère une chaine de bit qui m'est envoyé par liaison UDP. Chaine composée de 0 et de 1.Je souhaiterai convertir cette c Formatage d'un string [ par titiyo ] bonjoursen fait jai un chaine de 10 espace et je veut rentre dedant toto sans augenter la taille de ma chaine resulta qui a comme longeur 10:chaine1 : Extraire 1 chaine a/ "substring()" a/ 1TAdoQuery [ par 810mcu ] Bonjour a tout le monde, J ai regardé sans succès, Vérifier le contenu d'une chaine de type string [ par Komona ] Bonjour,Je me tourne à vous à la suite d'une paire d'heures de recherche sur un sujet qui (je l'espère) pourra facilement être réglé via vos connais Split String [ par oregon ] Bonsoir, a tous je suis un peux bloqué sur un projet. Enfaite j'aimerai diviser une string en 4 ou 2 enfin peux importe afin de les séparer sans delim format décimal (FloatFormat, Precision, Digits) ? masque (##,#0.000E+#) [ par zwyx ] [size=50][color=white]FloatFormat,Precision,Digits,Masque[/color][/size] Bonjour à tous, Je bloque dans l'écriture d'une bête routine. Savoir qu'on a mémoire locale et mémoire globale [ par Gerard ] Bonjour, J'ai entrepris la refonte de mon serveur - qui marche par ailleurs très bien - une centaine de joueurs (de bridge) par jour dans l'objectif s


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Septembre 2010
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
27282930   

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,780 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales