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

📄 rm_desgn.pas

📁 report machine 2.3 功能强大
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    procedure btnAlignVCenterClick(Sender: TObject);
    procedure padPrintClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure itmFileFile9Click(Sender: TObject);
    procedure edtPreviewPageKeyPress(Sender: TObject; var Key: Char);
    procedure padpopFrameClick(Sender: TObject);
  private
    { Private declarations }
  //WHF Add
    FGridBitmap: TBitmap;
  //old
    FPageForm: TForm;
    FPageView: TRMDesignerPage;
    FInspForm: TRMInspForm;
    FItemWidths: TStringList;
    FCurPage: Integer;
    FGridSizeX, FGridSizeY: Integer;
    FGridShow, FGridAlign: Boolean;
    FUnits: TRMSizeUnits;
    FUndoBuffer, FRedoBuffer: TRMUndoBuffer;
    FUndoBufferLength, FRedoBufferLength: Integer;
    FAutoOpenLastFile: Boolean;
    FFirstTime: Boolean;
    Fld: array[0..63] of string;
    FEditAfterInsert: Boolean;
    FCurDocName, FCaption: string;
    FShapeMode: TRMShapeMode;
    FPagePosition: TAlign;
    FPageType: TRMPageType;
    FMDown, FChangeUnits: Boolean;
    FUnlimitedHeight: Boolean;
    FBtnFontColor: TRMColorPickerButton;
    FBtnBackColor: TRMColorPickerButton;
    FBtnFrameColor: TRMColorPickerButton;
    FUseTableName: Boolean;
    FEditorForm: TRMEditorForm;

    //WHF Add
    FFieldsDialogVisible: Boolean;
    FInspFormVisible: Boolean;
    FReportViewer: TRMPreview;
    FcmbFont: TRMFontComboBox;
    FcmbFontSize: TRMComboBox;
    FOpenFiles: TStringList;

    //WHF Add
    procedure OnpadCheckInspFormClick(Sender: TObject);
    procedure OnpadAutoArrangeClick(Sender: TObject);
    procedure OpenFile(aFileName: string);
    //old
    procedure SetCurPage(Value: Integer);
    procedure SetGridSize(Value: Integer);
    procedure SetGridShow(Value: Boolean);
    procedure SetGridAlign(Value: Boolean);
    procedure SetUnits(Value: TRMSizeUnits);
    procedure SetCurDocName(Value: string);
    procedure SelectionChanged;
    procedure ShowPosition;
    procedure ShowContent;
    procedure EnableControls;
    procedure ResetSelection;
    procedure DeleteObjects(aAddUndoAction: Boolean);
    procedure AddPage;
    procedure RemovePage(n: Integer);
    procedure SetPageTitles;

    procedure DefFrameEditor(Sender: TObject);
    procedure DefMemoEditor(Sender: TObject);
    procedure DefPictureEditor(Sender: TObject);
    procedure DefbkPictureEditor(Sender: TObject);
    procedure DefTagEditor(Sender: TObject);
    procedure DefRestrEditor(Sender: TObject);
    procedure DefHighlightEditor(Sender: TObject);
    procedure DefFieldEditor(Sender: TObject);
    procedure DefDataSourceEditor(Sender: TObject);
    procedure DefCrossDataSourceEditor(Sender: TObject);
    procedure DefGroupEditor(Sender: TObject);
    procedure DefFontEditor(Sender: TObject);
    procedure DefCalcMemoEditor(Sender: TObject);
    procedure DefScript_BeforePrintEditor(Sender: TObject);
    procedure DefScript_AfterPrintEditor(Sender: TObject);

    procedure FillInspFields;
    function RectTypEnabled: Boolean;
    function FontTypEnabled: Boolean;
    function ZEnabled: Boolean;
    function CutEnabled: Boolean;
    function CopyEnabled: Boolean;
    function PasteEnabled: Boolean;
    function DelEnabled: Boolean;
    function EditEnabled: Boolean;
    procedure MoveObjects(dx, dy: Integer; Resize: Boolean);
    procedure SelectAll;
    procedure Unselect;
    procedure CutToClipboard;
    procedure CopyToClipboard;
    procedure SaveState;
    procedure RestoreState;
    procedure SetOpenFileMenuItems(const aNewFile: string);
    procedure ClearBuffer(Buffer: TRMUndoBuffer; var BufferLength: Integer);
    procedure ClearUndoBuffer;
    procedure ClearRedoBuffer;
    procedure Undo(Buffer: PRMUndoBuffer);
    procedure ReleaseAction(ActionRec: TRMUndoRec);
    procedure AddAction(Buffer: PRMUndoBuffer; a: TRMUndoAction; List: TList);
    procedure AddUndoAction(a: TRMUndoAction);
    procedure InsFieldsClick(Sender: TObject);
    procedure GetDefaultSize(var dx, dy: Integer);
    function SelStatus: TRMSelectionStatus;
    procedure OnModify(Item: Integer);
    procedure PageFormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure PageFormResize(Sender: TObject);
    procedure PageFormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    function BeforeEdit: Boolean;
    procedure AfterEdit;
    procedure DoEdit(ClassRef: TClass);
    procedure ShowFieldsDialog(Show: Boolean);
    procedure HeightChanged(Sender: TObject);
    procedure InspSelectionChanged(ObjName: string);
    procedure InspGetObjects(List: TStrings);
    procedure NotifyParentBands(OldName, NewName: string);
    procedure NotifySubReports(OldIndex, NewIndex: Integer);
    procedure AssignDefEditors;
{$IFDEF Delphi4}
    procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
    procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
{$ENDIF}
    procedure OnPreviewPageChange(Sender: TObject);
    procedure Localize;
  protected
    function GetDesignerPage: TWinControl; override;
  public
    { Public declarations }
    function GetModified: Boolean; override;
    procedure SetModified(Value: Boolean); override;
    procedure RegisterObject(ButtonBmp: TBitmap; const ButtonHint: string; ButtonTag: Integer; IsControl: Boolean); override;
    procedure RegisterTool(MenuCaption: string; ButtonBmp: TBitmap; OnClick: TNotifyEvent); override;
    procedure BeforeChange; override;
    procedure AfterChange; override;
    procedure SelectObject(ObjName: string); override;
    function InsertDBField: string; override;
    function InsertExpression: string; override;
    procedure ShowMemoEditor(Sender: TObject);
    procedure ShowEditor;
    procedure RedrawPage; override;
    function PointsToUnits(x: Double): Double;
    function UnitsToPoints(x: Double): Double;

    property CurDocName: string read FCurDocName write SetCurDocName;
    property CurPage: Integer read FCurPage write SetCurPage;
    property GridSizeX: Integer read FGridSizeX write SetGridSize;
    property GridSizeY: Integer read FGridSizeY write SetGridSize;
    property ShowGrid: Boolean read FGridShow write SetGridShow;
    property GridAlign: Boolean read FGridAlign write SetGridAlign;
    property Units: TRMSizeUnits read FUnits write SetUnits;
    property PageType: TRMPageType read FPageType;
    property UseTableName: Boolean read FUseTableName write FUseTableName;
  end;

//old
function RMCheckBand(b: TRMBandType): Boolean;

var
  RMTemplateDir: string;
  DesignerRestrictions: TRMDesignerRestrictions;

implementation

{$R *.DFM}
{$R *.RES}
{$R RM_LNG2.RES}
{$R RM_LNG3.RES}

uses
  Commctrl, Registry, RM_CmpReg, RM_Pgopt, RM_GEdit,
  RM_Templ, RM_Newrp, RM_DsOpt, RM_Const, RM_Const1, RM_Prntr, RM_Hilit, RM_Flds, RM_flds1,
  RM_Dict, RM_BndEd, RM_VBnd, RM_BTyp, RM_Utils, RM_GrpEd, RM_About,
  RM_IFlds, RM_Restr, RM_Pars, RM_DBRel, RM_DBSet, RM_CalcEditor, RM_fmted, RM_FrameProp,
  RM_DlgExpr, RM_PageF, rm_Wizard, rm_RptWiz, DB;

type
  THackView = class(TRMView)
  end;

var
  FirstSelected: TRMView;
  SelNum: Integer; // number of objects currently selected
  MRFlag: Boolean; // several objects was selected
  ObjRepeat: Boolean; // was pressed Shift + Insert Object
  WasOk: Boolean; // was Ok pressed in dialog
  OldRect, OldRect1: TRect; // object rect after mouse was clicked
  Busy: Boolean; // busy flag. need!
  ShowSizes: Boolean;
  LastFontName: string;
  LastFrameWidth, LastLineWidth: Single;
  LastFrameTyp, LastFontStyle, LastCharset: Word;
  LastFrameColor, LastFillColor, LastFontColor: TColor;
  LastFontSize, LastAlignment: Integer;
  FirstChange: Boolean;
  ClipRgn: HRGN;
  DesignerComp: TRMDesigner;
  InspBusy: Boolean;

  FClipBd: TList; // clipboard

//===========================================================================
//WHF Add

function ClipBd: TList;
begin
  if FClipBd = nil then
    FClipBd := TList.Create;
  Result := FClipBd;
end;

//===========================================================================
//old

function Objects: TList;
begin
  Result := RMDesigner.Page.Objects;
end;

function TopSelected: Integer;
var
  i: Integer;
begin
  Result := Objects.Count - 1;
  for i := Objects.Count - 1 downto 0 do
  begin
    if TRMView(Objects[i]).Selected then
    begin
      Result := i;
      Break;
    end;
  end;
end;

function RMCheckBand(b: TRMBandType): Boolean;
var
  i: Integer;
  t: TRMView;
begin
  Result := False;
  for i := 0 to Objects.Count - 1 do
  begin
    t := Objects[i];
    if t.Typ = gtBand then
    begin
      if b = TRMBandView(t).BandType then
      begin
        Result := True;
        Break;
      end;
    end;
  end;
end;

function GetUnusedBand: TRMBandType;
var
  b: TRMBandType;
begin
  Result := btNone;
  for b := btReportTitle to btNone do
  begin
    if not RMCheckBand(b) then
    begin
      Result := b;
      Break;
    end;
  end;
  if Result = btNone then Result := btMasterData;
end;

procedure SendBandsToDown;
var
  i, j, n, k: Integer;
  t: TRMView;
begin
  n := Objects.Count; j := 0; i := n - 1;
  k := 0;
  while j < n do
  begin
    t := Objects[i];
    if t.Typ = gtBand then
    begin
      Objects.Delete(i);
      Objects.Insert(0, t);
      Inc(k);
    end
    else
      Dec(i);
    Inc(j);
  end;

  for i := 0 to n - 1 do // sends btOverlay to back
  begin
    t := Objects[i];
    if (t.Typ = gtBand) and (TRMBandView(t).BandType = btOverlay) then
    begin
      Objects.Delete(i);
      Objects.Insert(0, t);
      Break;
    end;
  end;
  i := 0; j := 0;
  while j < n do // sends btCrossXXX to RMont
  begin
    t := Objects[i];
    if (t.Typ = gtBand) and (TRMBandView(t).BandType in [btCrossHeader..btCrossFooter]) then
    begin
      Objects.Delete(i);
      Objects.Insert(k - 1, t);
    end
    else
      Inc(i);
    Inc(j);
  end;
end;

procedure ClearClipBoard;
var
  m: TMemoryStream;
begin
  if Assigned(FClipBd) then
  begin
    with FClipBd do
    begin
      while Count > 0 do
      begin
        m := Items[0];
        m.Free;
        Delete(0);
      end;
    end;
  end;
end;

procedure GetRegion;
var
  i: Integer;
  t: TRMView;
  R: HRGN;
begin
  ClipRgn := CreateRectRgn(0, 0, 0, 0);
  for i := 0 to Objects.Count - 1 do
  begin
    t := Objects[i];
    if t.Selected then
    begin
      R := t.GetClipRgn(rtExtended);
      CombineRgn(ClipRgn, ClipRgn, R, RGN_OR);
      DeleteObject(R);
    end;
  end;
  FirstChange := False;
end;

function IsBandsSelect(var Value: TRMView): Boolean;
var
  i: Integer;
begin
  Result := False;
  Value := nil;
  for i := 0 to Objects.Count - 1 do
  begin
    Value := Objects[i];
    if Value.Selected and (Value.Typ = gtBand) then
    begin
      Result := True;
      Break;
    end;
  end;
end;

{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{TRMDesigner}

constructor TRMDesigner.Create(AOwner: TComponent);
begin
//  if Assigned(DesignerComp) then
//    raise Exception.Create('You already have one TRMDesigner component');
  inherited Create(AOwner);
  FCloseQuery := True;
  DesignerComp := Self;
  HideDisabledButtons := True;
  FHelpFile := 'rmuser.hlp';
  FOpenFileCount := 4;
end;

destructor TRMDesigner.Destroy;
begin
  DesignerComp := nil;
  inherited Destroy;
end;

procedure TRMDesigner.SetOpenFileCount(Value: Integer);
begin
  if (Value >= 0) and (Value <= 9) then
    FOpenFileCount := Value;
end;

{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{TRMDesignerPage}

constructor TRMDesignerPage.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Parent := AOwner as TWinControl;
  BevelInner := bvNone;
  BevelOuter := bvNone;
  Color := clWhite;
  BorderStyle := bsNone;
  OnMouseDown := MDown;
  OnMouseUp := MUp;
  OnMouseMove := MMove;
  OnDblClick := DClick;
  OnDragOver := DoDragOver;
  OnDragDrop := DoDragDrop;
end;

procedure TRMDesignerPage.Init;
begin
  FDown := False; FDFlag := False; FRFlag := False;
  Cursor := crDefault; FCT := ctNone;
end;

procedure TRMDesignerPage.SetPage;
var
  Pgw, Pgh, Pgl, Pgt: Integer;
begin
  Pgw := FDesigner.Page.PrnInfo.Pgw;
  Pgh := FDesigner.Page.PrnInfo.Pgh;
  if FDesigner.FUnlimitedHeight then
    Pgh := Pgh * 3;
  Pgt := 10;
  if (Pgw > Parent.ClientWidth - 11) or (FDesigner.FPagePosition = alLeft) then
    Pgl := 10
  else if FDesigner.FPagePosition = alClient then
    Pgl := (Parent.ClientWidth - Pgw) div 2
  else
    Pgl := Parent.ClientWidth - Pgw - 11;

  if FDesigner.PageType = ptDialog then

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -