Форум: "Основная";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
ВнизПомогите разобраться с CallBack Найти похожие ветки
← →
Neep (2004-03-28 11:46) [0]Существует какой-то класс TMyClass, у него есть функция Init, внутри которой вызывается процедура с CallBack параметром, а внутри функции CallBack нужно сделать событие. Но фигня в том, что Callback не является экземпляром класса, поэтому невозможно обратиться к FOnMyEvent.
Как это можно реализовать?interface
type
TMyEvent = procedure(ID: integer) of object;
TMyClass = class(TObject)
private
...
procedure Init;
protected
...
FOnMyEvent: TMyEvent;
public
constructor Create;
destructor Destroy; override;
property OnMyEvent: TMyEvent read FOnMyEvent write FOnMyEvent;
....
end;
implementation
procedure Callback(N: integer); stdcall;
begin
...
if N=1 then
if Assign(FOnMyEvent) then FOnMyEvent(N);
{но это неправильно, т.к. FOnMyEvent неизвестный идентификатор}
{потому-что эта процедура не является экземпляром класса}
...
end;
procedure TMyClass.Init;
begin
...
MyProcedure(@CallBack);
...
end;
← →
Тимохов © (2004-03-28 11:53) [1]передавайте в callback self.
← →
Гаврила (2004-03-28 11:57) [2]>>что Callback не является экземпляром класса
Не экземпляром, а методом.
Для того, чтобы внутри Callback был доступен экземпляр класса, сущеаствует 2 пути
1. Расширить список параметров Callback , передавать туда указатель.
2. передавать указатель на экземпляр через глобальную переменную
← →
Neep (2004-03-29 18:25) [3]Гаврила, правильно, что заметил Callback это не экземпляр а метод. Теперь поясню, CallBack это виндовая процедура и добавить туда параметр мне кажется нельзя, а на счет второго способа можно пример небольшой привести. Помоему Тимохов тоже это имел ввиду.
← →
Тимохов © (2004-03-29 18:28) [4]нет я имел в виду именно первое.
вы что-то батенька вводите общественность в заблеждение.
если callback виндновая процедура, то зачем из виндовой процедуры обращаться к fonmyevent. вы думаете винвовз знает про дельфи и его события?
← →
han_malign © (2004-03-29 18:31) [5]>CallBack это виндовая процедура
- вот как раз в виндовых CallBack-ах, всегда передается контекст, указанный при инициализации асинхронной операции. Так, что этот CallBack - не виндовый...
← →
Юрий Зотов © (2004-03-29 18:33) [6]Что-то есть большие сомнения по поводу того, что callback - это именно виндовая (т.е. апишная) процедура. Нельзя ли конкретно - о какой именно процедуре идет речь?
← →
Neep (2004-03-29 18:36) [7]Поясняю, для общественности. Вот это функция (TAPI), имеет параметр 3 CallBack.
if lineInitializeEx(@lineApp,
hInstance,
@LineCallback,
"TapiModule",
nDevs,
TapiVersion,
LineInitializeExParams) <> 0 then Goto L1;
А вот сам CallBack как выглядитprocedure LineCallback(hDevice, dwMsg, dwCallbackInstance, dwParam1, dwParam2, dwParam3: LongInt); stdcall;
А нужно внутри CallBack, при получении сообщения к примеру LINECALLSTATE_BUSY как-то в классе метод OnBusy сделать.
← →
Юрий Зотов © (2004-03-29 18:56) [8]> Neep (29.03.04 18:36) [7]
Таким образом, это все же не апишная, а юзерская функция (как, собственно говоря, и положено callback"у). А по сабжу - см. [2], п.2.
← →
Neep (2004-03-29 19:03) [9]Ну коротенький пример плиз, так просто смотреть [2] п.2 мало помогает
← →
Юрий Зотов © (2004-03-29 19:21) [10]Вот пример для ЕДИНСТВЕННОГО экземпляра TMyClass. Если нужно иметь НЕСКОЛЬКО, то вместо скалярной переменной MyClass используйте список (или массив) и целую переменную, содержащую индекс нужного объекта.
type
TMyEvent = procedure(ID: integer) of object;
TMyClass = class(TObject)
private
FOnMyEvent: TMyEvent;
procedure Init;
public
constructor Create;
destructor Destroy; override;
property OnMyEvent: TMyEvent read FOnMyEvent write FOnMyEvent;
end;
implementation
var
MyClass: TMyClass = nil;
procedure Callback(N: integer); stdcall;
begin
if (N = 1) and (MyClass <> nil) and Assigned(MyClass.FOnMyEvent) then
MyClass.FOnMyEvent(N)
end;
procedure TMyClass.Init;
begin
MyProcedure(@CallBack)
end;
constructor TMyClass.Create;
begin
inherited;
if MyClass = nil then MyClass := Self
end;
destructor TMyClass.Destroy;
begin
if MyClass = Self then MyClass := nil;
inherited
end;
← →
Neep (2004-03-29 19:35) [11]Огромное спасибо, сейчас буду пробовать
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.028 c