![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Типизированный StringList [D7, WinXP]
Zhekson © (2005-01-06 09:52:00)Есть ли способ вбить в подобие StringList_а типизированный набор данных? + потом обращаться к определённому набору по индексу.
msguns (2005-01-06 13:02:00) [1]Тогда вопрос: а нафиг нужна вообще эта переменная ?
Я просто всегда использую собственно указатель, а не переменные, содержащие ссылки на них. Поэтому у меня всегда и работает ;)
Что же касается последующее присвоение полям ссылочной записи, то я просто использую преобразование этого типа к только что добавленному элементу списка (обычно первый (0) или последний (TList.Count-1))
msguns (2005-01-06 12:56:00) [2]Согласен, невнимательно посмотрел ;)
begin...end (2005-01-06 12:54:00) [3]> [29] msguns © (06.01.05 12:45)
New может использоваться как функция в том случае, если передавать в неё ИМЯ УКАЗАТЕЛЬНОГО ТИПА, но не ПЕРЕМЕННУЮ-УКАЗАТЕЛЬ.
Например:
type
pDataFL = ^DataFL;
DataFL = record
...
end;
var
DataPointer1, DataPointer2: pDataFL;
begin
DataPointer1 := New(pDataFL); <-- так работает
New(DataPointer2); <-- так тоже работает
DataPointer2 := New(DataPointer1) <-- так НЕ работает
end.
> Код в [25] приведен для твоего фрагмента [14] и он должен
> работать
В таких случаях лучше просто взять и проверить.
msguns (2005-01-06 12:45:00) [4]>begin...end © (06.01.05 12:31) [28]
>Интересная ситуация. Но в [25] в New передаётся не имя типа, а переменная. [27] у меня работает, [25] - нет.
NEW у меня, ессно, не "самопальная". Код в [25] приведен для твоего фрагмента [14] и он должен работать, т.к. DataPointer там типизированный указатель.
begin...end (2005-01-06 12:31:00) [5]> Fay © (06.01.05 12:23) [27]
> Во всяком случае P := New(PInteger) работает
Интересная ситуация. Но в [25] в New передаётся не имя типа, а переменная. [27] у меня работает, [25] - нет.
Fay (2005-01-06 12:23:00) [6]begin...end © (06.01.05 12:20) [26]
New замечательно возвращает значение. Специально проверял. Во всяком случае P := New(PInteger) работает 8).
begin...end (2005-01-06 12:20:00) [7]> msguns © (06.01.05 12:17) [25]
Ну если NEW - это Ваша собственная функция, возвращающая Pointer, - то почему бы этому и не работать?
msguns (2005-01-06 12:17:00) [8]Такое тоже работает:
List.Insert(0, NEW(DataPointer));
Zhekson (2005-01-06 11:28:00) [9]Во...
Вот теперь совсем всё стало понятно...
СПАСИБО
begin...end (2005-01-06 11:22:00) [10]К [22]: Value: AnyTypeможно убрать.
begin...end (2005-01-06 11:19:00) [11]> [20] Zhekson (06.01.05 11:12)
Ну... Я обычно использую New только для типизированных указателей, поэтому я бы исправил так:
var
List: TList;
Item: ^AnyType;
Value: AnyType;
begin
List := TList.Create; // Создаем список
New(Item);// Размещаем в куче данные
List.Add(Item); // Добавляем элемент к списку .....
List.Remove(Item); // Удаляем элемент из списка
Dispose(Item); // Удаляем его из кучи
List.Free; // Удаляем ненужный список
end
Fay (2005-01-06 11:16:00) [12]New(var P: Pointer)
Zhekson (2005-01-06 11:12:00) [13]begin...end © (06.01.05 11:05) [19]
даааааааа...
а я уж грешным делом решил менять мировозрение...
А что конкретно в этом коде неправильно? Он мне более понятен, и надо бы его исправить, чтоб через пару месяцев опять на него не нарваться.
begin...end (2005-01-06 11:05:00) [14]> [18] Zhekson (06.01.05 11:01)
Это из Фаронова? Я видел там это.
> Item := New(Value);
Это просто ошибка.
Zhekson (2005-01-06 11:01:00) [15]
var
List: TList;
Item: Pointer;
Value: AnyType;
begin
List := TList.Create; // Создаем список
Item := New(Value); // Размещаем в куче данные
List.Add(Item); // Добавляем элемент к списку .....
List.Remove(Item); // Удаляем элемент из списка
Dispose(Item); // Удаляем его из кучи
List.Free; // Удаляем ненужный список
end;
Интересно... а что тогда делает вот этот код из книги???
Zhekson (2005-01-06 10:55:00) [16]Спасибо огромное.
Это то, что нужно.
Fay (2005-01-06 10:46:00) [17]Нафиг я лишнюю переменною-то завёл? 8)
Fay (2005-01-06 10:45:00) [18]var
...
p : Pointer;
...
begin
...
GetMem(p, SizeOf(datafl));
item_zv := p;
...
end;
begin...end (2005-01-06 10:45:00) [19]> [13] Zhekson (06.01.05 10:39)
type
pDataFL = ^DataFL;
DataFL = record
...
end;
var
List: TList;
DataPointer: pDataFL;
begin
List := TList.Create;
try
New(DataPointer);
List.Insert(0, DataPointer);
finally
// Здесь финализируем указатели (Items),
// и только после этого уничтожаем список
List.Free
end
end.
Zhekson (2005-01-06 10:39:00) [20]торможу...
не могу понять как это дело реализовать...
по той литературке которая у меня под рукой, вроде бы всё правильно...
подсоби, если не трудно...