Как это перевести в код vc?
От: Аноним  
Дата: 14.04.05 13:57
Оценка:
TMyMouseMoveEvent = procedure (Sender: TObject; id: Integer) of object;
Re: Как это перевести в код vc?
От: AlexEagle Украина http://www.vik.oil
Дата: 14.04.05 14:08
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>TMyMouseMoveEvent = procedure (Sender: TObject; id: Integer) of object;


ну такое

TMyMouseMoveEvent  = procedure (Sender: TObject; id: Integer);


можно так

typedef TMyMouseMoveEvent = void (*fnOnMouseMove)( CObject *pSender, int id );


ну или что-то около (точно не помню), а вот of object на с++ ИМХО, не переводится... правда есть патерны реализующие идеологию делегатов ( то ли на CodeGuru, то ли на CodeProject видел сегодня один вариант реализации ), но данная задача скорее всего решается другим путем.

Например если нужно отследить WM_MOUSEMOVE event ( как мне кажется это самая та проблема ), то достаточно воспользоваться колдуном для добавления в нужный класс обработчика для этого сообщения....

Вобщем приведи кусок кода для этого обработчика, там видно будет
Re: Как это перевести в код vc?
От: Владик Россия  
Дата: 14.04.05 14:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>TMyMouseMoveEvent = procedure (Sender: TObject; id: Integer) of object;


typedef void (*TMyMouseMoveEvent)(TObject *, int);
Как все запущенно...
Re[2]: Как это перевести в код vc?
От: Аноним  
Дата: 14.04.05 14:39
Оценка:
Здравствуйте, Владик, Вы писали:

В>Здравствуйте, Аноним, Вы писали:


А>>TMyMouseMoveEvent = procedure (Sender: TObject; id: Integer) of object;


В>typedef void (*TMyMouseMoveEvent)(TObject *, int);


Большое спасибо!
Re[2]: Как это перевести в код vc?
От: AlexEagle Украина http://www.vik.oil
Дата: 14.04.05 15:07
Оценка: 3 (1)
Здравствуйте, Владик, Вы писали:

А>>TMyMouseMoveEvent = procedure (Sender: TObject; id: Integer) of object;


В>typedef void (*TMyMouseMoveEvent)(TObject *, int);


Да ну, а я вижу всего лишь перевод

TMyMouseMoveEvent  = procedure (Sender: TObject; id: Integer) ; (без of object )
Re[3]: Как это перевести в код vc?
От: Владик Россия  
Дата: 14.04.05 15:28
Оценка: :)
Здравствуйте, AlexEagle, Вы писали:

AE>Да ну, а я вижу всего лишь перевод


AE>
AE>TMyMouseMoveEvent  = procedure (Sender: TObject; id: Integer) ; (без of object )
AE>


typedef void (TObject::*TMyMouseMoveEvent)(TObject *, int);
Как все запущенно...
Re[4]: Как это перевести в код vc?
От: AlexEagle Украина http://www.vik.oil
Дата: 14.04.05 18:22
Оценка:
Здравствуйте, Владик, Вы писали:

В>
В>typedef void (TObject::*TMyMouseMoveEvent)(TObject *, int);
В>


Я плакаль ...
Re[5]: Как это перевести в код vc?
От: Владик Россия  
Дата: 14.04.05 18:30
Оценка:
Здравствуйте, AlexEagle, Вы писали:

AE>Я плакаль ...


А что не так?
Как все запущенно...
Re[6]: Как это перевести в код vc?
От: AlexEagle Украина http://www.vik.oil
Дата: 14.04.05 20:56
Оценка:
Здравствуйте, Владик, Вы писали:

В>А что не так?


А хотябы синтаксис Ну да ладно — ученье свет!

Учитывая, что OF OBJECT на делфи является синонимом делегата в .NET, то вот тебе информация для размышления — Делегаты на C++
Автор(ы): Александр Шаргин
Дата: 19.03.2003
Делегаты в CLR удобны, типобезопасны и эффективны. Последнее время на форумах RSDN часто поднимается вопрос о том, можно ли реализовать делегаты с аналогичными свойствами, оставаясь в рамках "чистого" C++. Оказывается, это вполне возможно. В этой статье я покажу, как это сделать.
... Но как я уже говорил, в контексте этого вопроса (исходя из собственного опыта) нужно идти другим путем... Просто по разному обрабатываются события на VC и делфи...
Re[7]: Как это перевести в код vc?
От: Владик Россия  
Дата: 14.04.05 22:34
Оценка:
Здравствуйте, AlexEagle, Вы писали:

AE>А хотябы синтаксис Ну да ладно — ученье свет!


Как раз с синтаксисом все в порядке. Этот код — ближайший аналог дельфового.

AE>Учитывая, что OF OBJECT на делфи является синонимом делегата в .NET,


А если нужна схожая с дельфовыми событиями семантика, то boost::bind / boost::function покрывают ее полностью.
Как все запущенно...
Re[8]: Как это перевести в код vc?
От: AlexEagle Украина http://www.vik.oil
Дата: 15.04.05 07:47
Оценка:
Здравствуйте, Владик, Вы писали:

В>Как раз с синтаксисом все в порядке. Этот код — ближайший аналог дельфового.


приведи работающий пример
Re[9]: Как это перевести в код vc?
От: Владик Россия  
Дата: 15.04.05 08:11
Оценка:
Здравствуйте, AlexEagle, Вы писали:

AE>приведи работающий пример


class TObjectWithEvents
{
public:
    boost::function2<void, TObject *, int> OnMouseMove;
};

void TMyObject::InstallMouseMoveEvent()
{
TMyMouseMoveEvent event = &TMyObject::SomeHandler;
ObjectWithEvents.OnMouseMove = boost::bind(event, this, _1, _2);
}

void TMyObject::SomeHandler(TObject *, int)
{
}
Как все запущенно...
Re[10]: Как это перевести в код vc?
От: AlexEagle Украина http://www.vik.oil
Дата: 15.04.05 08:16
Оценка:
Здравствуйте, Владик, Вы писали:

В>Здравствуйте, AlexEagle, Вы писали:


В>
<skip>
В>


Мне нужен пример без буста и с присутствием typedef void (TObject::*TMyMouseMoveEvent)(TObject *, int) в коде... мы ведь об этом коде сейчас говорим
Re[11]: Как это перевести в код vc?
От: Владик Россия  
Дата: 15.04.05 09:11
Оценка:
Здравствуйте, AlexEagle, Вы писали:

AE>Мне нужен пример без буста


За что такая дискриминация?

AE>и с присутствием typedef void (TObject::*TMyMouseMoveEvent)(TObject *, int) в коде...


Он там присутствует, и даже выделен жирным (TMyMouseMoveEvent — именно этот typedef).

P.S. Кстати, а в дельфе можно описать указатель на метод без привязки к конкретному объекту?
Как все запущенно...
Re[12]: Как это перевести в код vc?
От: AlexEagle Украина http://www.vik.oil
Дата: 15.04.05 10:00
Оценка:
Здравствуйте, Владик, Вы писали:

В>Он там присутствует, и даже выделен жирным (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;



Причем заметим что привязки ни к типу объекта, ни к самому объекту на этапе определения типа обработчика не происходит А теперь то же самое на с++, пожалуйста...
Re[13]: Как это перевести в код vc?
От: Владик Россия  
Дата: 15.04.05 13:08
Оценка:
Здравствуйте, AlexEagle, Вы писали:

AE>Причем заметим что привязки ни к типу объекта, ни к самому объекту на этапе определения типа обработчика не происходит


Привязки к типу нет, а привязка к объекту есть во время присваивания. Попробую пояснить на примере. Представь, что у тебя есть коллекция объектов и для них нужно вызвать заранее неизвестный метод. Как это будет выглядеть на дельфе? В С++ это решается передачей вышеописанного указателя на метод, потому что привязка к объекту происходить непосредственно в момент вызова.
Если же нужно добиться дельфового поведения, то связать указатель на метод с самим объектом во время присваивания можно используя boost::bind, а для хранения полученного в процессе связывания объекта — использовать boost::function. Тебя смущает использование boost — придумывай свой велосипед, сути это не меняет.

AE>А теперь то же самое на с++, пожалуйста...


Вот полный аналог твоего дельфового примера:


typedef void (TObject::*TMyMouseMoveEvent)(TObject *, int);

class TObjectWithEvents
{
public:
    boost::function2<void, TObject *, int> OnMouseMove; 
};

TObjectWithEvents ObjectWithEvents;

class TMyObject
{
public:
    void InstallMouseMoveEvent();
private:
    void SomeHandler( TObject *, int );
};

void TMyObject::InstallMouseMoveEvent()
{
TMyMouseMoveEvent event = &TMyObject::SomeHandler;
ObjectWithEvents.OnMouseMove = boost::bind(event, this, _1, _2);
}

void TMyObject::SomeHandler(TObject *, int)
{
    std::cout << "SomeHandler!" << std::endl;
}
Как все запущенно...
Re[14]: Как это перевести в код vc?
От: AlexEagle Украина http://www.vik.oil
Дата: 15.04.05 13:28
Оценка:
Здравствуйте, Владик, Вы писали:

В>Привязки к типу нет, а привязка к объекту есть во время присваивания.

Ну дык оно и понятно! Иначе как метод потом вызывать ? Делфя то же самое неявно делает...

В>Вот полный аналог твоего дельфового примера:

Что значит полный ? Где в моем примере привязка к типу объекта ?

И далее, просвети что такое TObject на vc++ ? Даже если это CObject, то почему объект обработчика обязательно должен быть унаследован от CObject ?
Re[15]: Как это перевести в код vc?
От: Владик Россия  
Дата: 15.04.05 13:49
Оценка:
Здравствуйте, AlexEagle, Вы писали:

В>>Привязки к типу нет, а привязка к объекту есть во время присваивания.

AE>Ну дык оно и понятно! Иначе как метод потом вызывать ? Делфя то же самое неявно делает...

Метод потом можно вызвать, имея сам объект. Собственно я и спрашивал — есть ли какой-то аналог этому в дельфе? На плюсах это записывается так:
(object.*MethodPointer)();


В>>Вот полный аналог твоего дельфового примера:

AE>Что значит полный ? Где в моем примере привязка к типу объекта ?
AE>И далее, просвети что такое TObject на vc++ ? Даже если это CObject, то почему объект обработчика обязательно должен быть унаследован от CObject ?

Потому что в дельфе все объекты — неявные наследники TObject. Поэтому все обработчики унаследованы от TObject по определению. В плюсах такой единый базовый класс можно ввестия явно (хотя это не модно).
Как все запущенно...
Re[16]: Как это перевести в код vc?
От: AlexEagle Украина http://www.vik.oil
Дата: 15.04.05 14:19
Оценка:
Здравствуйте, Владик, Вы писали:

В>Метод потом можно вызвать, имея сам объект.

Вот! Потому делфя неявно где-то сохраняет объект

В>Собственно я и спрашивал — есть ли какой-то аналог этому в дельфе?

Я же говорю — неявно!



В>Потому что в дельфе все объекты — неявные наследники TObject.

Это так, и поэтому привязка к типу TObject в делфи равносильна отсутствию привязки, но не в vc++!!!! А ты мне что?

В>В плюсах такой единый базовый класс можно ввестия явно (хотя это не модно).

И что это даст — я всегда могу создать класс не-наследник твоего базового

Я повторяю — где универсальный пример?
Re[17]: Как это перевести в код vc?
От: Владик Россия  
Дата: 15.04.05 15:02
Оценка:
Здравствуйте, AlexEagle, Вы писали:

В>>Метод потом можно вызвать, имея сам объект.

AE>Вот! Потому делфя неявно где-то сохраняет объект

В>>Собственно я и спрашивал — есть ли какой-то аналог этому в дельфе?

AE>Я же говорю — неявно!

А если он просто не нужен? Я приводил пример: есть коллекция объектов и один указатель на метод. Нужно для каждого объекта вызвать соответствующий метод, с виртуальностью, все как положено.

[...]
В>>В плюсах такой единый базовый класс можно ввестия явно (хотя это не модно).
AE>И что это даст — я всегда могу создать класс не-наследник твоего базового

И получишь ошибку компиляции. Кстати, а в дельфе можно описать указатель на метод конкретного класса (не TObject)?

AE>Я повторяю — где универсальный пример?


Если нужно вызвать неизвестно что неизвестно у кого — то просто заводишь весь из себя абстрактный boost::function и не паришься.
Как все запущенно...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.