-
Здравствуйте, все.
Есть составной компонент из TCustomPanel и TpaintBox в этой панели. PaintBox имеет начальные координаты left=0, top=0 (левый верхний угол панели-контейнера).
Размеры PaintBox больше, чем размеры панели.
Как разделить и перехватить события для PaintBox и для его Panel?
Каким образом можно поднять координаты мыши над PainBox и над его Panel на сторону компонента, чтобы движение мыши обработать внутри компонента (например смена вида курсора)?
Задача в целом - таскать PainBox по его Panel.
Как лучше решить?
-
PaintBox имеет событие OnMouseMove и панель имеет событие OnMouseMove? не понимаю в чём проблема ?
-
> Размеры PaintBox больше, чем размеры панели.
-
ну и что, не понятно, что нужно
-
Нужно получить координаты мыши над компонентом ?
CalcCursorPos
-
Подробнее.
Определяем
type
TMouseMoveEvent = procedure (Sender: TObject; Shift: TShiftState; X, Y: Integer) of object;
private
Function GetOnPBoxMouseMove:TMouseMoveEvent;
Procedure SetOnPBoxMouseMove(E:TMouseMoveEvent);
.........
published
Property OnMapMouseMove:TMouseMoveEvent read GetOnMapMouseMove write SetOnMapMouseMove;
.........
function TProbe.GetOnMapMouseMove: TMouseMoveEvent;
begin
Result:=PBox.OnMouseMove;
end;
procedure TProbe.SetOnMapMouseMove(E: TMouseMoveEvent);
begin
PBox.OnMouseMove:=E;
end;
Вопрос:
Каким образом можно поднять координаты мыши над PaintBox на сторону компонента?
То же, для контейнера...
-
Создавать две published переменные и передавать в них уже из готового события неудобно...
-
Сорри из другого проекта скопировал...
published
Property OnPBoxMouseMove:TMouseMoveEvent read GetOnPBoxMouseMove write SetOnPBoxMouseMove;
........
-
Никак не могу понять выражение " поднять координаты мыши над PaintBox на сторону компонента".
Думаю, что нужно перехватить движение мыши по PaintBox-у в компоненте...
Решается несколькими методами, например вешаем на событие свою обработку
TProbe = class(TCustomPanel)
private
procedure PBoxMouseMove(Sender: TObject; Shift: TShiftState; X,Y: integer);
end;
constructor TProbe.Create(AOwner: TComponent)
begin
PBox := TPaintBox.Create(self);
PBox.OnMouseMove := PBoxMouseMove;
end;
procedure TProbe.PBoxMouseMove(Sender: TObject; Shift: TShiftState; X,Y: integer);
begin
if Assigned(OnPBoxMouseMove) then OnPBoxMouseMove(Sender,Shift,X,Y);
// остальные действия
end;
-
На сторону компонента - имею в виду знать их внутри компонента, а не получать из приложения по готовому событию...
-
> private
> procedure PBoxMouseMove(Sender: TObject; Shift: TShiftState;
> X,Y: integer);
> if Assigned(OnPBoxMouseMove) then OnPBoxMouseMove(Sender,
> Shift,X,Y);
Если оно Private, то как его Assigned? :-)
-
Фактически, получается, что нужно MouseMove в инспекторе и рядом такое же, но в компоненте...
-
Все.
Победил.
Вопрос снят.
-
Теперь крутится два события на движение мыши.
Одно паблик, другое прив.
Первым выполняется событие в компоненте, вторым, если Assigned - в приложении.
> DimaBr
Спасибо.
-
> Property OnPBoxMouseMove:TMouseMoveEvent read GetOnPBoxMouseMove write SetOnPBoxMouseMove;
вообще не нужно, нужно переписать так
Property OnPBoxMouseMove:TMouseMoveEvent read fOnPBoxMouseMove write fOnPBoxMouseMove;
-
Удалено модератором