rm_dsgform.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 2,142 行 · 第 1/5 页

PAS
2,142
字号
unit RM_DsgForm;

interface

{$I RM.INC}

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, Printers, Menus, ComCtrls, ExtCtrls, Clipbrd, Commctrl,
  RM_Class, RM_Preview, RM_Common, RM_DsgCtrls, RM_Ctrls, RM_Insp,
  RM_EditorInsField
  {$IFDEF USE_INTERNAL_JVCL}
  , rm_JvInterpreter, rm_JvInterpreterParser, rm_JvInterpreterConst, rm_JvUtils
  {$ELSE}
  , JvInterpreter, JvInterpreterParser, JvInterpreterConst, rm_JvUtils
  {$ENDIF}

  {$IFDEF USE_SYNEDIT}
  , SynEdit, SynHighlighterPas, SynEditRegexSearch, SynEditSearch, SynEditTypes
  {$ELSE}
  {$IFDEF USE_INTERNAL_JVCL}
  , rm_JvEditor, rm_JvHLEditor {, rm_JvEditorCommon}
  {$ELSE}
  , JvEditor, JvHLEditor, JvEditorCommon
  {$ENDIF}
  {$ENDIF}

  {$IFDEF Delphi4}, ImgList{$ENDIF}
  {$IFDEF Delphi6}, Variants{$ENDIF};

type

  TRMUndoAction = (acInsert, acDelete, acEdit, acZOrder,
    acChangeCellSize, acChangeCellCount, acChangePage);
  TRMHighLighter = (rmhlNone, rmhlPascal, rmhlCBuilder, rmhlSql, rmhlPython, rmhlJava, rmhlVB,
    rmhlHtml, rmhlPerl, rmhlIni, rmhlCocoR, rmhlPhp, rmhlNQC);

  TRMSplitInfo = record
    SplRect: TRect;
    SplX: Integer;
    View1, View2: TRMView;
  end;

  {$IFDEF USE_SYNEDIT}
  TRMSynEditor = class(TSynEdit)
    {$ELSE}
  TRMSynEditor = class(TJvHLEditor)
    {$ENDIF}
  public
    procedure SetHighLighter(aHighLighter: TRMHighLighter);
    procedure SetGutterWidth(aWidth: Integer);
    procedure SetGroupUndo(aValue: Boolean);
    procedure SetUndoAfterSave(aValue: Boolean);
    procedure SetReservedForeColor(aValue: TColor);
    procedure SetCommentForeColor(aValue: TColor);

    function RMCanCut: Boolean;
    function RMCanCopy: Boolean;
    function RMCanPaste: Boolean;
    function RMCanUndo: Boolean;
    function RMCanRedo: Boolean;

    procedure RMClearUndoBuffer;
    procedure RMClipBoardCut;
    procedure RMClipBoardCopy;
    procedure RMClipBoardPaste;
    procedure RMDeleteSelected;
    procedure RMUndo;
    procedure RmRedo;
  end;

  TRMDesignerDrawMode = (dmAll, dmSelection, dmShape);
  TRMCursorType = (ctNone, ct1, ct2, ct3, ct4, ct5, ct6, ct7, ct8);
  TRMShapeMode = (smFrame, smAll);
  TRMDesignerEditMode = (mdInsert, mdSelect);

  { TRMVirtualReportDesigner }
  TRMVirtualReportDesigner = class(TRMReportDesigner)
  private
    procedure SetCurPos(Value: Integer);
    function GetCurPos: Integer;
    procedure Back;
    function ParseDataType: IJvInterpreterDataType;
    procedure ParseToken;
    procedure NextToken;
    function Function1(aParams: PRMParamRecArray; var aParamCount: Integer): string;
    procedure SkipIdentifier1;
    procedure SkipToUntil1;
    procedure SkipStatement1;
    procedure SkipToEnd1;
    procedure FindToken1(TTyp1: TTokenTyp);
    procedure ErrorExpected(Exp: string);
    procedure FindOneFunc(aParams: PRMParamRecArray;
      var aIsEnd: Boolean; var aFuncName: string; var aParamCount: Integer);

    function PosBeg: Integer;
    function PosRow: Integer;
  protected
    {$IFDEF USE_SYNEDIT}
    FSearchBackwards: boolean;
    FSearchCaseSensitive: boolean;
    FSearchFromCaret: boolean;
    FSearchFromCaret1: Boolean;
    FSearchSelectionOnly: boolean;
    FSearchTextAtCaret: boolean;
    FSearchWholeWords: boolean;
    FSearchRegex: boolean;

    FSearchText: string;
    FSearchTextHistory: string;
    FReplaceText: string;
    FReplaceTextHistory: string;

    SynPasSyn1: TSynPasSyn;
    FSynEditSearch: TSynEditSearch;
    FSynEditRegexSearch: TSynEditRegexSearch;
    {$ELSE}
    FScriptCanReplace: Boolean;
    FFindDialog: TFindDialog;
    FReplaceDialog: TReplaceDialog;
    {$ENDIF}
    FCodeMemo: TRMSynEditor;
    Tab1: TRMTabControl;

    FSaveFuncPos, FSaveFuncRow: Integer;
    FSaveFuncBeginPos: Integer;
    FUnitSection: TUnitSection;
    FParsed: Boolean;
    FBacked: Boolean;
    TTyp: TTokenTyp;
    TokenStr1: string;
    PrevTTyp: TTokenTyp;
    Token: Variant;
    property TokenStr: string read TokenStr1;
    property CurPos: Integer read GetCurPos write SetCurPos;

    procedure ShowPosition; virtual; abstract;
    procedure EnableControls; virtual; abstract;
    procedure OnCodeMemoChangeEvent(Sender: TObject); virtual;
    procedure OnCodeMemoPaintGutterEvent(Sender: TObject; aCanvas: TCanvas); virtual;
    procedure DoSearchReplaceText(aReplace: Boolean; aBackwards: Boolean);
    procedure ShowSearchReplaceDialog(aReplace: Boolean);
    {$IFDEF USE_SYNEDIT}
    procedure OnCodeMemoReplaceText(Sender: TObject; const aSearch,
      aReplace: string; aLine, aColumn: Integer; var Action: TSynReplaceAction);
    procedure OnCodeMemoStatusChange(Sender: TObject; Changes: TSynStatusChanges);
    {$ELSE}
    procedure OnCodeMemoSelectionChangeEvent(Sender: TObject); virtual;

    procedure FindDialog1Find(Sender: TObject);
    procedure ReplaceDialog1Replace(Sender: TObject);
    procedure ReplaceDialog1Find(Sender: TObject);
    procedure ReplaceDialog1Show(Sender: TObject);
    procedure FindNext;
    procedure Replace_FindNext;
    {$ENDIF}

    {$IFDEF Raize}
    procedure Tab1Changing(Sender: TObject; NewIndex: Integer; var AllowChange: Boolean);
    {$ELSE}
    procedure Tab1Changing(Sender: TObject; var AllowChange: Boolean);
    {$ENDIF}
  public
    constructor Create(aOwner: TComponent); override;
    destructor Destroy; override;

    //  Event Editor
    procedure GetEventFunctions(aValues: TStrings; aParams: PRMParamRecArray;
      aParamCount: Integer); override;
    procedure EditMethod(aFuncName: string; aParams: PRMParamRecArray;
      aParamCount: Integer); override;
    procedure ClearEmptyEvent; override;
  end;

  TRMCustomDesignerForm = class;
  TRMWorkSpace = class;

  { TRMToolbarComponent }
  TRMToolbarComponent = class(TPanel)
  private
    FControlIndex: Integer;
    FDesignerForm: TRMCustomDesignerForm;
    FBandsMenu, FPopupMenuComponent: TPopupMenu;
    FBtnNoSelect, FBtnMemoView: TSpeedButton;
    FBtnUp, FBtnDown: {$IFDEF USE_TB2K}TSpeedButton{$ELSE}TRMToolbarButton{$ENDIF};
    FOldPageType: Integer;
    FBusy: Boolean;
    FObjectBand: TSpeedButton;
    FSelectedObjIndex: Integer;
    FImageList: TImageList;

    procedure OnBandMenuPopup(Sender: TObject);
    procedure OnAddBandEvent(Sender: TObject);
    procedure OnOB1ClickEvent(Sender: TObject);
    procedure OnButtonBandClickEvent(Sender: TObject);
    procedure OnOB2MouseDownEvent(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure OnOB2ClickEvent(Sender: TObject);
    procedure OnOB2ClickEvent_1(Sender: TObject);
    procedure OnAddInObectMenuItemClick(Sender: TObject);

    procedure RefreshControls;
    procedure OnResizeEvent(Sender: TObject);
    procedure OnBtnUpClickEvent(Sender: TObject);
    procedure OnBtnDownClickEvent(Sender: TObject);

  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    procedure CreateObjects;

    property btnNoSelect: TSpeedButton read FBtnNoSelect;
    property ObjectBand: TSpeedButton read FObjectBand;
    property SelectedObjIndex: Integer read FSelectedObjIndex;
  end;

  { TRMDesignerDialog }
  TRMCustomDesignerForm = class(TRMVirtualReportDesigner)
  private
    FObjRepeat: Boolean; // was pressed Shift + Insert Object
    FObjectPopupMenu: TPopupMenu;

    FAutoOpenLastFile: Boolean;
    FAutoChangeBandPos: Boolean;
    FWorkSpaceColor: TColor;
    FInspFormColor: TColor;
    FEditorForm: TForm;

    FToolbarComponent: TRMToolbarComponent;

    procedure SetGridShow(Value: Boolean);
    procedure SetGridAlign(Value: Boolean);
    procedure SetGridSize(Value: Integer);
  protected
    ObjID: Integer;
    FirstSelected: TRMView;
    SelNum: Integer; // number of objects currently selected
    FShowSizes: Boolean;
    FBusy: Boolean; // busy flag. need!
    FShapeMode: TRMShapeMode; // show selection: frame or bar
    FSplitInfo: TRMSplitInfo;
    FGridBitmap: TBitmap;
    FGridSize: Integer;
    FShowGrid, FGridAlign: Boolean;
    FUnlimitedHeight: Boolean;
    FCurPage: Integer;

    FWorkSpace: TRMWorkSpace;
    FFieldForm: TRMInsFieldsForm;

    procedure SetCurPage(Value: Integer); virtual; abstract; //
    procedure RefreshData; virtual; abstract;
    procedure DoFormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); virtual; abstract;
    function PageSetup: Boolean; virtual;
  public
    constructor CreateNew(AOwner: TComponent; Dummy: Integer); override;
    destructor Destroy; override;
    function EditorForm: TForm; override;
    procedure UnselectAll; virtual; abstract; //
    procedure SelectionChanged(aRefreshInspProp: Boolean); virtual; abstract; //
    procedure SetPageTabs; virtual; abstract; //
    procedure ResetSelection; virtual; abstract; //
    procedure ShowContent; virtual; abstract; //
    procedure AddUndoAction(aAction: TRMUndoAction); virtual; abstract; //

    procedure GetDefaultSize(var aWidth, aHeight: Integer);
    function IsBandsSelect(var Band: TRMView): Boolean;
    procedure SendBandsToDown;
    function IsSubreport(PageN: Integer): TRMView;
    function RMCheckBand(b: TRMBandType): Boolean;
    procedure GetRegion;
    procedure RedrawPage;
    procedure SetObjectID(t: TRMView);
    procedure ShowObjMsg; virtual;
    procedure ShowEditor; virtual;
    procedure SetRulerOffset; virtual;
    function TopSelected: Integer; virtual;

    property ToolbarComponent: TRMToolbarComponent read FToolbarComponent;
    property ObjectPopupMenu: TPopupMenu read FObjectPopupMenu write FObjectPopupMenu;
    property CurPage: Integer read FCurPage write SetCurPage;
    property ObjRepeat: Boolean read FObjRepeat write FObjRepeat;

    property GridAlign: Boolean read FGridAlign write SetGridAlign;
    property GridSize: Integer read FGridSize write SetGridSize;
    property ShowGrid: Boolean read FShowGrid write SetGridShow;
    property AutoOpenLastFile: Boolean read FAutoOpenLastFile write FAutoOpenLastFile;
    property AutoChangeBandPos: Boolean read FAutoChangeBandPos write FAutoChangeBandPos;
    property WorkSpaceColor: TColor read FWorkSpaceColor write FWorkSpaceColor;
    property InspFormColor: TColor read FInspFormColor write FInspFormColor;
  end;

  { TRMCustomFormWorkSpace }
  TRMDialogForm = class(TForm)
  private
    FDesignerForm: TRMCustomDesignerForm;
    procedure WMMove(var Message: TMessage); message WM_MOVE;
  public
    constructor CreateNew(AOwner: TComponent; Dummy: Integer); override;
    procedure CreateParams(var Params: TCreateParams); override;
    procedure SetPageFormProp;

    procedure OnFormResizeEvent(Sender: TObject);
    procedure OnFormKeyDownEvent(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure OnFormCloseQueryEvent(Sender: TObject; var CanClose: Boolean);
  end;

  { TRMWorkSpace }
  TRMWorkSpace = class(TPanel)
  private
    FBandMoved: Boolean;
    FDesignerForm: TRMCustomDesignerForm;
    FDisableDraw: Boolean;
    FMode: TRMDesignerEditMode; // current mode
    FMouseButtonDown: Boolean; // mouse button was pressed
    FDragFlag: Boolean;
    FCursorType: TRMCursorType; // current mouse cursor (sizing arrows)
    FDoubleClickFlag: Boolean; // was double click
    FObjectsSelecting: Boolean; // selecting objects by framing
    FLeftTop: TPoint;
    FRightBottom: Integer;
    FMoved: Boolean; // mouse was FMoved (with pressed btn)
    FLastX, FLastY: Integer; // here stored last mouse coords

    procedure RoundCoord(var x, y: Integer);
    procedure NormalizeCoord(t: TRMView);
    procedure NormalizeRect(var r: TRect);

    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
    procedure OnDoubleClickEvent(Sender: TObject);

    procedure DrawFocusRect(aRect: TRect);
    procedure DrawHSplitter(aRect: TRect);
    procedure DrawSelection(t: TRMView);
    procedure DrawShape(t: TRMView);
    procedure DoDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
    procedure DoDragDrop(Sender, Source: TObject; X, Y: Integer);
  protected
    procedure Paint; override;
  public
    PageForm: TRMDialogForm;

    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Init;
    procedure SetPage;
    procedure GetMultipleSelected;
    procedure DrawPage(aDrawMode: TRMDesignerDrawMode);
    procedure Draw(N: Integer; aClipRgn: HRGN);
    procedure RedrawPage;

    procedure OnMouseMoveEvent(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure OnMouseDownEvent(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure OnMouseUpEvent(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

    procedure CopyToClipboard;
    procedure DeleteObjects(aAddUndoAction: Boolean);
    procedure PasteFromClipboard;
    procedure SelectAll;

    property DesignerForm: TRMCustomDesignerForm read FDesignerForm write FDesignerForm;
    property DisableDraw: Boolean read FDisableDraw write FDisableDraw;
    property EditMode: TRMDesignerEditMode read FMode write FMode; // current mode
    property MouseButtonDown: Boolean read FMouseButtonDown write FMouseButtonDown; // mouse button was pressed
  end;

var
  CF_REPORTMACHINE: Word;
  RM_LastFontName: string;
  RM_LastFontSize: Integer;
  RM_LastFontCharset: Word;
  RM_LastFontStyle: Word;
  RM_LastFontColor: TColor;
  RM_LastHAlign: TRMHAlign;
  RM_LastVAlign: TRMVAlign;
  RM_LastFillColor: TColor;
  RM_LastFrameWidth: Integer;
  RM_LastFrameColor: TColor;
  RM_LastLeftFrameVisible: Boolean;
  RM_LastTopFrameVIsible: Boolean;
  RM_LastRightFrameVisible: Boolean;
  RM_LastBottomFrameVisible: Boolean;
  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;

  RM_Dsg_LastDataSet: string;
  RMTemplateDir: string = '';

implementation

uses
  RM_Const, RM_Const1, RM_Utils, RM_EditorBandType, RM_EditorMemo,
  RM_PageSetup
  {$IFDEF USE_SYNEDIT}
  , RM_EditorSearchText, RM_EditorReplaceText, RM_EditorConfirmReplace
  {$ENDIF};

type
  THackView = class(TRMView)
  end;

  THackDialogControl = class(TRMDialogControl)
  end;

  THackReport = class(TRMReport)
  end;

  THackPage = class(TRMCustomPage)
  end;

  THackReportPage = class(TRMReportPage)
  end;

  {------------------------------------------------------------------------------}
  {------------------------------------------------------------------------------}
  { TRMSynEdit }

procedure TRMSynEditor.SetHighLighter(aHighLighter: TRMHighLighter);
begin
  {$IFDEF USE_SYNEDIT}
  {$ELSE}
  HighLighter := THighLighter(aHighLighter);
  {$ENDIF}
end;

procedure TRMSynEditor.SetGutterWidth(aWidth: Integer);

⌨️ 快捷键说明

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