2009-11-03 4 views
1

Je souhaite obtenir des données d'un fichier texte dans une liste.Comment afficher les données d'un fichier texte dans une liste?

Un fichier texte exemple contient:

 
0th member 
first=XXXXXXXX 
second=YYYYY000 
1 
first=XXXXXXX1 
second=YYY1111 
2 
first=XXXXXX22 
second=YYYY2222 
3 
first=XXXXXX33 
second=YYYY333 
4 
first=XXXXX4444 
second=YYY4444 

Comme que je veux obtenir la valeur de la première à listview.items.caption et deuxième à sunitems [0]. Je veux obtenir toutes les informations comme ça dans les lignes listview.

Comment puis-je faire cela? J'ai joué avec stringlist.values ​​mais j'obtiens des données de 0ème membre dans toutes les lignes.

Répondre

5

Supprimez TListView sur un formulaire et définissez son style sur vsList. Créez les trois colonnes que vous souhaitez afficher (cliquez avec le bouton droit sur ListView et choisissez Editeur de colonnes dans le menu contextuel).

Ajouter ce qui suit à l'événement FormShow() (ou où vous le souhaitez):

procedure TForm1.FormShow(Sender: TObject); 
var 
    SL: TStringList; 
    i: Integer; 
begin 
    SL := TStringList.Create; 
    try 
    SL.LoadFromFile(YourFileNameHere); 
    i := 0; 
    while i < SL.Count do 
    begin 
     with ListView1.Items.Add do 
     begin 
     Caption := SL[i]; 
     SubItems.Add(SL[i + 1]); 
     SubItems.Add(SL[i + 2]); 
     end; 
     Inc(i, 3); 
    end; 
    finally 
    SL.Free; 
    end; 
end; 

Notez que cela suppose que ce que vous cherchez quelque chose comme ceci:

 
    0th member   first=XXXXX   second=YYYYY 
    1     first=ZZZZZ   second=ZZZZZ 

Si ce que vous cherchez est plus comme:

 
    0th member   XXXXX    YYYYY 
    1     ZZZZZ    ZZZZZ 

changer ensuite les SubItems() appelle à quelque chose l ike ceci:

 
    SubItems.Add(Copy(SL[i + 1], Pos('=', SL[i + 1]) + 1, MaxInt); 
    SubItems.Add(Copy(SL[i + 2], Pos('=', SL[i + 2]) + 1, MaxInt); 

Ceci extrait la partie qui suit l'égal (=) signe les deux valeurs de texte de la sous-colonne.

Cela devrait être suffisant pour vous aider à démarrer, je pense.

Notez que Delphi 2010 a un bogue avec TListView lorsque ViewStyle est défini sur vsReport et que vous n'avez défini aucun élément dans l'EDI. Vous obtenez une erreur de lecture de flux lorsque vous essayez et exécutez votre application à cause des éléments non définis. Vous pouvez contourner ce problème en créant un élément fictif avec une valeur non-sens au moment de la conception, et dans votre cas FormShow() ajouter ce qui suit la première ligne exécutable:

 
    ListView1.Items.Clear; 

Cela devient passé le point que le DFM est streamé dedans, qui est ce qui déclenche le bug.

EDIT: Après avoir lu les commentaires par OP. Pour sauter des lignes vides:

// To skip entire group if starting line is blank 
    while i < SL.Count - 1 do 
    begin 
    if SL[i] <> '' then 
    begin 
     with ListView1.Items.Add do 
     // just like before 
    end 
    Inc(i, 3); 
    end; 

Pour sauter seulement des lignes vides dans les sous-éléments:

while i < SL.Count - 1 do 
    begin 
    with ListView1.Items.Add do 
    begin 
     Caption := SL[i]; 
     if SL[i + 1] <> '' then 
     SubItems.Add(SL[i + 1]); 
     if SL[i + 2] <> '' then 
     SubItems.Add(SL[i + 2]; 
    end; 
    Inc(i, 3); 
    end; 
+0

merci pour la réponse monsieur, j'ai besoin exactement comme la ligne 1 Légende: XXXXXXXX sous-élément YYYYY000 ligne 2 Légende: XXXXXX11 sous-élément: YYYY11111 ; ligne 3 ----- (etc), et j'ai essayé avec notre méthode monsieur, et son fonctionnement bien si toutes les données ligne par ligne. Dans mon fichier texte, toutes les données ne sont pas ligne par ligne, parfois j'utilise entrer alors je reçois des champs vides dans listview. Y at-il une chance que je puisse obtenir des données indépendamment du nombre de lignes vides présentes dans le fichier? Merci d'avance . – noob

+0

hmm, Je l'ai eu à travailler monsieur, avec des lignes vides, de toute façon merci pour notre idée monsieur. je suis curieux de savoir que je peux le faire avec str.values? – noob

+0

Pour les espaces, vous pouvez vérifier d'abord avant d'ajouter (voir ma modification).Je ne suis pas sûr de ce que vous voulez dire par "avec des valeurs"? –

Questions connexes