16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"サイズ変更ハンドル(2/2)"
この発言は #01313 アイクビー さんのサイズ変更ハンドル(1/2) に対するコメントです
// (続き)
//**********************************************************************
// THControlTool: マウスを押した
//**********************************************************************
procedure THControlTool.DoMouseDown(
fSender: TObject;
fButton: TMouseButton;
fShift: TShiftState;
iX, iY: Integer
);
begin
if Assigned(FfOnMouseDown) then begin
FfOnMouseDown(fSender, fButton, fShift, iX, iY);
end;
if FfEdit then begin
Exit;
end;
FfEdit := True;
try
case fButton of
mbLeft: begin
FfDrag := True;
FiX := iX;
FiY := iY;
if (TComponent(fSender).Tag = 8) then begin
HideKnobs();
end;
Move(fSender, iX, iY);
end;
end;
finally
FfEdit := False;
end;
end;
//**********************************************************************
// THControlTool: マウスが移動した
//**********************************************************************
procedure THControlTool.DoMouseMove(
fSender: TObject;
fShift: TShiftState;
iX, iY: Integer
);
begin
if Assigned(FfOnMouseMove) then begin
FfOnMouseMove(fSender, fShift, iX, iY);
end;
if FfEdit or not FfDrag then begin
Exit;
end;
FfEdit := True;
try
Move(fSender, iX, iY);
finally
FfEdit := False;
end;
end;
//**********************************************************************
// THControlTool: マウスを離した
//**********************************************************************
procedure THControlTool.DoMouseUp(
fSender: TObject;
fButton: TMouseButton;
fShift: TShiftState;
iX, iY: Integer
);
begin
if Assigned(FfOnMouseUp) then begin
FfOnMouseUp(fSender, fButton, fShift, iX, iY);
end;
if FfEdit or not FfDrag then begin
Exit;
end;
FfEdit := True;
try
Move(fSender, iX, iY);
if (TComponent(fSender).Tag = 8) then begin
ShowKnobs();
end;
with FfHint do begin
Height := 0;
Left := 0;
Top := 0;
Width := 0;
end;
FfDrag := False;
finally
FfEdit := False;
end;
end;
//**********************************************************************
// THControlTool: サイズ変更ハンドルを隠す
//**********************************************************************
procedure THControlTool.HideKnobs;
var
i: 0..7;
begin
for i := 0 to 7 do begin
FfKnobs[i].Hide();
end;
end;
//**********************************************************************
// THControlTool: 移動させる
//**********************************************************************
procedure THControlTool.Move(
fSender: TObject;
iX, iY: Integer
);
const
R: array[0..8] of record
iL: -1..1;
iT: -1..1;
iW: -1..1;
iH: -1..1;
end = (
(iL: 1; iT: 1; iW: -1; iH: -1;),
(iL: 0; iT: 1; iW: 1; iH: -1;),
(iL: 0; iT: 1; iW: 0; iH: -1;),
(iL: 1; iT: 0; iW: -1; iH: 1;),
(iL: 0; iT: 0; iW: 1; iH: 1;),
(iL: 0; iT: 0; iW: 0; iH: 1;),
(iL: 1; iT: 0; iW: -1; iH: 0;),
(iL: 0; iT: 0; iW: 1; iH: 0;),
(iL: 1; iT: 1; iW: 0; iH: 0;)
);
var
S: string;
begin
with FfControl, R[TComponent(fSender).Tag] do begin
Left := Left + ((iX - FiX) * iL);
Top := Top + ((iY - FiY) * iT);
Width := Width + ((iX - FiX) * iW);
Height := Height + ((iY - FiY) * iH);
end;
Left := FfControl.Left - FiMergin;
Top := FfControl.Top - FiMergin;
Width := FfControl.Width + (FiMergin * 2);
Height := FfControl.Height + (FiMergin * 2);
if (TComponent(fSender).Tag = 8) then begin
S := Format(
'X: %d, Y: %d',
[FfControl.Left, FfControl.Top]
);
end
else begin
MoveKnobs();
S := Format(
'W: %d, H: %d',
[FfControl.Width, FfControl.Height]
);
end;
with TControl(fSender).ClientToScreen(Point(iX, iY)) do begin
with FfHint.CalcHintRect(100, S, nil) do begin
FfHint.Left := X + 9;
FfHint.Top := Y - 9;
FfHint.Width := Right;
FfHint.Height := Bottom;
FfHint.Caption := S;
end;
end;
end;
//**********************************************************************
// THControlTool: サイズ変更ハンドルを表示する
//**********************************************************************
procedure THControlTool.MoveKnobs;
const
C: array[0..7] of record
iX: 0..2;
iY: 0..2;
end = (
(iX: 0; iY: 0;),
(iX: 2; iY: 0;),
(iX: 1; iY: 0;),
(iX: 0; iY: 2;),
(iX: 2; iY: 2;),
(iX: 1; iY: 2;),
(iX: 0; iY: 1;),
(iX: 2; iY: 1;)
);
var
i: 0..7;
begin
for i := 0 to 7 do begin
FfKnobs[i].Left := Left
- FiSize + FiGap
+ Trunc((Width - (FiGap * 2) + FiSize - 1) * C[i].iX / 2);
FfKnobs[i].Top := Top
- FiSize + FiGap
+ Trunc((Height - (FiGap * 2) + FiSize - 1) * C[i].iY / 2);
end;
end;
//**********************************************************************
// THControlTool: コントロールの設定
//**********************************************************************
procedure THControlTool.SetControl(
V: TControl
);
begin
FfControl := V;
if not Assigned(FfControl)
or not Assigned(FfControl.Parent) then begin
Visible := False;
HideKnobs();
end
else begin
inherited SetParent(FfControl.Parent);
Left := FfControl.Left - FiMergin;
Top := FfControl.Top - FiMergin;
Width := FfControl.Width + (FiMergin * 2);
Height := FfControl.Height + (FiMergin * 2);
Visible := True;
ShowKnobs();
FfControl.BringToFront();
end;
end;
//**********************************************************************
// THControlTool: 親コントロールの設定
//**********************************************************************
procedure THControlTool.SetParent(
V: TWinControl
);
begin
inherited SetParent(V);
if Assigned(V) then begin
SetControl(nil);
end;
end;
//**********************************************************************
// THControlTool: サイズ変更ハンドルを表示する
//**********************************************************************
procedure THControlTool.ShowKnobs;
var
i: 0..7;
begin
MoveKnobs();
for i := 0 to 7 do begin
FfKnobs[i].Parent := Parent;
FfKnobs[i].Canvas.FillRect(Rect(0, 0, 5, 5));
FfKnobs[i].Show();
end;
end;
//**********************************************************************
// THControlToolKnob: THControlToolのつまみ
//**********************************************************************
//**********************************************************************
// THControlToolKnob: 描画
//**********************************************************************
procedure THControlToolKnob.Paint;
begin
Canvas.FillRect(Rect(0, 0, Width, Height));
end;
// (ここまで)
アイクビー
- FDELPHI MES(16):玉石混淆みんなで作るSample蔵【見本蓄積】 01/04/13 -
Original document by アイクビー 氏 ID:(KHB01350)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|