Форум: "Потрепаться";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];
ВнизКак понять такой 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.013 c