Как использовать поля класса в CallBack функции?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Как использовать поля класса в CallBack функции?

Сообщение resident »

Есть класс

Код: Выделить всё

type
  TWndFinder = class
    private
      fNames: TStringList; // массив названий окон 
      ....
    public
      property Names: TStringList read fNames;
      procedure FindWindow;
      ....

Процедура FindWindow вызывает функцию обратного вызова EnumCallBack, в которой я хочу заполнить поле fNames.

Код: Выделить всё

procedure TWndFinder.FindWindow;
  begin
     ....
    EnumWindows (@EnumCallBack, 0);
  end; 


Код: Выделить всё

function EnumCallBack(H: HWND; lP: lParam): BOOL; stdcall;
  begin
     ....
     fNames.Add(Wnd);
     ....
  end;

Здесь компилятор не признает fNames. Как бы ему показать это поле? :)
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Код: Выделить всё

procedure TWndFinder.FindWindow; 
  begin 
      .... 
     EnumWindows (@EnumCallBack, Self);
   end;

function EnumCallBack(H: HWND; lP: lParam): BOOL; stdcall;
  var
    this: TWndFinder absolute lp;
  begin
     ....
     this.fNames.Add(Wnd);
     ....
  end;
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Sergei I. Gorelkin писал(а):

Код: Выделить всё

procedure TWndFinder.FindWindow; 
  begin 
      .... 
     EnumWindows (@EnumCallBack, Self);
   end;

function EnumCallBack(H: HWND; lP: lParam): BOOL; stdcall;
  var
    this: TWndFinder absolute lp;
  begin
     ....
     this.fNames.Add(Wnd);
     ....
  end;


Спасиб :)
Только в точности как у Вас компилятор ругался, а получилось вот так:

Код: Выделить всё

EnumWindows (@EnumCallBack, LParam(Self));
Ответить