Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.18;
Скачать: CL | DM;

Вниз

Помогите разобраться с 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.031 c
3-1079606356
SnapIn
2004-03-18 13:39
2004.04.18
Как увидеть данные из .ORA


6-1077018955
ORMADA
2004-02-17 14:55
2004.04.18
Ping определённый порт


1-1080713247
tivispider
2004-03-31 10:07
2004.04.18
Компиляция проекта в командной строке


14-1080215317
DelphiN!
2004-03-25 14:48
2004.04.18
Есть ли в природе сайт по С++, такой же прекрасный как этот?


3-1079874978
VitGun
2004-03-21 16:16
2004.04.18
Грабли с фильтрацией