Главная страница
    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-1357143710
lamer6666
2013-01-02 20:21
2013.09.22
Визуализация занятости приложения.


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


2-1357805002
AstonMartin
2013-01-10 12:03
2013.09.22
добавление в ComboBox


15-1365712202
Юрий
2013-04-12 00:30
2013.09.22
С днем рождения ! 12 апреля 2013 пятница


15-1365676462
Bob
2013-04-11 14:34
2013.09.22
TColor и RGB - где правда в жизни ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский