Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2013.09.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
denkop   (2011-08-26 17:47) [0]

Есть такой код, задача которого в 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 функции метод класса?


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

в 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);


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

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

destructor Destroy; override;

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


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

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



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2013.09.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.002 c
2-1357824398
LDV
2013-01-10 17:26
2013.09.22
использование Assert


15-1364221417
alexdn
2013-03-25 18:23
2013.09.22
Народ на ucoz


2-1357841185
Разведка
2013-01-10 22:06
2013.09.22
как определить контрол вызвавший popupmenu


8-1232828242
Vemer
2009-01-24 23:17
2013.09.22
Как быстро нарисовать точки из массива в Canvas/DC?


15-1365885002
Юрий
2013-04-14 00:30
2013.09.22
С днем рождения ! 14 апреля 2013 воскресенье





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский