Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Типизированный StringList [D7, WinXP]


Страницы:   1 2

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]

торможу...
не могу понять как это дело реализовать...
по той литературке которая у меня под рукой, вроде бы всё правильно...

подсоби, если не трудно...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо