powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Хочу передать адрес inherited
4 сообщений из 4, страница 1 из 1
Хочу передать адрес inherited
    #39615354
Фотография AndyMandy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой класс:
Код: pascal
1.
2.
3.
4.
TMyQuery = class(TQuery)
 ....
public
  procedure DoBeforeOpen; override;


Метод DoBeforeOpen реализован вот так:
Код: pascal
1.
2.
3.
4.
5.
6.
procedure TMyQuery.DoBeforeOpen;
  begin
  if Func(Self, cmCallBefore) then
     inherited;
  Func(Self, cmCallAfter);
  end; 

Как бы передать в функцию Func адрес метода inherited, что бы избежать двух вызовов функции Func?

Что то типа такого:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TMyQuery.DoBeforeOpen;
   begin
   Func(Self, cmCallBefore, inherited);
   end;
procedure Func(Obj:TObject; Mode: integer; inh: procedure of object)
   begin
   if Mode = cmCallBefore then
      inh;
   end; 
...
Рейтинг: 0 / 0
Хочу передать адрес inherited
    #39615370
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndyMandyКак бы передать в функцию Func адрес метода inherited, что бы избежать двух вызовов функции Func?Какое-то очень странное желание. Данный код
AndyMandy
Код: pascal
1.
2.
3.
4.
5.
6.
procedure TMyQuery.DoBeforeOpen;
begin
  if Func(Self, cmCallBefore) then
     inherited;
  Func(Self, cmCallAfter);
end; 

прост и понятен. Зачем его усложнять?

А по вопросу, подозреваю, что так
Код: pascal
1.
 Func(Self, cmCallBefore, inherited DoBeforeOpen);

будет работать. Но, повторюсь, не вижу в этом смысла. Тем более при такой
AndyMandy
Код: pascal
1.
2.
3.
4.
5.
procedure Func(Obj:TObject; Mode: integer; inh: procedure of object)
begin
   if Mode = cmCallBefore then
      inh;
end; 

реализации
...
Рейтинг: 0 / 0
Хочу передать адрес inherited
    #39615386
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
const cmCallBefore = 1;
      cmCallAfter = 2;
type
TProcedure = procedure of object;
TMyQuery = class(TQuery)
public
  procedure DoBeforeOpen; override;
end;

function Func(Obj:TObject; Mode: integer; inh: TProcedure): boolean;
begin
  if Mode = cmCallBefore then inh;
end;

procedure TMyQuery.DoBeforeOpen;
var X: TProcedure;
    c: TClass;
    M: TMethod;
begin
  TMethod(X).Code := @TQuery.DoBeforeOpen; // Статический адрес родителя
  TMethod(X).Data := Self;
  Func(Self, cmCallBefore, X);
end;

// test
procedure TForm1.FormClick(Sender: TObject);
var Q: TMyQuery;
begin
  Q := TMyQuery.Create(nil);
  Q.DoBeforeOpen;
  Q.Free;
end;
...
Рейтинг: 0 / 0
Хочу передать адрес inherited
    #39615965
Фотография AndyMandy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо за ответы!
_Vasilisk_
Код: pascal
1.
 Func(Self, cmCallBefore, inherited DoBeforeOpen);


К сожалению это вызов inherited DoBeforeOpen и попытка передать результат в Func.

DimaBr
Код: pascal
1.
2.
3.
4.
...
TMethod(X).Code := @TQuery.DoBeforeOpen; // Статический адрес родителя
TMethod(X).Data := Self;
....


Классная идея, жалко только, что кода стало больше, но все равно спасибо.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Хочу передать адрес inherited
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]