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

Вниз

Использование типа record   Найти похожие ветки 

 
Vlad2   (2002-08-22 06:53) [0]

Здравствуйте !
Подскажите, пожалуйста, кто знает, как создать объект типа record. Что-то не нашел ни в Help, ни в faq.
Необходимо работать с массивом объектов типа record, но как его
создать ? И как уничтожить ?


 
MBo ©   (2002-08-22 07:00) [1]

Record- не объект

type myrec=record
a:integer;
b:integer
end;

var ar:array[1..10] of myrec;

если надо динамически создавать:
type precarray=^recarray;
recarray=array[1..10] of myrec;

var p:precarray;

new(p);
p^[1].a:=3;
delete(p);





 
gek ©   (2002-08-22 07:01) [2]

type
TRecRaport = class(TObject)
private
{ Private declarations }
public
{ Public declarations }
s:string;
k:word;
z:real;
..........
a:char;
end;

var
Ra:TRecRaport;

begin
Ra:=TRecRaport.Create;
.............
..............
Ra.Free;


 
Vlad2   (2002-08-22 07:13) [3]

to MBo
О! то, что надо.
Сейчас проверю работу с динамическим массивом:

// from Mbo
type precarray=^recarray;

recarray=array[1..10] of myrec;
// заменю на recarray=array of myrec;
// т.к. размер массива неизвестен

var p:precarray;

new(p);
p^[1].a:=3;
delete(p);
//
Значит, я невнимательно читал Help. Спасибо.


 
Vlad2   (2002-08-22 07:18) [4]

Вдогонку to Mbo:
А почему Вы пишете "Record- не объект" ?
Я так понимаю, что есть объект типа class, объект типа Integer,
объект типа record, объект типа Interface. Существуют лишь
различия в правилах работы с ними и использовании памяти. Или нет ?


 
MBo ©   (2002-08-22 07:24) [5]

>Vlad2
>есть объект типа class, объект типа Integer,
в житейском смысле все можно назвать объектами, но в Object Pascal объект - специальный тип, напоминающий записи с методами (процедурами и функциями), скрытием полей, и вся работа с ним ведется только с помощью указательной технологии (обычно объектом назвают экземпляр класса, он является указателем, но ^-синтаксис к нему не нужно применять, это делается автоматически).
Про это нужно, конечно, читать.


>recarray=array[1..10] of myrec;
>// заменю на recarray=array of myrec;
>// т.к. размер массива неизвестен

какая стоит задача?
обрати внимание на списки (TList)



 
Vlad2   (2002-08-22 07:33) [6]

to Mbo
У меня мания - использовать макс. простые структуры.
TList содержит методы, которые мне не нужны.
Необходима конструкция (не говорю "объект", следуя Вашему разъяснению), которая только хранит данные, и доступ с элементу хранилища по индексу. Насколько я понял, при работе с record
опасность только в некорректных индексах.


 
MBo ©   (2002-08-22 07:42) [7]

динамическому массиву надо явно выделять память вызовом SetLength, можно обойтись и без ^

var ar:array of myrec;

setlength(ar,10);
ar[0].a:=3;


 
Vlad2   (2002-08-22 07:50) [8]

to Mbo
Отлично !
Надеюсь, и я Вам "когда нибудь пригожусь" (из сказки). Спасибо.


 
Digitman ©   (2002-08-22 09:00) [9]

>Vlad2


> У меня мания - использовать макс. простые структуры


Если ты подключил (осознанно, по каким-либо иным причинам) модуль classes.pas, нет смысла отказываться от удовольствия воспользоваться тем же TList, ибо неиспользуемый тобой код его все равно "мертвым грузом" тем или иным образом будет включен в АП твоего процесса как неотъемлемый фрагмент подключенного тобой модуля


 
Vlad2   (2002-08-22 09:10) [10]

to Digitman
Точно. Всё равно, где-то этот модуль будет будет подключён в
мой Application. Тогда вопрос: верно ли, что использование record
даст выигрыш в скорости обработки (record contra TList) ?


 
Digitman ©   (2002-08-22 09:18) [11]

>Vlad2

Не думаю, что выигрыш будет ощутимым. Речь о сколь-либо заметном выигрыше может идти лишь тогда, когда размера твоего массива записей не планируется динамически перераспределять в run-time (т.е. распределяется однократно)


 
Anatoly Podgoretsky ©   (2002-08-22 09:23) [12]

Если статический массив то то сотню миллисекунд на миллион обращений, по сравнению с динамическим или TList.
Почему бы не измерить время на большом цикле.


 
Vlad2   (2002-08-22 09:32) [13]

to Digitman
Так и есть, т.е. "Речь о сколь-либо заметном выигрыше может идти лишь тогда, ...", - размер динамического массива по жизни меняется, но не часто.

to Anatoly Podgoretsky
Прекрасная мысль, пратика - критерий истины.

Одноко, кажется, с большой уверенностью можно сказать, что TList - более правильное решение.


 
Dmitry W. Polschanoff   (2002-08-22 10:43) [14]

To MBo
> динамическому массиву надо явно выделять память вызовом
>
> SetLength, можно обойтись и без ^
> var ar:array of myrec;
> setlength(ar,10);
>ar[0].a:=3;



Реализация динамических массивов в делфи оставляет желать лучшего. Причем начиная во всех версиях, в которых она есть.
Ошибка настолько серьезная, что запросто можно получить
"скозящий" GPF. И режим Debug"а не поможет - показывает вываливание в различных (заведомо правильных) точках программы.


 
Vlad2   (2002-08-22 10:55) [15]

to Dmitry W. Polschanoff
Разъясните, пожалуйста, что есть
>"скозящий" GPF
(global pointer failure ?)


 
Dick ©   (2002-08-22 21:28) [16]

To Vlad2 >> TList удобно использовать когда требуется вставить элемент в список.
to Dmitry W. Polschanoff -
Ни разу не получал GPF(To Vlad2 >> General protection failure) при работе с динамическим массивом.



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

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

Наверх




Память: 0.5 MB
Время: 0.015 c
1-3469
Андрусь
2002-08-19 21:23
2002.09.02
как сделать чтобы форма отображалась как бы от центра


3-3306
VZ-KZ
2002-08-13 14:59
2002.09.02
Опять же база и Excel


3-3279
Aleksandr
2002-08-12 14:22
2002.09.02
Что требуется, чтобы программка с ADO приконнектилась?


1-3372
EugenCFG
2002-08-20 14:51
2002.09.02
Как динамически создать Edit...


1-3336
lipskiy
2002-08-21 16:57
2002.09.02
Графические глюки - какова природа и как побороть?