📄 rm_desgn.pas
字号:
FDesigner.SelectionChanged;
FDesigner.AddUndoAction(acInsert);
Exit;
end;
// calculating which objects contains in frame (if user select it with mouse+Ctrl key)
if FRFlag then
begin
DrawFocusRect(OldRect);
FRFlag := False;
NormalizeRect(OldRect);
SelNum := 0;
for i := 0 to Objects.Count - 1 do
begin
t := Objects[i];
with OldRect do
begin
if t.Typ <> gtBand then
begin
if not ((t.x > Right) or (t.x + t.dx < Left) or
(t.y > Bottom) or (t.y + t.dy < Top)) then
begin
t.Selected := True;
Inc(SelNum);
end;
end;
end;
end;
if SelNum = 0 then
begin
for i := 0 to Objects.Count - 1 do
begin
t := Objects[i];
with OldRect do
begin
if not ((t.x > Right) or (t.x + t.dx < Left) or
(t.y > Bottom) or (t.y + t.dy < Top)) then
begin
t.Selected := True;
Inc(SelNum);
end;
end;
end;
end;
GetMultipleSelected;
FDesigner.SelectionChanged;
DrawPage(dmSelection);
Exit;
end;
if FMoved and MRFlag and (Cursor = crHSplit) then // splitting
begin
with FSplitInfo do
begin
dx := SplRect.Left - SplX;
if DesignerRestrictions * [RMdrDontMoveObj, RMdrDontSizeObj] = [] then
begin
if ((View1.Restrictions and RMrfDontSize) = 0) and
((View2.Restrictions and (RMrfDontMove + RMrfDontSize)) = 0) then
begin
if (View1.dx + dx > 0) and (View2.dx - dx > 0) then
begin
Inc(View1.dx, dx);
Inc(View2.x, dx);
Dec(View2.dx, dx);
end;
end;
end;
end;
GetMultipleSelected;
Draw(TopSelected, ClipRgn);
Exit;
end;
if FMoved and MRFlag and (Cursor <> crDefault) then // resizing several objects
begin
Draw(TopSelected, ClipRgn);
Exit;
end;
if not FMoved then // redrawing all moved or resized objects
begin
FDesigner.SelectionChanged;
DrawPage(dmSelection);
end;
if (SelNum >= 1) and FMoved then
begin
if SelNum > 1 then
begin
Draw(TopSelected, ClipRgn);
GetMultipleSelected;
FDesigner.ShowPosition;
end
else
begin
t := Objects[TopSelected];
NormalizeCoord(t);
if Cursor <> crDefault then t.Resized;
if t.PChildView then
FDesigner.RedrawPage
else
Draw(TopSelected, ClipRgn);
FDesigner.SelectionChanged;
FDesigner.ShowPosition;
end;
end;
FMoved := False;
FCT := ctNone;
end;
procedure TRMDesignerPage.MMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
i, j, kx, ky, w, dx, dy: Integer;
t, t1, Bnd, Band: TRMView;
nx, ny, x1, x2, y1, y2: Double;
hr, hr1: HRGN;
FAlign: Boolean;
function Cont(px, py, x, y: Integer): Boolean;
begin
Result := (x >= px - w) and (x <= px + w + 1) and
(y >= py - w) and (y <= py + w + 1);
end;
function GridCheck: Boolean;
begin
with FDesigner do
begin
Result := (kx >= GridSizeX) or (kx <= -GridSizeX) or
(ky >= GridSizeY) or (ky <= -GridSizeY);
if Result then
begin
kx := kx - kx mod GridSizeX;
ky := ky - ky mod GridSizeY;
end;
end;
end;
procedure AddRgn(var HR: HRGN; T: TRMView);
var
tr: HRGN;
begin
tr := t.GetClipRgn(rtExtended);
CombineRgn(HR, HR, TR, RGN_OR);
DeleteObject(TR);
end;
function CheckNegative(t: TRMView): Boolean;
begin
if (t.dx < 0) or (t.dy < 0) then
begin
NormalizeCoord(t);
Result := True;
end
else
Result := False;
end;
begin
FMoved := True;
FDrag := False;
FAlign := FDesigner.GridAlign;
if ssAlt in Shift then
FAlign := not FAlign;
w := 2;
if FirstChange and FDown and not FRFlag then
begin
kx := x - FLastX;
ky := y - FLastY;
if not FDesigner.GridAlign or GridCheck then
begin
GetRegion;
FDesigner.AddUndoAction(acEdit);
end;
end;
if not FDown then
begin
if FDesigner.OB6.Down then
begin
FMode := mdSelect;
Cursor := crPencil;
end
else if FDesigner.OB1.Down then
begin
FMode := mdSelect;
Cursor := crDefault;
if SelNum = 0 then
begin
ShowSizes := False;
OldRect := Rect(x, y, x, y);
FDesigner.PBox1Paint(nil);
end;
end
else
begin
FMode := mdInsert;
if Cursor <> crCross then
begin
RoundCoord(x, y);
FDesigner.GetDefaultSize(kx, ky);
if FDesigner.OB3.Down then
kx := Width;
OldRect := Rect(x, y, x + kx, y + ky);
if FDesigner.PageType = ptReport then
DrawFocusRect(OldRect);
end;
Cursor := crCross;
end;
end;
if (FMode = mdInsert) and not FDown then
begin
if FDesigner.PageType = ptReport then
DrawFocusRect(OldRect);
RoundCoord(x, y);
OffsetRect(OldRect, x - OldRect.Left, y - OldRect.Top);
if FDesigner.PageType = ptReport then
DrawFocusRect(OldRect);
ShowSizes := True;
FDesigner.PBox1Paint(nil);
ShowSizes := False;
Exit;
end;
// cursor shapes
if not FDown and (SelNum = 1) and (FMode = mdSelect) and (not FDesigner.OB6.Down) then
begin
t := Objects[TopSelected];
if Cont(t.x, t.y, x, y) or Cont(t.x + t.dx, t.y + t.dy, x, y) then
Cursor := crSizeNWSE
else if Cont(t.x + t.dx, t.y, x, y) or Cont(t.x, t.y + t.dy, x, y) then
Cursor := crSizeNESW
else if Cont(t.x + t.dx div 2, t.y, x, y) or Cont(t.x + t.dx div 2, t.y + t.dy, x, y) then
Cursor := crSizeNS
else if Cont(t.x, t.y + t.dy div 2, x, y) or Cont(t.x + t.dx, t.y + t.dy div 2, x, y) then
Cursor := crSizeWE
else
Cursor := crDefault;
end;
// selecting a lot of objects
if FDown and FRFlag then
begin
DrawFocusRect(OldRect);
if Cursor = crCross then
RoundCoord(x, y);
OldRect := Rect(OldRect.Left, OldRect.Top, x, y);
DrawFocusRect(OldRect);
ShowSizes := True;
if Cursor = crCross then
FDesigner.PBox1Paint(nil);
ShowSizes := False;
Exit;
end;
// line drawing
if FDown and (Cursor = crPencil) then
begin
kx := x - FLastX;
ky := y - FLastY;
if FAlign and not GridCheck then Exit;
DrawRectLine(OldRect);
OldRect := Rect(OldRect.Left, OldRect.Top, OldRect.Right + kx, OldRect.Bottom + ky);
DrawRectLine(OldRect);
Inc(FLastX, kx);
Inc(FLastY, ky);
Exit;
end;
// check for multiple selected objects - right-bottom corner
if not FDown and (SelNum > 1) and (FMode = mdSelect) then
begin
t := Objects[FRightBottom];
if Cont(t.x + t.dx, t.y + t.dy, x, y) then
Cursor := crSizeNWSE
end;
// split checking
if not FDown and (SelNum > 1) and (FMode = mdSelect) then
begin
for i := 0 to Objects.Count - 1 do
begin
t := Objects[i];
if (t.Typ <> gtBand) and (t.Typ <> gtLine) and t.Selected then
begin
if (x >= t.x) and (x <= t.x + t.dx) and (y >= t.y) and (y <= t.y + t.dy) then
begin
for j := 0 to Objects.Count - 1 do
begin
t1 := Objects[j];
if (t1.Typ <> gtBand) and (t1 <> t) and t1.Selected then
begin
if ((t.x = t1.x + t1.dx) and ((x >= t.x) and (x <= t.x + 2))) or
((t1.x = t.x + t.dx) and ((x >= t1.x - 2) and (x <= t.x))) then
begin
Cursor := crHSplit;
with FSplitInfo do
begin
SplRect := Rect(x, t.y, x, t.y + t.dy);
if t.x = t1.x + t1.dx then
begin
SplX := t.x;
View1 := t1;
View2 := t;
end
else
begin
SplX := t1.x;
View1 := t;
View2 := t1;
end;
SplRect.Left := SplX;
SplRect.Right := SplX;
end;
end;
end;
end;
end;
end;
end;
end;
// splitting
if FDown and MRFlag and (FMode = mdSelect) and (Cursor = crHSplit) then
begin
kx := x - FLastX;
ky := 0;
if FAlign and not GridCheck then Exit;
with FSplitInfo do
begin
DrawHSplitter(SplRect);
SplRect := Rect(SplRect.Left + kx, SplRect.Top, SplRect.Right + kx, SplRect.Bottom);
DrawHSplitter(SplRect);
end;
Inc(FLastX, kx);
Exit;
end;
// sizing several objects
if FDown and MRFlag and (FMode = mdSelect) and (Cursor <> crDefault) then
begin
kx := x - FLastX;
ky := y - FLastY;
if FAlign and not GridCheck then Exit;
if FDesigner.FShapeMode = smFrame then
DrawPage(dmShape)
else
begin
hr := CreateRectRgn(0, 0, 0, 0);
hr1 := CreateRectRgn(0, 0, 0, 0);
end;
if not ((OldRect.Right + kx < OldRect.Left) or (OldRect.Bottom + ky < OldRect.Top)) then
OldRect := Rect(OldRect.Left, OldRect.Top, OldRect.Right + kx, OldRect.Bottom + ky);
nx := (OldRect.Right - OldRect.Left) / (OldRect1.Right - OldRect1.Left);
ny := (OldRect.Bottom - OldRect.Top) / (OldRect1.Bottom - OldRect1.Top);
for i := 0 to Objects.Count - 1 do
begin
t := Objects[i];
if t.Selected then
begin
if FDesigner.FShapeMode = smAll then
AddRgn(hr, t);
x1 := (t.OriginalRect.Left - FLeftTop.x) * nx;
x2 := t.OriginalRect.Right * nx;
dx := Round(x1 + x2) - (Round(x1) + Round(x2));
if (DesignerRestrictions * [RMdrDontSizeObj] = []) and
((t.Restrictions and RMrfDontSize) = 0) then
begin
t.x := FLeftTop.x + Round(x1); t.dx := Round(x2) + dx;
end;
y1 := (t.OriginalRect.Top - FLeftTop.y) * ny;
y2 := t.OriginalRect.Bottom * ny;
dy := Round(y1 + y2) - (Round(y1) + Round(y2));
if (DesignerRestrictions * [RMdrDontSizeObj] = []) and
((t.Restrictions and RMrfDontSize) = 0) then
begin
t.y := FLeftTop.y + Round(y1); t.dy := Round(y2) + dy;
end;
if FDesigner.FShapeMode = smAll then
AddRgn(hr1, t);
end;
end;
if FDesigner.FShapeMode = smFrame then
DrawPage(dmShape)
else
begin
Draw(10000, hr);
Draw(10000, hr1);
end;
Inc(FLastX, kx);
Inc(FLastY, ky);
FDesigner.PBox1Paint(nil);
Exit;
end;
// moving
if FDown and (FMode = mdSelect) and (SelNum >= 1) and (Cursor = crDefault) then
begin
kx := x - FLastX;
ky := y - FLastY;
if FAlign and not GridCheck then Exit;
if FFirstBandMove and (SelNum = 1) and ((kx <> 0) or (ky <> 0)) and not (ssAlt in Shift) then
begin
if TRMView(Objects[TopSelected]).Typ = gtBand then
begin
Bnd := Objects[TopSelected];
if (Bnd.Restrictions and RMrfDontMove) = 0 then
begin
for i := 0 to Objects.Count - 1 do
begin
t := Objects[i];
if t.Typ <> gtBand then
begin
if (t.x >= Bnd.x) and (t.x + t.dx <= Bnd.x + Bnd.dx) and
(t.y >= Bnd.y) and (t.y + t.dy <= Bnd.y + Bnd.dy) then
begin
t.Selected := True;
Inc(SelNum);
end;
end;
end;
end;
FDesigner.SelectionChanged;
GetMultipleSelected;
end;
end;
FFirstBandMove := False;
if FDesigner.FShapeMode = smFrame then
DrawPage(dmShape)
else
begin
hr := CreateRectRgn(0, 0, 0, 0);
hr1 := CreateRectRgn(0, 0, 0, 0);
end;
for i := 0 to Objects.Count - 1 do
begin
t := Objects[i];
if not t.Selected then Continue;
if FDesigner.FShapeMode = smAll then
AddRgn(hr, t);
if (DesignerRestrictions * [RMdrDontMoveObj] = []) and
((t.Restrictions and RMrfDontMove) = 0) then
begin
//WHF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -