Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];

Вниз

Типизированный 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.053 c
1-1104922884
vario
2005-01-05 14:01
2005.01.23
В GroupBox надо отследить переполнение Caption


10-1082104097
Dark Elf
2004-04-16 12:28
2005.01.23
Программный выбор листа в Excel


1-1105522667
hgd
2005-01-12 12:37
2005.01.23
Вопрос про отчеты


1-1105531581
TButton
2005-01-12 15:06
2005.01.23
RGB->HSB->RGB


3-1103562474
Ivan_
2004-12-20 20:07
2005.01.23
Не обязательный параметр у хранимой процедуры





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский