2009-11-03 2 views
1

Я хочу получить данные из текстового файла в listview.Как отображать данные из текстового файла в виде списка?

Текстовый файл содержит образец:

 
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 

Как и что я хочу, чтобы получить значение первой в listview.items.caption и второй по sunitems [0]. Я хочу получить всю информацию в строке списка.

Как я могу это сделать? Я играл с stringlist.values, но я получаю 0-й член данных во всех строках.

ответ

5

Отбросьте TListView на форме и установите стиль для vsList. Создайте три столбца, которые вы хотите отобразить (щелкните правой кнопкой мыши ListView и выберите Редактор столбцов во всплывающем меню).

Добавьте следующий к FormShow() событие (или там, где вы хотите его):

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; 

Обратите внимание, что это предполагает, что вы ищете что-то вроде этого:

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

Если то, что вы ищете больше похож:

 
    0th member   XXXXX    YYYYY 
    1     ZZZZZ    ZZZZZ 

Затем измените подпункты() вызывает к чему-то л икэ это:

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

Это извлекает только часть после равенства (=) знак из текстовых значений этих два малых столбца в.

Этого должно быть достаточно, чтобы вы начали, я думаю.

Обратите внимание, что в Delphi 2010 есть ошибка с TListView, когда ViewStyle установлен в vsReport, и вы не указали никаких элементов в среде IDE. Вы получаете сообщение об ошибке потока при попытке запустить приложение из-за неопределенных элементов. Вы можете обойти эту проблему, создав фиктивный элемент со значением нонсенс во время разработки, так и в вашем FormShow() событие добавьте следующее в первой исполняемой строке:

 
    ListView1.Items.Clear; 

Это становится мимо точки, что DFM является потоки в который, что и вызывает ошибку.

EDIT: прочитав комментарии от OP. Пропуск пустых строк:

// 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; 

Чтобы пропустить только пустые строки в подразделов:

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

спасибо за ответ сэр, мне нужно так же, как строка 1 подпись: XXXXXXXX подпозиция YYYYY000 линия 2 Подпись: XXXXXX11 подпозиция: YYYY11111 ; строка 3 ----- (и т. д.), и я попытался с помощью метода s r, и его работа прекрасна, если все данные построчно. в моем текстовом файле все данные не строки за строкой несколько раз я использую enter, тогда я получаю пустые поля в listview. есть ли вероятность, что я получу данные независимо от того, сколько пустых строк присутствует в файле? заранее спасибо . – noob

+0

hmm, Я получил его на работу сэр, с пустыми линиями, в любом случае спасибо за идею. Мне любопытно узнать, могу ли я сделать это с помощью str.values? – noob

+0

Для пробелов вы можете проверить сначала перед добавлением (см. Мое редактирование).Я не уверен, что вы подразумеваете под «с str.values»? –

Смежные вопросы