Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.06;
Скачать: CL | DM;

Вниз

Вопрос по применению 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.041 c
2-1246728973
djkondakov
2009-07-04 21:36
2009.09.06
Ссылка из TLabel


2-1246958245
sashbc
2009-07-07 13:17
2009.09.06
vcl видимо


15-1247145135
Palladin
2009-07-09 17:12
2009.09.06
Вопросы вида "Когда будет сделано?"


15-1246536336
@!!ex
2009-07-02 16:05
2009.09.06
Сторожа сторожат хозяев


15-1246625032
Nil
2009-07-03 16:43
2009.09.06
Есть кто-нибдуь кто знает Delphi, С и кому интересен доп зработок