![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Всем добрый вечер.
Имеется текстовый файл: #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 на колонки разбить, но не совсем удобно.
|
|
#3
|
|||
|
|||
|
Цитата:
Извините, забыл сказать, в ListBox не колонки, а строки (1-ые строковые переменные из выбранного блока). Последний раз редактировалось Ankor, 11.01.2012 в 22:25. |
|
#4
|
||||
|
||||
|
Не нужно этого геммороя, грузи все данные в ListView.
|
|
#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;Вот пример: Последний раз редактировалось angvelem, 12.01.2012 в 03:27. |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Ankor (12.01.2012)
| ||