現在のプロジェクトでTControlBarコンポーネントを使用していますが、バンドを移動しているときにコントロールが余分な行を描画する際に問題が発生します。
基本的に私が欲しいのは、ControlBarに常に高さが固定された1行だけがあり、バンドがドラッグされている間はそれをエスケープできないようにすることです。
どうすればこれを達成できますか?
現在のプロジェクトでTControlBarコンポーネントを使用していますが、バンドを移動しているときにコントロールが余分な行を描画する際に問題が発生します。
基本的に私が欲しいのは、ControlBarに常に高さが固定された1行だけがあり、バンドがドラッグされている間はそれをエスケープできないようにすることです。
どうすればこれを達成できますか?
これを回避するには、次のようにします。
procedure TForm1.ControlBar1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var R:TRect;
Pt:TPoint;
begin
Pt:=ControlBar1.ClientToScreen(Point(0,Y));
R.Left:=Pt.X;
R.Top:=Pt.Y;
R.Right:=Pt.X+ControlBar1.Width;
R.Bottom:=Pt.Y;
ClipCursor(@R);
end;
procedure TForm1.ControlBar1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ClipCursor(nil) ;
end;
これにより、マウスの動きを制限して、バンドの垂直方向の配置のみを許可できます。
私は今月前に、基本的にTPanelクラスから独自のコンポーネントを派生させ、子パネルのドラッグソリューションを実装して、必要な動作を模倣することで解決しました。
これは、目的の効果を実装するために使用した最も基本的な原則です。
var oldPos : TPoint;
procedure TMainForm.ControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer);
begin
if Button = mbLeft then
if (Sender is TWinControl) then
begin
inReposition:=True;
SetCapture(TWinControl(Sender).Handle);
GetCursorPos(oldPos);
TWinControl(Sender).BringToFront;
end else
((Sender as TLabel).Parent as TQPanelSub).OnMouseDown((Sender as TLabel).Parent as TQPanelSub,Button,Shift,X,Y)
end;
procedure TMainForm.ControlMouseMove(Sender: TObject; Shift: TShiftState; X: Integer; Y: Integer);
var
newPos: TPoint;
temp : integer;
begin
if (Sender is TWinControl) then begin
if inReposition then
begin
with TWinControl(Sender) do
begin
GetCursorPos(newPos);
Screen.Cursor := crSize;
(* Constrain to the container *)
Top := 0;
temp := Left - oldPos.X + newPos.X;
if (temp >= 0) and (temp <= (Parent.Width - Width))
then Left := temp;
oldPos := newPos;
end;
end;
end else
((Sender as TLabel).Parent as TQPanelSub).OnMouseMove((Sender as TLabel).Parent as TQPanelSub,Shift,X,Y);
end;
procedure TMainForm.ControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer);
begin
if inReposition then
begin
Screen.Cursor := crDefault;
ReleaseCapture;
inReposition := False;
end;
end;
これは、実際にはひどく書かれたコンポーネントであるTControlBarに私が望んでいた基礎にすぎません。