⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rm_dsgform.pas

📁 这是一个功能强大
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    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 + -