📄 rm_dsgform.pas
字号:
constructor CreateComp(aOwner: TComponent; aDesignerForm: TRMDesignerForm); override;
destructor Destroy; override;
procedure GetDefaultSize(var aWidth, aHeight: Integer);
procedure SendBandsToDown;
function IsBandsSelect(var Band: TRMView): Boolean;
procedure GetRegion;
function GetFirstSelected: TRMView;
procedure Undo(aBuffer: PRMUndoBuffer);
procedure AddAction(aBuffer: PRMUndoBuffer; aAction: TRMUndoAction; aList: TList);
procedure Editor_BtnUndoClick(Sender: TObject); override;
procedure Editor_BtnRedoClick(Sender: TObject); override;
procedure Editor_AddUndoAction(aAction: TRMUndoAction); override;
procedure Editor_Localize; override;
procedure Editor_OnInspAfterModify(Sender: TObject; const aPropName, aPropValue: string); override;
procedure Editor_KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); override;
procedure Editor_OnFormMouseWheelUp(aUp: Boolean); override;
procedure Editor_Tab1Changed; override;
procedure Editor_InitToolbarComponent; override;
procedure Editor_DisableDraw; override;
procedure Editor_EnableDraw; override;
procedure Editor_RedrawPage; override;
procedure Editor_Resize; override;
procedure Editor_Init; override;
procedure Editor_SetCurPage; override;
procedure Editor_SelectionChanged(aRefreshInspProp: Boolean); override;
procedure Editor_ShowPosition; override;
procedure Editor_ShowContent; override;
function Editor_PageObjects: TList; override;
procedure Editor_OnInspGetObjects(aList: TStrings); override;
procedure Editor_FillInspFields; override;
procedure Editor_DoClick(Sender: TObject); override;
procedure Editor_SelectObject(aObjName: string); override;
procedure Editor_AfterChange; override;
procedure Editor_SetObjectsID; override;
procedure Editor_BtnCutClick(Sender: TObject); override;
procedure Editor_BtnCopyClick(Sender: TObject); override;
procedure Editor_BtnPasteClick(Sender: TObject); override;
procedure Editor_EnableControls; override;
procedure Editor_BtnDeletePageClick(Sender: TObject); override;
procedure Editor_BeforeFormDestroy; override;
property WorkSpace: TRMWorkSpace read FWorkSpace;
property ToolbarComponent: TRMToolbarComponent read FToolbarComponent;
property ObjRepeat: Boolean read FObjRepeat write FObjRepeat;
property SelStatus: TRMSelectionStatus read GetSelectionStatus;
published
end;
var
RM_ClipRgn: HRGN;
RM_OldRect, RM_OldRect1: TRect; // object rect after mouse was clicked
RM_SelectedManyObject: Boolean; // several objects was selected
RM_FirstChange, RM_FirstBandMove: Boolean;
CF_REPORTMACHINE: Word;
implementation
uses
Math, Registry, RM_Const, RM_Const1, RM_Utils, RM_EditorMemo, RM_EditorBand, RM_EditorGroup,
RM_EditorPicture, RM_EditorHilit, RM_EditorFrame, RM_EditorField,
RM_EditorExpr, RM_PageSetup, RM_EditorReportProp, RM_DesignerOptions, RM_Printer,
RM_EditorFormat, RM_EditorDictionary, RM_EditorFindReplace, RM_EditorTemplate,
RM_EditorCalc, RM_EditorBandType;
type
THackView = class(TRMView)
end;
THackDialogControl = class(TRMDialogControl)
end;
THackReport = class(TRMReport)
end;
THackPage = class(TRMCustomPage)
end;
THackReportPage = class(TRMReportPage)
end;
THackDesigner = class(TRMDesignerForm)
end;
{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{ TRMWorkSpace }
constructor TRMWorkSpace.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Parent := AOwner as TWinControl;
BevelInner := bvNone;
BevelOuter := bvNone;
Color := clWhite;
BorderStyle := bsNone;
PageForm := nil;
OnMouseDown := OnMouseDownEvent;
OnMouseUp := OnMouseUpEvent;
OnMouseMove := OnMouseMoveEvent;
OnDblClick := OnDoubleClickEvent;
OnDragOver := DoDragOver;
OnDragDrop := DoDragDrop;
FFieldListBox := TListBox.Create(Self);
with FFieldListBox do
begin
Visible := False;
Parent := Self;
Ctl3D := False;
Style := lbOwnerDrawFixed;
ItemHeight := 16;
OnClick := OnFieldListBoxClick;
OnDrawItem := OnFieldListBoxDrawItem;
end;
FBmp_Event := TBitmap.Create;
FBmp_HighLight := TBitmap.Create;
FBmp_Event.LoadFromResourceName(hInstance, 'RM_SCRIPT');
FBmp_HighLight.LoadFromResourceName(hInstance, 'RM_HIGHLIGHT');
end;
destructor TRMWorkSpace.Destroy;
begin
FreeAndNil(PageForm);
FreeAndNil(FBmp_Event);
FreeAndNil(FBmp_HighLight);
inherited;
end;
procedure TRMWorkSpace.Init;
begin
DisableDraw := False;
FDragFlag := False;
FMouseButtonDown := False;
FDoubleClickFlag := False;
FObjectsSelecting := False;
Cursor := crDefault;
FCursorType := ctNone;
end;
procedure TRMWorkSpace.SetPage;
var
lWidth, lHeight: Integer;
x1, y1, x2, y2: Integer;
begin
if (FDesignerForm = nil) or (FDesignerForm.Page = nil) then Exit;
if FDesignerForm.Page is TRMDialogPage then
begin
Align := alClient;
end
else
begin
lWidth := Round(TRMReportPage(FDesignerForm.Page).PrinterInfo.ScreenPageWidth * FDesignerForm.Factor / 100);
lHeight := Round(TRMReportPage(FDesignerForm.Page).PrinterInfo.ScreenPageHeight * FDesignerForm.Factor / 100);
if FDesignerForm.UnlimitedHeight then
lHeight := lHeight * 3;
Align := alNone;
x1 := Round(TRMReportPage(FDesignerForm.Page).spMarginLeft * FDesignerForm.Factor / 100);
y1 := Round(TRMReportPage(FDesignerForm.Page).spMarginTop * FDesignerForm.Factor / 100);
x2 := lWidth - x1 - Round(TRMReportPage(FDesignerForm.Page).spMarginRight * FDesignerForm.Factor / 100);
y2 := lHeight - y1 - Round(TRMReportPage(FDesignerForm.Page).spMarginBottom * FDesignerForm.Factor / 100);
//Color := FDesignerForm.WorkSpaceColor;
SetBounds(x1, y1, x2, y2);
end;
end;
procedure TRMWorkSpace.Paint;
begin
FPageEditor.SetRulerOffset;
RedrawPage;
end;
procedure TRMWorkSpace.RoundCoord(var x, y: Integer);
begin
with FDesignerForm do
begin
if GridAlign then
begin
x := x div GridSize * GridSize;
y := y div GridSize * GridSize;
end;
end;
end;
procedure TRMWorkSpace.NormalizeRect(var r: TRect);
var
i: Integer;
begin
with r do
begin
if Left > Right then
begin
i := Left;
Left := Right;
Right := i
end;
if Top > Bottom then
begin
i := Top;
Top := Bottom;
Bottom := i
end;
end;
end;
procedure TRMWorkSpace.NormalizeCoord(t: TRMView);
begin
if t.spWidth_Designer < 0 then
begin
t.spWidth_Designer := -t.spWidth_Designer;
t.spLeft_Designer := t.spLeft_Designer - t.spWidth_Designer;
end;
if t.spHeight_Designer < 0 then
begin
t.spHeight_Designer := -t.spHeight_Designer;
t.spTop_Designer := t.spTop_Designer - t.spHeight_Designer;
end;
end;
procedure TRMWorkSpace.GetMultipleSelected;
var
i, j, k: Integer;
t: TRMView;
begin
j := 0; k := 0;
FLeftTop := Point(10000, 10000);
RM_SelectedManyObject := False;
if FDesignerForm.SelNum > 1 then {find right-bottom element}
begin
for i := 0 to FDesignerForm.PageObjects.Count - 1 do
begin
t := FDesignerForm.PageObjects[i];
if t.Selected then
begin
THackView(t).OriginalTop := t.spLeft_Designer;
THackView(t).OriginalTop1 := t.spLeft_Designer;
THackView(t).OriginalHeight := t.spTop_Designer;
THackView(t).OriginalHeight := t.spTop_Designer;
if (t.spLeft_Designer + t.spWidth_Designer > j) or ((t.spLeft_Designer + t.spWidth_Designer = j) and (t.spTop_Designer + t.spHeight_Designer > k)) then
begin
j := t.spLeft_Designer + t.spWidth_Designer;
k := t.spTop_Designer + t.spHeight_Designer;
end;
if t.spLeft_Designer < FLeftTop.x then FLeftTop.x := t.spLeft_Designer;
if t.spTop_Designer < FLeftTop.y then FLeftTop.y := t.spTop_Designer;
end;
end;
RM_SelectedManyObject := True;
end;
end;
procedure TRMWorkSpace.OnMouseDownEvent(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
i: Integer;
f, DontChange, v: Boolean;
t: TRMView;
Rgn: HRGN;
p: TPoint;
lRect: TRect;
function _IsDropDownField(aView: TRMView): Boolean;
begin
Result := (aView is TRMReportView) and (X >= aView.spRight_Designer - 16) and
(X <= aView.spRight_Designer) and
(Y >= aView.spTop_Designer) and
(Y <= aView.spTop_Designer + 16);
end;
begin
if FFieldListBox.Visible then
FFieldListBox.Hide;
FBandMoved := False;
if FDoubleClickFlag then
begin
FDoubleClickFlag := False;
Exit;
end;
DrawPage(dmSelection);
FMouseButtonDown := True;
DontChange := False;
if Button = mbLeft then
begin
if (ssCtrl in Shift) or (Cursor = crCross) then
begin
FObjectsSelecting := True;
if Cursor = crCross then
begin
DrawFocusRect(RM_OldRect);
RoundCoord(x, y);
RM_OldRect1 := RM_OldRect;
end;
RM_OldRect := Rect(x, y, x, y);
FDesignerForm.UnSelectAll;
FDesignerForm.SelNum := 0;
RM_SelectedManyObject := False;
FDesignerForm.FirstSelected := nil;
Exit;
end;
end;
if Cursor = crDefault then
begin
f := False;
for i := FDesignerForm.PageObjects.Count - 1 downto 0 do
begin
t := FDesignerForm.PageObjects[i];
Rgn := t.GetClipRgn(rmrtNormal);
v := PtInRegion(Rgn, X, Y);
DeleteObject(Rgn);
if v then
begin
if ssShift in Shift then
begin
t.Selected := not t.Selected;
if t.Selected then Inc(FDesignerForm.SelNum) else Dec(FDesignerForm.SelNum);
end
else
begin
if not t.Selected then
begin
if RM_Class.RMShowDropDownField and _IsDropDownField(t) and (t = FCurrentView) then
begin
end
else
begin
FDesignerForm.UnSelectAll;
FDesignerForm.SelNum := 1;
t.Selected := True;
end;
end
else
DontChange := True;
end;
if FDesignerForm.SelNum = 0 then
FDesignerForm.FirstSelected := nil
else if FDesignerForm.SelNum = 1 then
FDesignerForm.FirstSelected := t
else if FDesignerForm.FirstSelected <> nil then
begin
if not FDesignerForm.FirstSelected.Selected then
FDesignerForm.FirstSelected := nil;
end;
f := True;
Break;
end;
end;
if not f then
begin
FDesignerForm.UnSelectAll;
FDesignerForm.SelNum := 0;
FDesignerForm.FirstSelected := nil;
if Button = mbLeft then
begin
FObjectsSelecting := True;
RM_OldRect := Rect(x, y, x, y);
Exit;
end;
end
else if RM_Class.RMShowDropDownField and (not (ssShift in Shift)) and (FCurrentView <> nil)
and _IsDropDownField(FCurrentView) then // 下拉字段选择列表
begin
FDesignerForm.Report.Dictionary.GetDataSetFields(FCurrentBand.DataSetName, FFieldListBox.Items);
if FCurrentView.Memo.Count > 0 then
FFieldListBox.ItemIndex := FFieldListBox.Items.IndexOf(RMGetFieldName(FCurrentView.Memo[0]));
lRect.Left := FCurrentView.spLeft_Designer;
lRect.Top := FCurrentView.spTop_Designer + 18;
lRect.Right := lRect.Left + Max(140, FCurrentView.spWidth_Designer);
lRect.Bottom := lRect.Top + 200;
if lRect.Left < 0 then
begin
lRect.Right := lRect.Right - lRect.Left;
lRect.Left := 0;
end;
if lRect.Bottom > ClientHeight then
begin
lRect.Top := lRect.Top - (lRect.Bottom - ClientHeight);
lRect.Bottom := ClientHeight;
end;
FFieldListBox.BoundsRect := lRect;
FFieldListBox.Show;
end;
GetMultipleSelected;
if not DontChange then FPageEditor.Editor_SelectionChanged(True);
end;
if FDesignerForm.SelNum = 0 then
begin // reset multiple selection
RM_SelectedManyObject := False;
end;
FLastX := x;
FLastY := y;
FMoved := False;
RM_FirstChange := True;
RM_FirstBandMove := True;
if Button = mbRight then
begin
DrawPage(dmSelection);
FMouseButtonDown := False;
GetCursorPos(p);
FPageEditor.Editor_SelectionChanged(True);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -