Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2015, 16:03   #1
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию Процедура/функция обратного вызова в классе

Здравствуйте.

Хочу сделать принадлежность процедуры/функции обратного вызова классу. Делаю это через классовые процедуры/функции:

Код:
class function ...
class procedure ...

Делаю это так:

Код:
type
    MyProc = procedure(const str: string);

    TForm1 = class(TForm)
    ...
        class procedure callback(const str: string);
    ...
    end;

...

class procedure TForm1.callback(const str: string);
begin
  Form1.Memo1.Lines.Add(str);
end;

...

procedure UseCallbackFunc(proc: MyProc);
begin
  proc('1111');
end;
Использую:

Код:
TForm1.callback('1111');  //  нормально выводит текст в Memo1
UseCallbackFunc(@TForm1.callback);  //  выводит всякий бред в Memo1
Как я понимаю, это проблема в том, что кроме const str: string в callback все же есть скрытый параметр self.

Возможно ли вообще такое сделать, или нужно будет выносить callback из класса?

Заранее благодарен.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 30.07.2015, 16:26   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
type
  MyclassProc =procedure (const str: string) of object;

procedure UseCallbackFunc(proc: MyClassProc);
begin
  proc('1111');
end;
Код:
TForm1 =class
   procedure CallBack(const r: string); //!!! без  class !!!!
end;

procedure TForm1.callback;
begin
  memo1.text:=r;///!! без form1  !!!
end;
Код:
UseCallBackFunc(form1.callback);
подробнее есть здесь
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 30.07.2015 в 16:32.
evg_m вне форума Ответить с цитированием
Старый 30.07.2015, 16:39   #3
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Вы меня наверно неправильно поняли, мне наоборот нужно, чтоб функцию callback можно было использовать, например, в EnumWindows.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 30.07.2015, 16:49   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А почему Событие не опишешь? Обязательно коллбэк?
Цитата:
например, в EnumWindows.
Тогда она не должна быть методом класса.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.07.2015, 16:56   #5
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А почему Событие не опишешь?
Можно подробнее, о чем речь?

Цитата:
Сообщение от Stilet Посмотреть сообщение
Обязательно коллбэк?
Да, нужно передать адрес на эту функцию в чужую функцию, которая описана как:
Код:
MyProc = procedure(const str: string);
...
procedure UseCallbackFunc(proc: MyProc);
begin
  ...
end;
Цитата:
Сообщение от Stilet Посмотреть сообщение
Тогда она не должна быть методом класса.
Выходит никак нельзя, чтоб она была в самом классе?
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 30.07.2015, 17:06   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Можно подробнее, о чем речь?
Ты не в курсе что такое "Событие"?
Цитата:
Выходит никак нельзя, чтоб она была в самом классе?
Скорее нет чем да. Методы от функций тем и отличаются, что у них есть невидимый параметр, указатель на объект, который вызвал метод.
Код:
procedure foo(s); -> Procedure <name>(Parameter1)
procedure TClass.foo(s) -> Procedure <name>(Self,Parameter1);
Как твоя EnumWindow воспримет метод, если в нем задействовано два параметра, а не положенный один?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.07.2015, 17:16   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
EnumWindows
для таких случаев имеет параметр lParam в который можно пихнуть указатель/ссылку на что угодно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.07.2015, 17:22   #8
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
невидимый параметр, указатель на объект, который вызвал метод.
Именно с этим и есть проблема. Я пробовал делать через классовые процедуры/функции, их можно вызывать без объекта, но проблема в том, что с ними тоже работает некорректно.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 30.07.2015, 19:37   #9
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от Krasiosoft Посмотреть сообщение
Вы меня наверно неправильно поняли, мне наоборот нужно, чтоб функцию callback можно было использовать, например, в EnumWindows.
Для этого надо написать свой аналог процедуры MakeObjectInstance, которая сидит в недрах VCL и обеспечивает ее магию.
Vapaamies вне форума Ответить с цитированием
Старый 30.07.2015, 20:27   #10
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Должно быть как-то проще. В C++ для этого нужно было просто писать static перед функцией.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На С++ написать программу с реализацией в виде вызова функции по ссылке: Функция должна вернуть не одно, а ДВА(или более) значения Raitek Помощь студентам 2 23.01.2015 07:41
Процедура и функция Ken_Watanabe Помощь студентам 9 09.09.2014 16:27
Сделать чтобы функция стандартная String.Delete работала в классе потомке от TStringList? nick17 Общие вопросы Delphi 4 09.11.2010 14:17
Метод обратного вызова? Altera Общие вопросы Delphi 20 11.08.2010 18:27
Функция обратного вызова и таймер на WinApi flug Win Api 4 17.09.2009 16:06