typedef TMyMouseMoveEvent = void (*fnOnMouseMove)( CObject *pSender, int id );
ну или что-то около (точно не помню), а вот of object на с++ ИМХО, не переводится... правда есть патерны реализующие идеологию делегатов ( то ли на CodeGuru, то ли на CodeProject видел сегодня один вариант реализации ), но данная задача скорее всего решается другим путем.
Например если нужно отследить WM_MOUSEMOVE event ( как мне кажется это самая та проблема ), то достаточно воспользоваться колдуном для добавления в нужный класс обработчика для этого сообщения....
Вобщем приведи кусок кода для этого обработчика, там видно будет
... Но как я уже говорил, в контексте этого вопроса (исходя из собственного опыта) нужно идти другим путем... Просто по разному обрабатываются события на VC и делфи...
Здравствуйте, Владик, Вы писали:
В>Он там присутствует, и даже выделен жирным (TMyMouseMoveEvent — именно этот typedef).
ну что за ... . Я же прошу не слово TMyMouseMoveEvent, а код с typedef void (TObject::*TMyMouseMoveEvent)(TObject *, int), т.е. простенькую программку, которую можно скомпилить и проверить Строк на 15-20 я полагаю... если это вообще возможно в таком варианте
В>P.S. Кстати, а в дельфе можно описать указатель на метод без привязки к конкретному объекту?
Да, и к типу вообще! Фича работает на уровне компилятора — чего нет в с++ ( увы ).
Вот к пример использования делегатов на паскале
unit TestEventHandler;
{ Пример модуля, содержащего как класс источника событий, так и класс обработчика}type// Тип метода-обработчика событий
TSomeEventHandler = procedure ( Sender: TObject; Code: Integer ) of object;// Источник событий
TSomeEventSource = class ( TObject )
protected
FSomeEventHandler: TSomeEventHandler;
public
constructor Create; override;
procedure FireSomeEvent( nCode: Integer );
published
property SomeEventHandler: TSomeEventHandler read FSomeEventHandler write FSomeEventHandler;
end;
// Обработчик событий
TSomeEventHandler = class ( TObject )
public
procedure SomeEventHandler( Sender: TObject; Code: Integer );
end;
implementation
constructor TSomeEventSource.Create;
begin
FSomeEventHandler = nil;
end;
procedure TSomeEventSource.FireSomeEvent( nCode: Integer );
begin
if assigned( FSomeEventHandler ) then
FSomeEventHandler( self, nCode );
end;
procedure TSomeEventHandler.SomeEventHandler( Sender: TObject; Code: Integer );
MessageBox(0, 'SomeEvent', nil, 0 );
end;
end.
А теперь собственно использование
procedure TForm.Button1Click(Sender: TObject);
var
EventSource: TSomeEventSource;
EventHandler: TSomeEventHandler;
begin
EventSource := TSomeEventSource.Create;
EventHandler := TSomeEventHandler.Create;
// вот присвоение
EventSource.SomeEventHandler = EventHandler.SomeEventHandler;// генерация с обработкой
EventSource.FireSomeEvent(1);
end;
Причем заметим что привязки ни к типу объекта, ни к самому объекту на этапе определения типа обработчика не происходит А теперь то же самое на с++, пожалуйста...
Здравствуйте, AlexEagle, Вы писали:
AE>Причем заметим что привязки ни к типу объекта, ни к самому объекту на этапе определения типа обработчика не происходит
Привязки к типу нет, а привязка к объекту есть во время присваивания. Попробую пояснить на примере. Представь, что у тебя есть коллекция объектов и для них нужно вызвать заранее неизвестный метод. Как это будет выглядеть на дельфе? В С++ это решается передачей вышеописанного указателя на метод, потому что привязка к объекту происходить непосредственно в момент вызова.
Если же нужно добиться дельфового поведения, то связать указатель на метод с самим объектом во время присваивания можно используя boost::bind, а для хранения полученного в процессе связывания объекта — использовать boost::function. Тебя смущает использование boost — придумывай свой велосипед, сути это не меняет.
AE>А теперь то же самое на с++, пожалуйста...
Здравствуйте, Владик, Вы писали:
В>Привязки к типу нет, а привязка к объекту есть во время присваивания.
Ну дык оно и понятно! Иначе как метод потом вызывать ? Делфя то же самое неявно делает...
В>Вот полный аналог твоего дельфового примера:
Что значит полный ? Где в моем примере привязка к типу объекта ?
И далее, просвети что такое TObject на vc++ ? Даже если это CObject, то почему объект обработчика обязательно должен быть унаследован от CObject ?
Здравствуйте, AlexEagle, Вы писали:
В>>Привязки к типу нет, а привязка к объекту есть во время присваивания. AE>Ну дык оно и понятно! Иначе как метод потом вызывать ? Делфя то же самое неявно делает...
Метод потом можно вызвать, имея сам объект. Собственно я и спрашивал — есть ли какой-то аналог этому в дельфе? На плюсах это записывается так:
(object.*MethodPointer)();
В>>Вот полный аналог твоего дельфового примера: AE>Что значит полный ? Где в моем примере привязка к типу объекта ? AE>И далее, просвети что такое TObject на vc++ ? Даже если это CObject, то почему объект обработчика обязательно должен быть унаследован от CObject ?
Потому что в дельфе все объекты — неявные наследники TObject. Поэтому все обработчики унаследованы от TObject по определению. В плюсах такой единый базовый класс можно ввестия явно (хотя это не модно).
Здравствуйте, Владик, Вы писали:
В>Метод потом можно вызвать, имея сам объект.
Вот! Потому делфя неявно где-то сохраняет объект
В>Собственно я и спрашивал — есть ли какой-то аналог этому в дельфе?
Я же говорю — неявно!
В>Потому что в дельфе все объекты — неявные наследники TObject.
Это так, и поэтому привязка к типу TObject в делфи равносильна отсутствию привязки, но не в vc++!!!! А ты мне что?
В>В плюсах такой единый базовый класс можно ввестия явно (хотя это не модно).
И что это даст — я всегда могу создать класс не-наследник твоего базового
Здравствуйте, AlexEagle, Вы писали:
В>>Метод потом можно вызвать, имея сам объект. AE>Вот! Потому делфя неявно где-то сохраняет объект
В>>Собственно я и спрашивал — есть ли какой-то аналог этому в дельфе? AE>Я же говорю — неявно!
А если он просто не нужен? Я приводил пример: есть коллекция объектов и один указатель на метод. Нужно для каждого объекта вызвать соответствующий метод, с виртуальностью, все как положено.
[...] В>>В плюсах такой единый базовый класс можно ввестия явно (хотя это не модно). AE>И что это даст — я всегда могу создать класс не-наследник твоего базового
И получишь ошибку компиляции. Кстати, а в дельфе можно описать указатель на метод конкретного класса (не TObject)?
AE>Я повторяю — где универсальный пример?
Если нужно вызвать неизвестно что неизвестно у кого — то просто заводишь весь из себя абстрактный boost::function и не паришься.
Здравствуйте, Владик, Вы писали:
В>Если нужно вызвать неизвестно что неизвестно у кого — то просто заводишь весь из себя абстрактный boost::function и не паришься.
Вот! ну или другой вариант, но не typedef void (TObject::*TMyMouseMoveEvent)(TObject *, int)