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

Вниз

Массивы   Найти похожие ветки 

 
Duke DEE ©   (2003-05-16 17:19) [0]

У меня такая проблема:
type
TOptions = record
Name: string;
Value: string;
Method: string;
end;

var
T:TStrings;
Opt: TOptions;
i:integer;
begin
for i:=1 to 5 do begin
Opt.Value:="value"+inttostr(i);Opt.Name:="name"+inttostr(i);
T.AddObject("a",Opt); end;
end;


короче мне надо чтото типо T[1].name .... T[2].value....
Но не с TStrings, а с чем то другим, с TStrings не работает!!!!

Если можно, с примером!


 
Skier ©   (2003-05-16 17:21) [1]


> с TStrings не работает!!!!

И не будет !
А в твоём коде - никогда не будет !


 
Duke DEE ©   (2003-05-16 17:22) [2]

Да я знаю что это не работает!!! мне надо что то подобное!!! может быть совсем по другому!!!


 
Юрий Федоров ©   (2003-05-16 17:23) [3]

Type
POptions = ^TOptions;
TOptions = record
Name: string;
Value: string;
Method: string;

var Opt : POptions;

New(Opt);

T.Add("", Pointer(Opt));

POptions(T.Objects[1])^.Value


 
Serginio   (2003-05-16 17:25) [4]

Type POptions=^TOptions;
Opt: POptions;
i:integer;
begin
for i:=1 to 5 do begin
New(Opt); Fillchar(Opt^,SizeOf(TOptions),0);
Opt.Value:="value"+inttostr(i);Opt.Name:="name"+inttostr(i);
T.AddObject("a",Opt); end;
end;



 
Skier ©   (2003-05-16 17:27) [5]

Господа, хорошо бы ещё T создать. :)


 
Serginio   (2003-05-16 17:34) [6]

Создай динамический массив
type TarOpt=array of TOptions и работай с ним применяя SetLength причем при этой процедуре все значения сразу инициализируются 0 в отличии New а для строк это фатально т.к. компилятор при присвоении новой ссылки на строку пытается уничтожить старую не равную nil


 
Serginio   (2003-05-16 17:37) [7]

(Skier) А чем POptions от TOptions ???? Т создается в стеке а P в общей куче или вообще не создается.


 
Skier ©   (2003-05-16 17:41) [8]

>Serginio (16.05.03 17:37)
T:TStrings; -> TStrings - это класс ! Причём "абстрактный" !


 
asafr ©   (2003-05-16 17:42) [9]

а Т, действительно, создать бы не плохо...


 
Serginio   (2003-05-16 17:47) [10]

Ну да самое главное я и просмотрел.
T:TStrings; ещебы сюда добавить T:=Tstrings.Create;
2(0) Используй не TStringList а TList или динамические массивы(Массивы предпочтительнее)
T:TList;

T:=TList.Create;



 
Юрий Федоров ©   (2003-05-16 17:49) [11]

Я думал, что создание Т подразумавается и опущено для сокращения, хотя глядя на остальной код, в этом возникают сомнения


 
Duke DEE ©   (2003-05-16 17:55) [12]


> Создай динамический массив
> type TarOpt=array of TOptions и работай с ним применяя SetLength
> причем при этой процедуре все значения сразу инициализируются
> 0 в отличии New а для строк это фатально т.к. компилятор
> при присвоении новой ссылки на строку пытается уничтожить
> старую не равную nil

Поясните Пожалста!!


 
Skier ©   (2003-05-16 17:59) [13]

>Duke DEE

1)

TOptions = record
Name: string;
Value: string;
Method: string;
end; //TOptions
POptions = ^TOptions;

2) TOptionsList = class(TList)
...................
property Items[Index : Integer] : POptions read Get write Put; default;


 
Serginio   (2003-05-16 18:01) [14]

Type POptions=^TOptions;
T:Tlist;
Opt: POptions;
i:integer;
begin
TList.Create;
for i:=1 to 5 do begin
New(Opt); Fillchar(Opt^,SizeOf(TOptions),0);// обязательно если поля типов (String,array of,IUnknow) тоесть с контролируемым временем жизни
Opt.Value:="value"+inttostr(i);Opt.Name:="name"+inttostr(i);
T.AddObject("a",Opt); end;
end;
Пример динамического массива
t:Array of TOption;
Setlength(t,5);
For i:=Low(t) to High(t) Do Begin

t[i].Value:="value"+inttostr(i);
[i].Name:="name"+inttostr(i);

end;





 
Skier ©   (2003-05-16 18:03) [15]

>Serginio (16.05.03 18:01)
TList.Create; - надеюсь это опечатка...


 
Serginio   (2003-05-16 18:04) [16]

Ошибочка T.Add(Opt); Но еще раз повторю динамический массив во много раз лучше как по выделению памяти, скорости и контролю жизни. В этом Delphi очень близок к Net


 
Serginio   (2003-05-16 18:06) [17]

А зачем ему TStringLis???


 
Duke DEE ©   (2003-05-16 18:19) [18]


> Пример динамического массива
> t:Array of TOption;
> Setlength(t,5);
> For i:=Low(t) to High(t) Do Begin
>
> t[i].Value:="value"+inttostr(i);
> [i].Name:="name"+inttostr(i);
>
> end;

Это мне более понятно, спасибо!!! Но как мне быть если я не знаю сколько их будет, Я сделаю 100 а их будет 150!
> t:Array of TOption;
> Setlength(t,5);

Почти тоже что и t:Array [1..5] of Toption;??


 
Serginio   (2003-05-16 18:25) [19]

For i:=0 to n do
Begin
SetLength(t,i+1);
t[i].Value:="value"+inttostr(i);
T[i].Name:="name"+inttostr(i);

end;


 
Duke DEE ©   (2003-05-16 18:26) [20]

Большое спасибо!


 
Skier ©   (2003-05-16 18:29) [21]

SetLength(T,n);
For i:=0 to n - 1 do Begin
T[i].Value:="value"+inttostr(i);
T[i].Name:="name"+inttostr(i);
end; //for



 
Serginio   (2003-05-16 18:47) [22]

Всегда проверяй на Length
If i>=Length(t) Then Setlengt(t,i);
Можешь применять как в TList Cappacity и длину. Посмотри исходники TList.



Страницы: 1 вся ветка

Текущий архив: 2003.05.29;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
1-94900
lipskiy
2003-05-14 21:01
2003.05.29
Как получить версию программы из нее самой


7-95127
Felix_the_cat
2003-03-29 04:44
2003.05.29
Обновление окна


14-95000
NewN
2003-05-08 08:30
2003.05.29
Навеяло...


6-94990
Hahn
2003-03-30 07:38
2003.05.29
Когда пытаюсь подсоединится клиентом, выводит ошибку.


3-94757
DelAlanPhi
2003-05-06 20:39
2003.05.29
DBGrid vs Excel