![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно вызвать метод класса из 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);