Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.054 c
1-1080557456
Эли
2004-03-29 14:50
2004.04.18
Открыть окно Эксплорера в своей программе


14-1080103983
Alexey
2004-03-24 07:53
2004.04.18
ABC Компонента для дельфи 7, где взять?


1-1080829677
Анатолий Ксюндзский
2004-04-01 18:27
2004.04.18
TListView


14-1080076271
Andy BitOff
2004-03-24 00:11
2004.04.18
На банерах кликать надо?


1-1080721314
Anna
2004-03-31 12:21
2004.04.18
Ревкция DBgrida на колесико мыши





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