![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по применению TStringList. [D6, XP]
Abcdef123 © (2009-07-09 06:49:00)Здравствуйте, Мастера! Подскажите плз, возможно ли создавать StringList - ы без объявления их как переменной? И если можно, то как это прописать?
Поясню на примере, что я имею в виду. Допустим, есть 2 небольшие связанные таблицы Header и Detail. И для в цикле по каждой записи Header надо создать 2 StringList -а. В первый положить значения полей, а во второй StringList положим все связанные записи из таблицы Detail. И так по всем записям. То есть если Header имеет 10 записей, то надо в ран тайме создать 10 StringList для Header. Так как мы не знаем, сколько записей, то мы и не можем заранее объявить все StringList заранее. Как можно это реализовать? Сильно не ругайте плз , если вопрос глупый.
Заранее благодарна.
Anatoly Podgoretsky (2009-07-09 12:34:00) [1]> Abcdef123 (09.07.2009 11:53:20) [20]
Все таки задумайся над использованием TObjectList
sniknik (2009-07-09 12:15:00) [2]говорят первое пришедшее в голову верно... не всегда скорее всего, но тут по моему "в точку".
почему таблицы только для примера? они тут как нельзя лучше подходят, 2 связанные по мастер детайл таблицы... в одной заголовки. в другой список значений. все как нельзя лучше "ложится в схему" переход на другую строку в заголовков приводит к фильтрации по полю связи таблицы значений, и там остается только то что нужно. и никаких десятков таблиц, как со стринглистами, только 2, просто с нормальзованными данными. и поля можно любые, и сколько хочешь добавлять.
и база для использования например клиентских рекордсетов (предпочитаю ADO) не нужна, вопреки частому заблуждению.
данные вносить так (пример)
заголовки
ID Name
1 Header 1
2 Header 2
3 Header 3
4 Header 4
5 Header 5
значения
ID Name
1 Value 1.1
1 Value 1.2
1 Value 1.3
1 Value 1.4
1 Value 1.5
2 Value 2.1
2 Value 2.2
3 Value 3.1
4 Value 4.1
5 Value 5.1
связь по ID естественно, текущая запись, и что останется в связанной выделено.
Abcdef123 (2009-07-09 11:53:00) [3]Всем спасибо за участие и советы. Особое спасибо Qwerty890. Думаю, что остановлюсь на этом варианте использования array of TStringList. Но, другие советы тоже приму к сведению на будущее!
Qwerty890 (2009-07-09 10:00:00) [4]кактотак
var
i,j: integer;
hlist: TStringList;
dlist: array of TStringList;
header, detail: TDataSet;
begin
header := ...
detail := ...
hlist := TStringList.Create();
header.FetchAll();
SetLength(dlist, header.RecordCount);
header.First();
for i := Low(hlist) to High(hlist)
do begin
for j := 0 to header.FieldsCount -1
do hlist.Append(header.Fields[j]);
dlist := TStringList.Create();
hlist.Objects[i] := dlist;
detail.Open();
while not detail.EoF
do begin
for j := 0 to detail.FieldsCount -1
do dlist.Append(detail.Fields[j]);
detail.Next():
end;
detail.Close();
header.Next();
end;
end;
Anatoly Podgoretsky (2009-07-09 09:53:00) [5]> Abcdef123 (09.07.2009 09:08:10) [10]
Зато есть такие вещи, как динамические массивы, объектные и необъектные списки и другие структуры, не говоря уже об смене типа.
Dennis I. Komarov (2009-07-09 09:51:00) [6]А что мешает объявить динамический массив указателей? Ну или TList заюзать, хотя это уже...
Leonid Troyanovsky (2009-07-09 09:50:00) [7]
> Abcdef123 (09.07.09 09:32) [12]
> вопроса "возможно ли создавать StringList - ы без объявления
> их как переменной и обращаться к ним после создания всех?
См., например, динамический массив, TObjectList -
обращаемся по индексу, приводим тип к TStringList.
Только возникает вопрос, а где хранить нужные индексы?
По-видимому, нужны более развитые структуры, более точно
описывающие исходные данные.
--
Regards, LVT.
Abcdef123 (2009-07-09 09:48:00) [8]To [13] [14] : Ну так чтобы использовать указатели, надо их заранее объявить. А мы заранее не знаем сколько надо будет указателей (каждый раз по разному, в зависимлсти от входной информации. То есть получается ситуация такая же как и проблема с объявлением стриглистов.
Dennis I. Komarov (2009-07-09 09:35:00) [9]
> Abcdef123 (09.07.09 09:32) [12]
AnyPointer:=TStringList.Create
TStringList(AnyPointer)...
Dennis I. Komarov (2009-07-09 09:33:00) [10]Метод Create вернет указатель на созданный объект. Можешь хранить их в некой древовидной структуре, незабывая освобождать память от ненужных...
Abcdef123 (2009-07-09 09:32:00) [11]To [11]
Насчет VarArrayCreate, VarArrayOf буду читать. Спасибо.
И все же на будущее хотелось бы знать ответ насчет изначального вопроса "возможно ли создавать StringList - ыбез объявления их как переменной и обращаться к ним после создания всех?"
Leonid Troyanovsky (2009-07-09 09:14:00) [12]
> Abcdef123 (09.07.09 08:43) [8]
Не знаю, какие структуры здесь будут полезны,
но, IMHO, не TStringList.
Посмотри в сторону variant: VarArrayCreate, VarArrayOf
и далее со всеми остановками.
--
Regards, LVT.
Abcdef123 (2009-07-09 09:08:00) [13]To
> Почему это не знаем, имя точно также можно указать любое.
> Name := любое_имя;
Но у стринглиста нет свойства Name.
Anatoly Podgoretsky (2009-07-09 08:44:00) [14]
> Ведь при создании таким образом мы не знаем какое имя будет
> у каждого стринглиста.
Почему это не знаем, имя точно также можно указать любое.
Name := любое_имя;
Abcdef123 (2009-07-09 08:43:00) [15]To [7] Таблицы это написаны как пример. А вообще на входе может быть и INI файл и другое. Поэтому надо заполнить данные в зависимости от связей в разные подзависимые стринглисты, чтобы потом удобно было работать вытаскивая любую информацию. То есть стринглисты могут быть как бы "вложенными" в несколько уровней, в зависимости от задачи. В общем идея такая, чтоб написать класс (программу) как можно более независимый от постановки задачи (то есть от входных данных и глубины связей между даннымит)
Leonid Troyanovsky (2009-07-09 07:57:00) [16]
> Abcdef123 (09.07.09 06:49)
> Поясню на примере, что я имею в виду. Допустим, есть 2 небольшие
> связанные таблицы Header и Detail. И для в цикле по каждой
> записи Header надо создать 2 StringList -а. В первый положить
> значения полей, а во второй StringList положим все связанные
> записи из таблицы Detail. И так по всем записям.
А зачем нужны оные листы, если необходимые данные можно
в любой момент получить запросом?
--
Regards, LVT.
Abcdef123 (2009-07-09 07:41:00) [17]А как я работать с ними буду? Если их будет 10 штук. После создания всех мне надо будет работать с ними, то как я буду обращаться к ним? Ведь при создании таким образом мы не знаем какое имя будет у каждого стринглиста.
Leonid Troyanovsky (2009-07-09 07:38:00) [18]
> brother © (09.07.09 07:14) [3]
> with TStringList.Create(self) do
Видимо, с TListBox попутал.
--
Regards, LVT.
brother (2009-07-09 07:16:00) [19]обрати внимание на TStringList.tag
brother (2009-07-09 07:14:00) [20]with TStringList.Create(self) do
begin
// всякие left top итд...
Parent := Self;
end;