Accueil > > > LIBRAIRIE DE FONCTIONS DE GESTION DE SOUS-CHAINES.
LIBRAIRIE DE FONCTIONS DE GESTION DE SOUS-CHAINES.
Information sur la source
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
Sources de la même categorie
Commentaires et avis
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
|
Derniers Blogs
CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT)CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT) par FREMYCOMPANY
Bonjour à tous, Je viens de publier une proposition comprenant 5 pseudo-classes pour le CSS Working Group ayant trait à l'état de chargement d'un élément (ex: IMG,VIDEO,AUDIO,OBJECT pour l'HTML.). Si le c½ur vous en dit, vous pouvez retrouver cette p...
Cliquez pour lire la suite de l'article par FREMYCOMPANY MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks [HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL[HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL par Pierrick CATRO-BROUILLET
Avec la sortie prochaine de la Beta Consumer Preview de Windows 8, j'avais envie de revenir sur une des fonctionnalités que j'attends le plus et que, en bon geek que je suis, j'utilise déjà : Hyper-V 3 ainsi son module PowerShell.
Il y a déjà pléthor...
Cliquez pour lire la suite de l'article par Pierrick CATRO-BROUILLET IIS7 - COMPRESSION GZIPIIS7 - COMPRESSION GZIP par cyril
La compression GZIP permet d'améliorer les performances de navigation en compressant ce qu'envoie le serveur à un client. Pour comprendre comment cela fonctionne, regardons ce qu'il se passe au niveau HTTP lorsqu'un client tente d'accéder à une ress...
Cliquez pour lire la suite de l'article par cyril
Logiciels
Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning Academy System (17.1.3.0)ACADEMY SYSTEM (17.1.3.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|