Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Хочу передать адрес inherited / 4 сообщений из 4, страница 1 из 1
15.03.2018, 13:40
    #39615354
AndyMandy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хочу передать адрес inherited
Есть такой класс:
Код: 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
15.03.2018, 13:57
    #39615370
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хочу передать адрес inherited
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
15.03.2018, 14:19
    #39615386
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хочу передать адрес inherited
Код: 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
16.03.2018, 14:15
    #39615965
AndyMandy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хочу передать адрес inherited
Большое спасибо за ответы!
_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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Хочу передать адрес inherited / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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