Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Статический метод класса

6.0K
30 июля 2007 года
_Greezlee_
41 / / 17.09.2005
Есть такая проблема:
внутри одного метода класса в функцию CreateThread нужно передать адрес другого метода того же класса. делаю так:
 
Код:
hThread := CreateThread(nil,0, @ListenThreadProc, @self, 0, iListenThreadID);

выдает ошибку Variable required...
В С++ это делается просто - метод ListenThreadProc объявляется как static и все... как это реализовать в Делфи?
303
31 июля 2007 года
makbeth
1.0K / / 25.11.2004
Вообще, статический метод класса в дельфи называется классовым методом и объявляется следующим образом:
 
Код:
TMyClass = class
    class procedure MyClassProc;
end;

Передать в процедуру CreateThread указатель на таким образом созданную процедуру не прокатит, поскольку ListenThreadProc имеет жестко заданный список параметров:
 
Код:
procedure ListenThreadProc(lpParameter: Pointer);

Если ты объявишь ее как классовый метод, то получишь уже немного другое:
 
Код:
procedure ListenThreadProc(Self: class of TMyClass; lpParameter: Pointer);

Дело в том, что дельфи сам создает неявный параметр Self даже у классовых методов (в отличие от экземплярных методов, он содержит ссылку на сам класс). Соответственно, использовать его в CreateThread нельзя.
Можно это обойти с помощью еще одной процедуры:
Код:
type
    TMyClass = class
        class procedure ListenProcedure(lpParameter: TMyClass);
    end;

procedure ListenThreadProc(lpParameter: Pointer); stdcall;
var Self: TMyClass;
begin
    Self:=TMyClass(lpParameter);
    Self.ListenProcedure(Self);
end;

Хотя в данном случае, думаю, классовый метод и не нужен вовсе...

ЗЫ: Данный код надо проверить - писал с ходе, дельфы под рукой нет :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог