Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно вызвать метод класса из CallBack функции


denkop ©   (2011-08-26 17:47:00) 

Есть такой код, задача которого в FResNames получить список имён ресурсов:
unit Unit1;

interface

uses Classes, Windows, SysUtils, ExtCtrls;

type

 TResContainer = class
 private
   FResNames: TStringList;

   procedure AddResName(ResName: string);
 public
   constructor Create;
   destructor Destroy;
 end;

implementation

function EnumResourceNamesCallback(hModule: HMODULE; lpType, lpName: PAnsiChar; lParam: Longint): BOOL; stdcall;
var
 ResName: string;
begin
 if (Cardinal(lpName) shr 16) = 0 then ResName:=IntToStr(Integer(lpName))
 else ResName:=lpName;

 // вот здесь как то нужно вызвать метод AddResName(ResName);

 Result := True;
end;

constructor TResContainer.Create;
var
 aResInstance: THandle;
begin
 FResNames:=TStringList.Create;

 aResInstance := FindResourceHInstance (HInstance);

 if not EnumResourceNames(aResInstance, RT_RCDATA, @EnumResourceNamesCallback, 0) then
   RaiseLastOSError;

 FResNames.SaveToFile('d:\111.txt');
end;

destructor TResContainer.Destroy;
begin
 FResNames.Free;
end;

procedure TResContainer.AddResName(ResName: string);
begin
 FResNames.Add(ResName);
end;

end.

Проблема в том, как обратиться из callback функции к методу или свойству класса? Или по другому вопрос можно поставить, как передать в качестве callback функции метод класса?


denkop   (2011-08-26 18:10:00) [1]

Спасибо большое!


_Юрий   (2011-08-26 18:02:00) [2]

Также у вас в коде потенциальная проблема с деструктором:

destructor Destroy; override;

в противном случае ваш деструктор не будет вызван при освобождении объекта TResContainer методом Free, и вы получите утечку памяти


_Юрий   (2011-08-26 17:53:00) [3]

в EnumResourceNames последним параметром передать указатель на экземпляр

EnumResourceNames(aResInstance, RT_RCDATA,
@EnumResourceNamesCallback, Longint(self))

в калл-беке использовать

function EnumResourceNamesCallback(hModule: HMODULE; lpType, lpName: PAnsiChar; lParam: Longint): BOOL; stdcall;
var
ResName: string;
container: TResContainer;
begin

container := TResContainer(lParam);


Наверх

Титульная страница Поиск, карта сайта Написать письмо