Форум: "Основная";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];
ВнизМассивы Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.009 c