J'ai un attribut appelé HistoryText dans un objet qui est stocké sous forme de chaîne. Je souhaite afficher toutes les lignes d'une grille. Je devrais pouvoir supprimer et éditer des rangées dans la grille. Le format est le suivant:Liste de chaînes avec délimiteur en tant que chaîne?
16.5.2003-$-12:09-$-anna-$-Organization created
2.6.2005-$-13:03-$-jimmy-$-Organization edited
19.12.2005-$-13:33-$-madeleine-$-Organization edited
Donc, chaque ligne ont 4 champs, date, heure, utilisateur, et un message avec une chaîne de delimiter comme '- $ -. En tant que délimiteur, une chaîne et non un caractère ne peut pas être affecté à la propriété délimiteur de listes de chaînes.
J'ai une routine pour extraire la chaîne à un StringList:
procedure ParseDelimited(const aStringList: TStringList; const aOrgList, aDelimiter: string);
var
vDelimiterPos : integer;
vPartialStr : string;
vRemaingTxt : string;
vDelimiterLength : integer;
begin
vDelimiterLength := Length(aDelimiter);
if (AnsiRightStr(aOrgList, Length(aDelimiter)) = aDelimiter) then
vRemaingTxt := aOrgList
else
vRemaingTxt := aOrgList + aDelimiter;
aStringList.BeginUpdate;
aStringList.Clear;
try
while Length(vRemaingTxt) > 0 do
begin
vDelimiterPos := Pos(aDelimiter, vRemaingTxt);
vPartialStr := Copy(vRemaingTxt,0,vDelimiterPos-1);
aStringList.Add(vPartialStr);
vRemaingTxt := Copy(vRemaingTxt,vDelimiterPos+vDelimiterLength,MaxInt);
end;
finally
aStringList.EndUpdate;
end;
end;
et il semble fonctionner très bien. Mon problème consiste à synchroniser les modifications dans StringList à la propriété String d'origine? Il y a tellement de données historiques avec ce délimiteur donc je ne pense pas que le changer en TChar est une option réaliste.
Mise à jour: Une clarification. Je pense que je peux réussir à convertir la chaîne en StringList avec la méthode ci-dessus. Puis l'afficher dans la grille ne devrait pas être si difficile. Le problème vient lorsque je veux convertir le TStringList à la propriété String originale wih '- $ -' comme délimiteur. Je ne peux pas faire HistoryText: = myStringList.Delimitedtext par exemple.
Deuxième mise à jour: Je l'ai résolu. Vous avez tous obtenu un +1 pour des réponses rapides et essayant vraiment d'aider. En résumé, comment je l'ai fait.
Lire à partir Historytext:
MyStringList.Text := Historytext;
Maintenant, chaque rangée ont 3 délimiteurs de « - $ - » et chaque ligne est séparée par un saut de ligne comme d'habitude.
- Dans une boucle, analysez la liste des chaînes et affichez-la dans la grille. Je ne me soucie plus de MyStringList.
- Permet à l'utilisateur de supprimer et d'éditer des lignes dans la grille.
- Une fois terminé, effectuez une boucle par ligne et par colonne dans la grille et créez une nouvelle chaîne avec le même format que l'original.
- Affectez cette chaîne à HistoryText.
shift donc mise au point de StringList au réseau a facilité :)
Quelle est votre vraie question? Vous mentionnez vouloir afficher dans une grille et que la procédure de liste de chaînes "semble bien fonctionner". "Synchroniser les changements" est également un peu large. De quoi avez-vous besoin? Se – Tobiasopdenbrouw
ma mise à jour :) –
Ma solution ne fonctionne (en D2007 +) dans les deux sens - et est beaucoup plus courte. –