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

Вниз

Типизированный StringList   Найти похожие ветки 

 
Zhekson   (2005-01-06 09:52) [0]

Есть ли способ вбить в подобие StringList_а типизированный набор данных? + потом обращаться к определённому набору по индексу.


 
Fay ©   (2005-01-06 09:54) [1]

Ага. Только его нужно родить от TList.


 
begin...end ©   (2005-01-06 09:56) [2]

> Zhekson   (06.01.05 09:52)

У TStringList есть свойство Objects. В него можно запихивать pointer"ы.


 
Fay ©   (2005-01-06 09:58) [3]

String - типизированные данные? 8)


 
begin...end ©   (2005-01-06 09:59) [4]

> [3] Fay ©   (06.01.05 09:58)

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


 
Zhekson   (2005-01-06 10:00) [5]

Спасибо, буду пробовать...

далеко мою ветку не опускайте, а то вдруг возникнут вопросы ;)


 
Fay ©   (2005-01-06 10:00) [6]

2 begin...end ©   (06.01.05 9:59) [4]
А мне не очевино, что автору нужны сами строки 8)


 
Zhekson   (2005-01-06 10:03) [7]

Молодцы... с утра поругаешься, потом весь день заведённый на жизненную активность... главное спор не проиграть... ;)


 
Fay ©   (2005-01-06 10:12) [8]

Zhekson   (06.01.05 10:03) [7]
Ты веткой не ошибся?


 
Zhekson   (2005-01-06 10:22) [9]

[8] - я её породил, а Вы в ней спорите, кто правильнее ответил... Думаю что не ошибся.

кстати


type datafl = packed record
    h, m, s : byte;
    msec, mksec: word;
    ardat : array[1..40] of byte;
    end;
type fdata = file of datafl;
var fileinp, fileout: fdata;
   dataflash, dataflash1: datafl;
var
List_zv: TList;
item_zv: Pointer;
........................
List_zv := TList.Create;
item_zv := New(dataflash); //Incompatible types


Я думал, что этот список все типы кушает... Или я ошибаюсь?


 
begin...end ©   (2005-01-06 10:24) [10]

> [9] Zhekson   (06.01.05 10:22)

> item_zv := New(dataflash);

New - это процедура, а не функция.


 
Zhekson   (2005-01-06 10:32) [11]

бррррр...

так можно, в таким образом созданный список, вставить переменную типа datafl, под определённым индексом???


 
begin...end ©   (2005-01-06 10:34) [12]

> [11] Zhekson   (06.01.05 10:32)

Можно вставить в список УКАЗАТЕЛЬ на переменную типа datafl.


 
Zhekson   (2005-01-06 10:39) [13]

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

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


 
begin...end ©   (2005-01-06 10:45) [14]

> [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.


 
Fay ©   (2005-01-06 10:45) [15]

var
 ...
 p : Pointer;
 ...
begin
 ...
 GetMem(p, SizeOf(datafl));
 item_zv := p;
 ...
end;


 
Fay ©   (2005-01-06 10:46) [16]

Нафиг я лишнюю переменною-то завёл? 8)


 
Zhekson   (2005-01-06 10:55) [17]

Спасибо огромное.
Это то, что нужно.


 
Zhekson   (2005-01-06 11:01) [18]


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;

Интересно... а что тогда делает вот этот код из книги???


 
begin...end ©   (2005-01-06 11:05) [19]

> [18] Zhekson   (06.01.05 11:01)

Это из Фаронова? Я видел там это.

> Item := New(Value);

Это просто ошибка.


 
Zhekson   (2005-01-06 11:12) [20]

begin...end ©   (06.01.05 11:05) [19]

даааааааа...
а я уж грешным делом решил менять мировозрение...

А что конкретно в этом коде неправильно? Он мне более понятен, и надо бы его исправить, чтоб через пару месяцев опять на него не нарваться.


 
Fay ©   (2005-01-06 11:16) [21]

New(var P: Pointer)


 
begin...end ©   (2005-01-06 11:19) [22]

> [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


 
begin...end ©   (2005-01-06 11:22) [23]

К [22]: Value: AnyType можно убрать.


 
Zhekson   (2005-01-06 11:28) [24]

Во...
Вот теперь совсем всё стало понятно...

СПАСИБО


 
msguns ©   (2005-01-06 12:17) [25]

Такое тоже работает:

List.Insert(0, NEW(DataPointer));


 
begin...end ©   (2005-01-06 12:20) [26]

> msguns ©   (06.01.05 12:17) [25]

Ну если NEW - это Ваша собственная функция, возвращающая Pointer, - то почему бы этому и не работать?


 
Fay ©   (2005-01-06 12:23) [27]

begin...end ©   (06.01.05 12:20) [26]
New замечательно возвращает значение. Специально проверял. Во всяком случае P := New(PInteger) работает 8).


 
begin...end ©   (2005-01-06 12:31) [28]

> Fay ©   (06.01.05 12:23) [27]

> Во всяком случае P := New(PInteger) работает

Интересная ситуация. Но в [25] в New передаётся не имя типа, а переменная. [27] у меня работает, [25] - нет.


 
msguns ©   (2005-01-06 12:45) [29]

>begin...end ©   (06.01.05 12:31) [28]
>Интересная ситуация. Но в [25] в New передаётся не имя типа, а переменная. [27] у меня работает, [25] - нет.

NEW у меня, ессно, не "самопальная". Код в [25] приведен для твоего фрагмента [14] и он должен работать, т.к. DataPointer там типизированный указатель.


 
begin...end ©   (2005-01-06 12:54) [30]

> [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:56) [31]

Согласен, невнимательно посмотрел ;)


 
msguns ©   (2005-01-06 13:02) [32]

Тогда вопрос: а нафиг нужна вообще эта переменная ?
Я просто всегда использую собственно указатель, а не переменные, содержащие ссылки на них. Поэтому у меня всегда и работает ;)
Что же касается последующее присвоение полям ссылочной записи, то я просто использую преобразование этого типа к только что добавленному элементу списка (обычно первый (0) или последний (TList.Count-1))



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

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

Наверх




Память: 0.54 MB
Время: 0.025 c
14-1104571070
Меломан
2005-01-01 12:17
2005.01.23
Sweetbox - Shout


14-1104470296
DelphiN!
2004-12-31 08:18
2005.01.23
Как узнать подключена ли в конкретный момент времени USB мышь


1-1105423227
Руслан
2005-01-11 09:00
2005.01.23
ExcelApplication


4-1101966989
SergeyDon
2004-12-02 08:56
2005.01.23
получить координаты иконок на рабочем столе!


1-1104945007
CBOLOCH
2005-01-05 20:10
2005.01.23
Указатель на первую инструкцию программы