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

Вниз

Как понять такой Record?   Найти похожие ветки 

 
Zergling ©   (2003-05-14 11:24) [0]

Здрасть всем!Как понять такой Record в модуле System.pas. По хелпу как то не очень врубился.

PVariantManager = ^TVariantManager;
{$EXTERNALSYM PVariantManager}
TVariantManager = record
VarClear: procedure(var V : Variant); <<< ???
....
end deprecated;
{$EXTERNALSYM TVariantManager}


 
MBo ©   (2003-05-14 12:36) [1]

Если я правильно понимаю, то см. процедурные типы в хелпе


 
АлексейК   (2003-05-14 13:20) [2]

А что разве в качетсве поля не может быть процедурный тип?


 
Mike Kouzmine ©   (2003-05-14 13:29) [3]

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


 
Digitman ©   (2003-05-14 13:32) [4]

тоже самое и здесь :

PMemoryManager = ^TMemoryManager;
TMemoryManager = record
GetMem: function(Size: Integer): Pointer;
FreeMem: function(P: Pointer): Integer;
ReallocMem: function(P: Pointer; Size: Integer): Pointer;
end;

да мало ли таких деклараций в сист.модулях ! и не в системных - тоже) ... мало ли вообще диспетчерских структрур существует !)

непонятно, в чем, по мнению автора, проявляется нонсенс)


 
Digitman ©   (2003-05-14 13:37) [5]


> Mike Kouzmine


насчет "процедурки вставлять" - это тебе приснилось)


 
Anatoly Podgoretsky ©   (2003-05-14 13:39) [6]

Ну нонсенса у него нет, наблюдается непонимание процедурных типов.


 
Mike B. ©   (2003-05-14 13:43) [7]

> Mike Kouzmine © (14.05.03 13:29)
Процедурки это врядли, конечно, но при наличии полей процедурного типа не хватает только механизма наследования


 
Digitman ©   (2003-05-14 13:46) [8]


> Anatoly Podgoretsky


а чего там понимать-то ?)

объявление поля процедурного типа - просто объявление указателя)


 
Palladin ©   (2003-05-14 13:48) [9]

ну не сталкивался он с этим еще, а книжки не читает...
что делать, конечно в форуме спросить


 
АлексейК   (2003-05-14 13:51) [10]

>Mike B.
А разве понятие класса
ограничивается полем да наследованием.


 
Mike B. ©   (2003-05-14 13:58) [11]

> АлексейК (14.05.03 13:51)
Конечно если строго подходить, то класс все равно не получится, но в некоторой степени полученная структура могла бы его заменить (правда все равно непонятно зачем :)


 
Anatoly Podgoretsky ©   (2003-05-14 14:00) [12]

Для организации наприме колбак функций, в класса это события.


 
Mike B. ©   (2003-05-14 14:02) [13]

> Anatoly Podgoretsky © (14.05.03 14:00)
вообще да действительно


 
Zergling ©   (2003-05-15 08:00) [14]

День добрый всем! Извеняйте, что отвечаю с такой задержкой.

Anatoly Podgoretsky © (14.05.03 13:39)
> Ну нонсенса у него нет, наблюдается непонимание процедурных типов.
Выразимся точнее - незнание т.к. с ними не сталкивался и не слыхивал о них.

Palladin © (14.05.03 13:48)
> ну не сталкивался он с этим еще, а книжки не читает...
Книги очень даже читаю, но т.к. подобного в свих книгах не нашел, то как ты верно выразился
> что делать, конечно в форуме спросить

Ну своял кое что простое

type
TMyProc = record
n: procedure (S: String);
end;

Procedure kkk(S: String);
begin
MessageDlg(S, mtInformation, [mbOK], 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var V: TMyProc;
begin
v.n := kkk;
v.n("sss");
end;

Теперь у меня возник вопрос. Какая выгода использования такого подхода (т.е. в каких случаях и для каких целей используется)? Если кого не затруднит киньте простенький примерчик , чтобы лучше понять использование всего этого (или киньте ссылочку пожалуйста, где я мого просветиться на эту тему).
Всетаки интересно мне, что это такое, как и для чего это используют.


 
Думкин ©   (2003-05-15 08:11) [15]

У... как все запущено.
да много.
А интегралы брать?
Ты ему функцию и границы - он тебе ответ.
А функции рааазные бывают. Но одно ... они все одного типа.
Это для начала.


 
Zergling ©   (2003-05-15 08:52) [16]

Думкин © (15.05.03 08:11)
> У... как все запущено.
К примеру ведь привел.
Вопрос в большей степени ведь
> Какая выгода использования такого подхода


 
uw ©   (2003-05-15 08:57) [17]

В Дельфях это очень широко используется для описания событий. Посмотри, например,

TNotifyEvent = procedure(Sender: TObject) of object;

в Classes.

Каждый раз, когда ты назначаешь некоторое событие компоненту, ты пользуешься этим механизмом.
Как это все работает? Пусть у компонента есть поле

FOnChange: TNotifyEvent;

По сути - это адрес метода. Где-то компонент делает так:

if Assigned(FOnChange) then
FOnChange(Self);

Т.е. если ты задал обработчик события OnChange, то делается косвенный вызов FOnChange(Self), иначе не делается.


 
Думкин ©   (2003-05-15 09:11) [18]


> Zergling © (15.05.03 08:52)

Я тебе для начала и ответил.
Твоя процедура не знает интегрируемую функцию - ты ее передаешь при обращении. Удобно?


 
uw ©   (2003-05-15 09:20) [19]

>Zergling © (14.05.03 11:24)

Использование косвенных адресов в структурах типа приведенной тобой в первом посте - это наследие дообъектноориентированного программирования. Смысл следующий.

Пусть у тебя есть некоторая сущность, описанная в некотором модуле. Пусть вне модуля она описывается данными и действиями, которые она умеет производить. Все это собирается вместе в одной структуре: данные описываются переменными, действия - адресами подпрограмм, возможно, реализованных в этом модуле. Разработчик может переопределить действие сущности, написав в другом модуле свою подпрограмму и задав ее адрес в видимой ему структуре.

Сейчас для таких целей лучше использовать виртуальные методы. Но и старый способ тоже хорош, что и демонстрирует Delphi.


 
Zergling ©   (2003-05-15 09:20) [20]

А как правельней будет? Не затруднит примерчик кинуть?


 
Zergling ©   (2003-05-15 09:24) [21]

Zergling © (15.05.03 09:20)
> А как правельней будет? Не затруднит примерчик кинуть?
Это я к Думкин © (15.05.03 09:11)


 
Думкин ©   (2003-05-15 09:33) [22]

F1=FUNCTION(T:EXTENDED):EXTENDED;

FUNCTION INTG(A,B,EPS:EXTENDED;FF:F1):EXTENDED;
VAR K:SHORTINT;
H,N1,S,S1,D,E:EXTENDED;
BEGIN
H:=B-A;
S1:=0;
E:=200;
WHILE E>EPS DO
BEGIN
S:=0;
H:=H/2;
D:=A;
REPEAT
FOR K:=1 TO 8 DO S:=S+YINT[K]*FF(D+H*XINT[K]);
D:=D+H;
UNTIL NOT(D<B-H/2);
N1:=H*S+0.0001;
E:=ABS((N1-S1)/n1);
S1:=N1;
{GOTOxy(10,21);
WRITELN(S," ",H," ",E);}
END;
INTG:=S1;
END;


 
uw ©   (2003-05-15 09:51) [23]

Я еще подумал и понял, что виртуальный метод напрямую не может заменить косвеннй вызов в тех случаях, когда нам требуется переназначать действия в процессе выполнения.



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

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

Наверх




Память: 0.52 MB
Время: 0.014 c
14-3113
Ренат
2003-05-13 16:58
2003.06.02
Словарь online


14-3118
Alex Konshin
2003-05-13 01:36
2003.06.02
Американские авто.


1-2878
User
2003-05-22 12:43
2003.06.02
Быстрое копирование блоков памяти


1-2916
OlegM
2003-05-23 07:12
2003.06.02
Как в memo сделать поиск


14-3125
Skier
2003-05-12 16:42
2003.06.02
---|Ветка была без названия|---