jvcllaz: Add TJvMovablePanel

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6356 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2018-04-25 20:49:53 +00:00
parent bbd1093e72
commit 6d6f3c6f62
5 changed files with 240 additions and 34 deletions

View File

@ -22,7 +22,7 @@ uses
procedure Register;
begin
RegisterComponents(RsPaletteJvcl, [
TJvMovableBevel, TJvRuler,
TJvMovableBevel, TJvMovablePanel, TJvRuler,
TJvHint, TJvHTLabel, TJvHTListbox, TJvHTCombobox
]);
{

View File

@ -3,4 +3,5 @@ tjvhtcombobox.bmp
tjvhtlabel.bmp
tjvhtlistbox.bmp
tjvmovablebevel.bmp
tjvmovablepanel.png
tjvruler.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 B

View File

@ -31,7 +31,6 @@ interface
uses
SysUtils, Classes, Controls, Forms, ExtCtrls;
// JvExExtCtrls;
type
TJvBevelScrollTextDirection = (tdNone, tdUpToDown, tdDownToUp, tdLeftToRight,
@ -73,9 +72,47 @@ type
property OnSized: TNotifyEvent read FOnSized write FOnSized;
end;
TJvMovablePanel = class(TPanel)
private
FStartX: Integer;
FStartY: Integer;
FStartPoint: TPoint;
FMinSize: Integer;
FMoving: Boolean; // If True then we are moving the object around.
FSizing: Boolean; // if True then we are sizing the object;
FDirection: TJvBevelScrollTextDirection;
FBorderSize: Byte;
FOnMoving: TNotifyEvent;
FOnMoved: TNotifyEvent;
FOnSizing: TNotifyEvent;
FOnSized: TNotifyEvent;
protected
procedure DoMove(Shift: TShiftState; DeltaX, DeltaY: Integer);
procedure DoSize(Shift: TShiftState; DeltaX, DeltaY: Integer);
procedure SelectCursor(X, Y: Integer);
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure MouseEnter; override;
procedure MouseLeave; override;
public
constructor Create(AOwner: TComponent); override;
published
property BorderSize: Byte read FBorderSize write FBorderSize default 4;
property OnMoving: TNotifyEvent read FOnMoving write FOnMoving;
property OnSizing: TNotifyEvent read FOnSizing write FOnSizing;
property OnMoved: TNotifyEvent read FOnMoved write FOnMoved;
property OnSized: TNotifyEvent read FOnSized write FOnSized;
end;
implementation
//=== TJvMovableBevel ==========================================================
constructor TJvMovableBevel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
@ -253,7 +290,6 @@ begin
inherited MouseDown(Button, Shift, X, Y);
end;
procedure TJvMovableBevel.MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
begin
@ -351,31 +387,6 @@ begin
inherited MouseEnter;
end;
(*
procedure TJvMovableBevel.MouseEnter(Control: TControl);
var
Pos: TPoint;
begin
if csDesigning in ComponentState then
Exit;
Pos := ScreenToClient(Mouse.CursorPos);
SelectCursor(Pos.X, Pos.Y);
inherited MouseEnter(Control);
end;
procedure TJvMovableBevel.MouseLeave(Control: TControl);
begin
if csDesigning in ComponentState then
Exit;
if (not FMoving) and (not FSizing) then
begin
Screen.Cursor := crDefault;
FDirection := tdNone;
end;
inherited MouseLeave(Control);
end;
*)
procedure TJvMovableBevel.MouseLeave;
begin
if csDesigning in ComponentState then
@ -388,12 +399,206 @@ begin
inherited MouseLeave;
end;
{$IFDEF UNITVERSIONING}
initialization
RegisterUnitVersion(HInstance, UnitVersioning);
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
//=== TJvMovablePanel ==========================================================
constructor TJvMovablePanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FBorderSize := 4;
FMinSize := 8;
end;
procedure TJvMovablePanel.DoMove(Shift: TShiftState; DeltaX, DeltaY: Integer);
begin
Top := Top + DeltaY;
Left := Left + DeltaX;
end;
procedure TJvMovablePanel.DoSize(Shift: TShiftState; DeltaX, DeltaY: Integer);
begin
case FDirection of
tdUpToDown:
begin
Height := Height + DeltaY;
Top := Top - DeltaY;
end;
tdDownToUp:
Height := FStartY - DeltaY;
tdLeftToRight:
begin
Width := Width + DeltaX;
Left := Left - DeltaX;
end;
tdRightToLeft:
Width := FStartX - DeltaX;
tdTopLeftToBottomRight:
begin
Top := Top - DeltaY;
Left := Left - DeltaX;
Height := Height + DeltaY;
Width := Width + DeltaX;
end;
tdTopRightToBottomLeft:
begin
Height := Height + DeltaY;
Width := FStartX - DeltaX;
Top := Top - DeltaY;
end;
tdBottomLeftToTopRight:
begin
Left := Left - DeltaX;
Height := FStartY - DeltaY;
Width := Width + DeltaX;
end;
tdBottomRightToTopLeft:
begin
Height := FStartY - DeltaY;
Width := FStartX - DeltaX;
end;
end;
end;
procedure TJvMovablePanel.SelectCursor(X, Y: longint);
begin
if (Y > 0) and (Y <= FBorderSize) then
begin
if (X > 0) and (X <= FBorderSize) then
begin
Screen.Cursor := crSizeNWSE;
FDirection := tdTopLeftToBottomRight;
end
else
if (X >= Width - FBorderSize) and (X < Width) then
begin
Screen.Cursor := crSizeNESW;
FDirection := tdTopRightToBottomLeft;
end
else
begin
Screen.Cursor := crSizeNS;
FDirection := tdUpToDown;
end;
end
else
if (Y >= Height - FBorderSize) and (Y < Height) then
begin
if (X > 0) and (X <= FBorderSize) then
begin
Screen.Cursor := crSizeNESW;
FDirection := tdBottomLeftToTopRight;
end
else
if (X >= Width - FBorderSize) and (X < Width) then
begin
Screen.Cursor := crSizeNWSE;
FDirection := tdBottomRightToTopLeft;
end
else
begin
Screen.Cursor := crSizeNS;
FDirection := tdDownToUp;
end;
end
else
if (X >= 1) and (X <= FBorderSize) then
begin
Screen.Cursor := crSizeWE;
FDirection := tdLeftToRight;
end
else
if (X >= Width - FBorderSize) and (X < Width) then
begin
Screen.Cursor := crSizeWE;
FDirection := tdRightToLeft;
end
else
begin
Screen.Cursor := crDefault;
FDirection := tdNone;
end
end;
procedure TJvMovablePanel.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
if FMoving then
DoMove(Shift, X - FStartX, Y - FStartY)
else
if FSizing then
DoSize(Shift, FStartX - X, FStartY - Y)
else
SelectCursor(X, Y);
inherited MouseMove(Shift, X, Y);
end;
procedure TJvMovablePanel.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
begin
if FDirection > tdNone then
begin
FSizing := True;
if Assigned(FOnSizing) then
FOnSizing(Self);
end
else
begin
FMoving := True;
if Assigned(FOnMoving) then
FOnMoving(Self);
end;
FStartPoint := Point(Left, Top);
FStartX := X;
FStartY := Y;
inherited MouseDown(Button, Shift, X, Y);
end;
procedure TJvMovablePanel.MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
begin
SelectCursor(X, Y);
FStartX := 0;
FStartY := 0;
if Height < 0 then
begin
Top := Top + Height;
Height := Abs(Height);
end;
if Width < 0 then
begin
Left := Left + Width;
Width := Abs(Width);
end;
inherited MouseUp(Button, Shift, X, Y);
if FMoving and Assigned(FOnMoved) then
FOnMoved(Self);
if FSizing and Assigned(FOnSized) then
FOnSized(Self);
FMoving := False;
FSizing := False;
end;
procedure TJvMovablePanel.MouseEnter;
var
Pos: TPoint;
begin
if csDesigning in ComponentState then
Exit;
Pos := ScreenToClient(Mouse.CursorPos);
SelectCursor(Pos.X, Pos.Y);
inherited MouseEnter;
end;
procedure TJvMovablePanel.MouseLeave;
begin
if csDesigning in ComponentState then
Exit;
if (not FMoving) and (not FSizing) then
begin
Screen.Cursor := crDefault;
FDirection := tdNone;
end;
inherited MouseLeave;
end;
end.