Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.005 c
2-1246712483
Incognito
2009-07-04 17:01
2009.09.06
Как сделать Combobox и DateTimePicker только readonly


4-1216429875
batya-x
2008-07-19 05:11
2009.09.06
Получение имени файла из его ярлыка средствами winapi


15-1247085005
Юрий
2009-07-09 00:30
2009.09.06
С днем рождения ! 9 июля 2009 четверг


15-1246542517
RWolf
2009-07-02 17:48
2009.09.06
TreeView для показа/редактирования разнородных данных


15-1247208288
Внук
2009-07-10 10:44
2009.09.06
Пятничная задачка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский