Форум: "Начинающим";
Текущий архив: 2009.09.06;
Скачать: [xml.tar.bz2];
ВнизВопрос по применению TStringList. Найти похожие ветки
← →
Abcdef123 (2009-07-09 06:49) [0]Здравствуйте, Мастера! Подскажите плз, возможно ли создавать StringList - ы без объявления их как переменной? И если можно, то как это прописать?
Поясню на примере, что я имею в виду. Допустим, есть 2 небольшие связанные таблицы Header и Detail. И для в цикле по каждой записи Header надо создать 2 StringList -а. В первый положить значения полей, а во второй StringList положим все связанные записи из таблицы Detail. И так по всем записям. То есть если Header имеет 10 записей, то надо в ран тайме создать 10 StringList для Header. Так как мы не знаем, сколько записей, то мы и не можем заранее объявить все StringList заранее. Как можно это реализовать? Сильно не ругайте плз , если вопрос глупый.
Заранее благодарна.
← →
brother © (2009-07-09 06:58) [1]в рантайм можно создать сколь угодно стринглист)
← →
Abcdef123 (2009-07-09 07:03) [2]To [1] напишите на простом примерчике плз как это будет выглядеть. Хотя бы как схему описания подскажите.
← →
brother © (2009-07-09 07:14) [3]with TStringList.Create(self) do
begin
// всякие left top итд...
Parent := Self;
end;
← →
brother © (2009-07-09 07:16) [4]обрати внимание на TStringList.tag
← →
Leonid Troyanovsky © (2009-07-09 07:38) [5]
> brother © (09.07.09 07:14) [3]
> with TStringList.Create(self) do
Видимо, с TListBox попутал.
--
Regards, LVT.
← →
Abcdef123 (2009-07-09 07:41) [6]А как я работать с ними буду? Если их будет 10 штук. После создания всех мне надо будет работать с ними, то как я буду обращаться к ним? Ведь при создании таким образом мы не знаем какое имя будет у каждого стринглиста.
← →
Leonid Troyanovsky © (2009-07-09 07:57) [7]
> Abcdef123 (09.07.09 06:49)
> Поясню на примере, что я имею в виду. Допустим, есть 2 небольшие
> связанные таблицы Header и Detail. И для в цикле по каждой
> записи Header надо создать 2 StringList -а. В первый положить
> значения полей, а во второй StringList положим все связанные
> записи из таблицы Detail. И так по всем записям.
А зачем нужны оные листы, если необходимые данные можно
в любой момент получить запросом?
--
Regards, LVT.
← →
Abcdef123 (2009-07-09 08:43) [8]To [7] Таблицы это написаны как пример. А вообще на входе может быть и INI файл и другое. Поэтому надо заполнить данные в зависимости от связей в разные подзависимые стринглисты, чтобы потом удобно было работать вытаскивая любую информацию. То есть стринглисты могут быть как бы "вложенными" в несколько уровней, в зависимости от задачи. В общем идея такая, чтоб написать класс (программу) как можно более независимый от постановки задачи (то есть от входных данных и глубины связей между даннымит)
← →
Anatoly Podgoretsky © (2009-07-09 08:44) [9]
> Ведь при создании таким образом мы не знаем какое имя будет
> у каждого стринглиста.
Почему это не знаем, имя точно также можно указать любое.Name := любое_имя;
← →
Abcdef123 (2009-07-09 09:08) [10]To
> Почему это не знаем, имя точно также можно указать любое.
> Name := любое_имя;
Но у стринглиста нет свойства Name.
← →
Leonid Troyanovsky © (2009-07-09 09:14) [11]
> Abcdef123 (09.07.09 08:43) [8]
Не знаю, какие структуры здесь будут полезны,
но, IMHO, не TStringList.
Посмотри в сторону variant: VarArrayCreate, VarArrayOf
и далее со всеми остановками.
--
Regards, LVT.
← →
Abcdef123 (2009-07-09 09:32) [12]To [11]
Насчет VarArrayCreate, VarArrayOf буду читать. Спасибо.
И все же на будущее хотелось бы знать ответ насчет изначального вопроса "возможно ли создавать StringList - ы без объявления их как переменной и обращаться к ним после создания всех?"
← →
Dennis I. Komarov © (2009-07-09 09:33) [13]Метод Create вернет указатель на созданный объект. Можешь хранить их в некой древовидной структуре, незабывая освобождать память от ненужных...
← →
Dennis I. Komarov © (2009-07-09 09:35) [14]
> Abcdef123 (09.07.09 09:32) [12]
AnyPointer:=TStringList.Create
TStringList(AnyPointer)...
← →
Abcdef123 (2009-07-09 09:48) [15]To [13] [14] : Ну так чтобы использовать указатели, надо их заранее объявить. А мы заранее не знаем сколько надо будет указателей (каждый раз по разному, в зависимлсти от входной информации. То есть получается ситуация такая же как и проблема с объявлением стриглистов.
← →
Leonid Troyanovsky © (2009-07-09 09:50) [16]
> Abcdef123 (09.07.09 09:32) [12]
> вопроса "возможно ли создавать StringList - ы без объявления
> их как переменной и обращаться к ним после создания всех?
См., например, динамический массив, TObjectList -
обращаемся по индексу, приводим тип к TStringList.
Только возникает вопрос, а где хранить нужные индексы?
По-видимому, нужны более развитые структуры, более точно
описывающие исходные данные.
--
Regards, LVT.
← →
Dennis I. Komarov © (2009-07-09 09:51) [17]А что мешает объявить динамический массив указателей? Ну или TList заюзать, хотя это уже...
← →
Anatoly Podgoretsky © (2009-07-09 09:53) [18]> Abcdef123 (09.07.2009 09:08:10) [10]
Зато есть такие вещи, как динамические массивы, объектные и необъектные списки и другие структуры, не говоря уже об смене типа.
← →
Qwerty890 (2009-07-09 10:00) [19]кактотак
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;
← →
Abcdef123 (2009-07-09 11:53) [20]Всем спасибо за участие и советы. Особое спасибо Qwerty890. Думаю, что остановлюсь на этом варианте использования array of TStringList. Но, другие советы тоже приму к сведению на будущее!
← →
sniknik © (2009-07-09 12:15) [21]говорят первое пришедшее в голову верно... не всегда скорее всего, но тут по моему "в точку".
почему таблицы только для примера? они тут как нельзя лучше подходят, 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 естественно, текущая запись, и что останется в связанной выделено.
← →
Anatoly Podgoretsky © (2009-07-09 12:34) [22]> Abcdef123 (09.07.2009 11:53:20) [20]
Все таки задумайся над использованием TObjectList
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.09.06;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.006 c