Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Обработка щелчка мыши другим компонентом


Автор: ksili 1.2.2006, 10:40
У меня поверх компонента TImage расположено несколько компонентов TShape, которые создаются динамически. Необходимо, чтобы при щелчке мыши на любом из TShape вызывался обработчик OnMouseUp компонента TImage и соответственно, чтоб переданные в него X и Y были координатами в TImage, а не в TShape.

Я пробовал определить всем TShape обработчик OnMouseUp тот же, что и у TImage
Код

Base[i].rect = new TShape(TabSheet2);
Base[i].rect->Parent = TabSheet2;
Base[i].rect->OnMouseUp = Image1MouseUp;

Но при этом X и Y - координаты внутри TShape, и по ним определить какой TShape щёлкнули невозможно.

Затем пробовал определить всем TShape одинаковый обработчик OnMouseUp
Код

Base[i].rect = new TShape(TabSheet2);
Base[i].rect->Parent = TabSheet2;
Base[i].rect->OnMouseUp = MyClick;

У функции MyClick аргументы как у стандартного обработчика
Код

void __fastcall MyClick(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y);

но при этом компилятор выдавал ошибку
Cannot convert 'void (__fastcall*)(TObject*, TMouseButton, TShiftState, int, int)' to 'void (__fastcall * (__closure)(TObject*, TMouseButton, TShiftState, int, int))(TObject*, TMouseButton, TShiftState, int, int)'

Как всё-таки назначить свою функцию в качестве обработчика, или обрабатывать нажатие обработчиком компонента TImage?

Вообще всё это надо чтобы узнать по какому TShape кликнули

Автор: _hunter 1.2.2006, 11:54
Цитата(ksili @ 1.2.2006, 09:40 Найти цитируемый пост)

Но при этом X и Y - координаты внутри TShape, и по ним определить какой TShape щёлкнули невозможно.

почему невозможно? у тебя есть координаты верхнего левого угла фигуры. прибавь к ним эти x, y и получиш координаты в картинке...

Автор: Artemon 1.2.2006, 12:12
Вставь этот кусок в обработчик отпускания мыши Image:

Код

Image1MouseUp
               (
               Sender,
               Button,
               Shift,
               ((TShape*)Sender)->Left + X,
               ((TShape*)Sender)->Top + Y
               );

Автор: ksili 1.2.2006, 12:32
Artemon, cпасибо.
Я чё-то не догадывался привести Sender к типу TShape, поэтому координаты верхнего левого угла получить не мог. Теперь мне X и Y вообще не нужны стали

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)