|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Чтение txt файла в ListBox
Всем добрый вечер.
Имеется текстовый файл: #BLOK1 Вещь1 20 30 40 50 Вещь2 27 37 42 51 Вещь3 11 44 70 58 Вещь4 85 90 43 62 #BLOK2 sss 28 33 33 90 aaaa 55 64 87 23 wwwwww 78 85 41 12 #BLOK3 ttt 25 34 41 57 dddew 44 77 80 12 Как видно, файл разделён на блоки(1-3), в каждом из которых строки с 5-ю переменными: 1-string, остальные 4-integer. На форме 3 button(блоки 1,2,3), Listbox, и Label. Надо, чтобы по клику button1, в Listbox-е отображался список строк этого блока(точнее первая переменная, например "вещь1"), а по клику строки в Label должны отображаться соответствующие переменные. Вот пример, только он не правильный, но зато понятный: Помогите пожалуйста, что-то мне не сообразить никак. Последний раз редактировалось Ankor, 11.01.2012 в 22:23. |
#2
|
||||
|
||||
Пример не смотрел, но сразу можно сказать, лучше для этих целей использовать ListView. В принципе можно и ListBox на колонки разбить, но не совсем удобно.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
|||
|
|||
Цитата:
Извините, забыл сказать, в ListBox не колонки, а строки (1-ые строковые переменные из выбранного блока). Последний раз редактировалось Ankor, 11.01.2012 в 22:25. |
#4
|
||||
|
||||
Не нужно этого геммороя, грузи все данные в ListView.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#5
|
|||
|
|||
Грузить надо через промежуточный список. Сначала грузишь в список, потом формируешь объект, а в ListBox добавляешь через AddObject и привязываешь этот объект к итему в списке.
Код:
type TMyObject = class Name : Stirng; I1, I2, I3, I4 : Integer; end; function TForm1.GetObject(AStr : String) : TMyObject; begin Result := TMyObject.Create; // Тут парсим строку и заполняем поля объекта end; procedure TForm1.ClearListBox; var I : Integer; O : TMyObject; begin For I := 0 To ListBox1.Items.Count-1 Do Begin O := ListBox1.Items.Objects[i]; ListBox1.Items.Objects[i] := Nil; O.Free; End; ListBox1.Items.Clear; end; procedure TForm1.Load(AFileName : String); var I : Integer; S : TSTringList; O : TMyObject; begin ClearListBox; S := TStringList.Create; S.LoadFromFile(AFileName); For I := 0 To S.Count-1 Do Begin O := GetObject(S[i]); ListBox1.Items.AddObject(O.Name,O); End; S.Free; end; procedure TForm1.ListBoxClick(Sender : TObject); var O : TMyObject; begin If ListBox1.ItemIndex > -1 Then Begin O := ListBox1.Items.Objects[ListBox1.ItemIndex] As TMyObject; Edit1.Text := IntToStr(O.I1); Edit2.Text := IntToStr(O.I2); Edit3.Text := IntToStr(O.I3); Edit4.Text := IntToStr(O.I4); End; end; Первые 2 функции - служебные. Следующая - загрузка файла. Последняя - вывод данных в edit'ы. |
#6
|
||||
|
||||
С объектом тоже не всё просто, у него не фиксированное количество данных в секции. Нужно что то типа этого:
Код:
type TItems = record Name : Stirng; Value : array[0..3] of Integer; end; TMyObject = class Items : array of TItems; end; Вот пример: Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 12.01.2012 в 03:27. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Ankor (12.01.2012)
|
#7
|
|||
|
|||
Спасибо большое angvelem, буду разбираться с Вашим примером.
Я с данными из файлов зашел в тупик, уже месяц проект не может сдвинуться с места((( |
#8
|
||||
|
||||
А что с данными не так?
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |