📄 rm_designer.pas
字号:
unit RM_Designer;
interface
{$I RM.INC}
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, Printers, Menus, ComCtrls, ExtCtrls, Clipbrd, Commctrl,
TypInfo, ImgList,
RM_Class, RM_Preview, RM_Common, RM_DsgCtrls, RM_Ctrls, RM_Insp, RM_PropInsp,
RM_EditorInsField, RM_CodeGen
{$IFDEF USE_INTERNAL_JVCL}
, rm_JvInterpreter, rm_JvInterpreterParser, rm_JvInterpreterConst
{$ELSE}
, JvInterpreter, JvInterpreterParser, JvInterpreterConst
{$ENDIF}
{$IFDEF USE_TB2K}
, TB2Item, TB2Dock, TB2Toolbar
{$ELSE}
{$IFDEF USE_INTERNALTB97}
, RM_TB97Ctls, RM_TB97Tlbr, RM_TB97
{$ELSE}
, TB97Ctls, TB97Tlbr, TB97
{$ENDIF}
{$ENDIF}
{$IFDEF USE_SYNEDIT}
, SynEdit, SynEditHighlighter,SynHighlighterPas, SynHighlighterSQL
, SynEditRegexSearch, SynEditSearch, SynEditTypes
{$ELSE}
{$IFDEF USE_INTERNAL_JVCL}
, rm_JvEditor, rm_JvHLEditor , rm_JvEditorCommon
{$ELSE}
, JvEditor, JvHLEditor, JvEditorCommon
{$ENDIF}
{$ENDIF}
{$IFDEF COMPILER6_UP}, Variants{$ENDIF};
const
RM_MaxUndoBuffer = 100;
const
crPencil = 11;
DefaultPopupItemsCount = 9;
TAG_SetFrameTop = 1;
TAG_SetFrameLeft = 2;
TAG_SetFrameBottom = 3;
TAG_SetFrameRight = 4;
TAG_BackColor = 5;
// TAG_FrameStyle = 6;
TAG_SetFontName = 7;
TAG_SetFontSize = 8;
TAG_FontBold = 9;
TAG_FontItalic = 10;
TAG_FontUnderline = 11;
TAG_HAlignLeft = 12;
TAG_HAlignCenter = 13;
TAG_HAlignRight = 14;
TAG_HAlignEuqal = 15;
TAG_FrameSize = 16;
TAG_FontColor = 17;
TAG_FrameColor = 19;
TAG_SetFrame = 20;
TAG_NoFrame = 21;
TAG_FrameStyle1 = 25;
TAG_FrameStyle2 = 26;
TAG_FrameStyle3 = 27;
TAG_FrameStyle4 = 28;
TAG_FrameStyle5 = 29;
TAG_FrameStyle6 = 30;
TAG_VAlignTop = 31;
TAG_VAlignCenter = 32;
TAG_VAlignBottom = 33;
TAG_Frame1 = 22;
TAG_Frame2 = 23;
TAG_Frame3 = 24;
TAG_Frame4 = 25;
TAG_DecWidth = 26;
TAG_IncWidth = 27;
TAG_DecHeight = 28;
TAG_IncHeight = 29;
type
TRMUndoAction = (rmacInsert, rmacDelete, rmacEdit, rmacZOrder,
rmacChangeCellSize, rmacChangeGrid, rmacChangePage);
TRMHighLighter = (rmhlNone, rmhlPascal, rmhlCBuilder, rmhlSql, rmhlPython, rmhlJava,
rmhlJScript, rmhlVB,
rmhlHtml, rmhlPerl, rmhlIni, rmhlCocoR, rmhlPhp, rmhlNQC, rmhlCSharp,
rmhlSyntaxHighlighter);
TRMSelectionType = (rmssBand, rmssMemo, rmssOther, rmssMultiple);
TRMSelectionStatus = set of TRMSelectionType;
TRMUndoRec = record
Action: TRMUndoAction;
Page: Integer;
Stream: TMemoryStream;
AddObj: TObject;
end;
PRMUndoRec = ^TRMUndoRec;
TRMUndoBuffer = array[0..RM_MaxUndoBuffer - 1] of TRMUndoRec;
PRMUndoBuffer = ^TRMUndoBuffer;
TRMDesignerForm = class;
{ TRMDesigner }
TRMDesigner = class(TRMCustomDesigner) // fake component
private
FOpenFileCount: Integer;
FTemplDir, FOpenDir, FSaveDir: string;
FDesignerRestrictions: TRMDesignerRestrictions;
FDefaultDictionaryFile: string;
FUseUndoRedo: Boolean;
FDefaultPageClass: string;
procedure SetOpenFileCount(Value: Integer);
procedure SetDesignerRestrictions(Value: TRMDesignerRestrictions);
protected
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property OpenFileCount: Integer read FOpenFileCount write SetOpenFileCount default 4;
property OpenDir: string read FOpenDir write FOpenDir;
property SaveDir: string read FSaveDir write FSaveDir;
property TemplateDir: string read FTemplDir write FTemplDir;
property DesignerRestrictions: TRMDesignerRestrictions read FDesignerRestrictions write SetDesignerRestrictions;
property DefaultDictionaryFile: string read FDefaultDictionaryFile write FDefaultDictionaryFile;
property UseUndoRedo: Boolean read FUseUndoRedo write FUseUndoRedo default True;
property DefaultPageClassName: string read FDefaultPageClass write FDefaultPageClass;
property OnShowAboutForm;
property OnLoadReport;
property OnSaveReport;
property OnNewReport;
property OnClose;
property OnShow;
end;
{ TRMCustomPageEditor }
TRMCustomPageEditor = class(TComponent)
private
protected
FDesignerForm: TRMDesignerForm;
public
constructor CreateComp(aOwner: TComponent; aDesignerForm: TRMDesignerForm); virtual;
destructor Destroy; override;
procedure Editor_Localize; virtual;
procedure Editor_BtnUndoClick(Sender: TObject); virtual;
procedure Editor_BtnRedoClick(Sender: TObject); virtual;
procedure Editor_AddUndoAction(aAction: TRMUndoAction); virtual;
procedure Editor_BeforeFormDestroy; virtual;
procedure Editor_OnInspAfterModify(Sender: TObject; const aPropName, aPropValue: string); virtual;
procedure Editor_KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); virtual;
procedure Editor_OnFormMouseWheelUp(aUp: Boolean); virtual;
procedure Editor_Tab1Changed; virtual;
procedure Editor_DisableDraw; virtual;
procedure Editor_EnableDraw; virtual;
procedure Editor_RedrawPage; virtual;
procedure Editor_Resize; virtual;
procedure Editor_Init; virtual;
procedure Editor_SetCurPage; virtual;
procedure Editor_SelectionChanged(aRefreshInspProp: Boolean); virtual;
procedure Editor_FillInspFields; virtual;
procedure Editor_ShowPosition; virtual;
procedure Editor_ShowContent; virtual;
function Editor_PageObjects: TList; virtual;
procedure Editor_OnInspGetObjects(aList: TStrings); virtual;
procedure Editor_DoClick(Sender: TObject); virtual;
procedure Editor_SelectObject(ObjName: string); virtual;
procedure Editor_AfterChange; virtual;
procedure Editor_SetObjectsID; virtual;
procedure Editor_BtnCutClick(Sender: TObject); virtual;
procedure Editor_BtnCopyClick(Sender: TObject); virtual;
procedure Editor_BtnPasteClick(Sender: TObject); virtual;
procedure Editor_InitToolbarComponent; virtual;
procedure Editor_EnableControls; virtual;
procedure Editor_BtnDeletePageClick(Sender: TObject); virtual;
procedure Editor_MenuFilePreview1Click(Sender: TObject); virtual;
procedure Editor_MenuFileHeaderFooterClick(Sender: TObject); virtual;
published
end;
{ TRMDefaultPageEditor }
TRMDefaultPageEditor = class(TRMCustomPageEditor)
private
FPanel: TPanel;
public
constructor CreateComp(aOwner: TComponent; aDesignerForm: TRMDesignerForm); override;
destructor Destroy; override;
procedure Editor_BtnDeletePageClick(Sender: TObject); override;
end;
{ TRMToolbarModifyPrepared }
TRMToolbarModifyPrepared = class(TRMToolbar)
private
FDesignerForm: TRMDesignerForm;
btnModifyPreviedFirst: TRMToolbarButton;
btnModifyPreviedPrev: TRMToolbarButton;
btnModifyPreviedNext: TRMToolbarButton;
btnModifyPreviedLast: TRMToolbarButton;
btnAutoSave: TRMToolbarButton;
Edit1: TRMEdit;
procedure Localize;
procedure _EditPreparedReport(aNewPageNo: Integer);
procedure btnModifyPreviedFirstClick(Sender: TObject);
procedure btnModifyPreviedPrevClick(Sender: TObject);
procedure btnModifyPreviedLastClick(Sender: TObject);
procedure btnModifyPreviedNextClick(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure btnAutoSaveClick(Sender: TObject);
public
constructor CreateAndDock(AOwner: TComponent; DockTo: TRMDock);
end;
{ TRMToolbarStandard }
TRMToolbarStandard = class(TRMToolbar)
private
FAryButton: array of TObject;
FDesignerForm: TRMDesignerForm;
procedure Localize;
procedure OnCmbScaleChangeEvent(Sender: TObject);
public
BtnFileNew: TRMToolbarButton;
btnFileSave: TRMToolbarButton;
{$IFDEF USE_TB2K}
btnFileOpen: TRMSubmenuItem;
{$ELSE}
btnFileOpen: TRMToolbarButton;
{$ENDIF}
btnPreview1: TRMToolbarButton;
btnPreview: TRMToolbarButton;
btnPrint: TRMToolbarButton;
btnCut: TRMToolbarButton;
btnCopy: TRMToolbarButton;
btnPaste: TRMToolbarButton;
ToolbarSep972: TRMToolbarSep;
btnRedo: TRMToolbarButton;
btnUndo: TRMToolbarButton;
ToolbarSep973: TRMToolbarSep;
btnBringtoFront: TRMToolbarButton;
btnSendtoBack: TRMToolbarButton;
btnSelectAll: TRMToolbarButton;
ToolbarSep974: TRMToolbarSep;
ToolbarSep9723: TRMToolbarSep;
btnDeletePage: TRMToolbarButton;
btnPageSetup: TRMToolbarButton;
ToolbarSep975: TRMToolbarSep;
GB2: TRMToolbarButton;
GB3: TRMToolbarButton;
GB1: TRMToolbarButton;
ToolbarSep976: TRMToolbarSep;
btnExit: TRMToolbarButton;
ToolbarSep971: TRMToolbarSep;
ToolbarSepScale: TRMToolbarSep;
cmbScale: TRMComboBox97 {TComboBox};
constructor CreateAndDock(AOwner: TComponent; DockTo: TRMDock);
end;
{$IFDEF USE_SYNEDIT}
TRMSynEditor = class(TSynEdit)
private
FSynHighlighter:TSynCustomHighlighter;
{$ELSE}
TRMSynEditor = class(TJvHLEditor)
private
procedure OnCodeMemoPaintGutterEvent(Sender: TObject; aCanvas: TCanvas);
{$ENDIF}
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function CreateStringList: TStrings;
procedure SetHighLighter(aHighLighter: TRMHighLighter);
procedure SetGutterWidth(aWidth: Integer);
procedure SetGroupUndo(aValue: Boolean);
procedure SetUndoAfterSave(aValue: Boolean);
procedure SetReservedForeColor(aValue: TColor);
procedure SetCommentForeColor(aValue: TColor);
procedure SetShowLineNumbers(aValue: Boolean);
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;
{ TRMVirtualReportDesigner }
TRMVirtualReportDesigner = class(TRMReportDesigner)
private
{$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;
FSynEditSearch: TSynEditSearch;
FSynEditRegexSearch: TSynEditRegexSearch;
{$ELSE}
FScriptCanReplace: Boolean;
FFindDialog: TFindDialog;
FReplaceDialog: TReplaceDialog;
{$ENDIF}
{$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}
procedure DoDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
procedure DoDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure OnCodeMemoChangeEvent(Sender: TObject); virtual;
procedure DoSearchReplaceText(aReplace: Boolean; aBackwards: Boolean);
procedure ShowSearchReplaceDialog(aReplace: Boolean);
protected
FCodeGenEngine: TRMCodeGenEngine;
FCodeMemo: TRMSynEditor;
FTab1: TRMTabControl;
FMouseDown, FTabChange: Boolean;
FInAssignScript:Boolean;
procedure BeginUpdateScript;
procedure EndUpdateScript;
procedure DoCodeGenGetScript(const AList: TStrings);
procedure DoCodeGenScriptChanged(Sender: TObject);
procedure SetModified(Value: Boolean); override;
public
constructor Create(aOwner: TComponent); override;
destructor Destroy; override;
{//begin 自动生成事件框架相关代码 作者: dejoy}
function GetEditorScriptPos: integer; override;
procedure SetEditorScriptPos(const Value: integer); override;
function GetEditorScriptText: string;override;
procedure SetEditorScriptText(const Value: string);override;
function GetEditorScript: TStrings;override;
procedure SetEditorScript(Value: TStrings);override;
function FunctionExists(const aFuncName: string): Boolean; override;
function DefineMethod(const AFuncName,AFuncDefine: string): boolean;override;
function GotoMethod(const AFuncName: string): boolean; override;
function RenameMethod(const ACurName,ANewName: string): boolean;override;
procedure GetMethodsList(ATypeInfo: PTypeInfo; AValues: TStrings);override;
procedure ShowPosition; virtual; abstract;
procedure EnableControls; virtual; abstract;
property CodeGenEngine: TRMCodeGenEngine read FCodeGenEngine;
property CodeMemo: TRMSynEditor read FCodeMemo;
{//End 自动生成事件框架相关代码 作者: dejoy}
property Tab1: TRMTabControl read FTab1;
end;
{ TRMDesignerForm }
TRMDesignerForm = class(TRMVirtualReportDesigner)
StatusBar1: TStatusBar;
OpenDialog1: TOpenDialog;
ImageListStand: TImageList;
ImageListFont: TImageList;
ImageListFrame: TImageList;
ImageListAlign: TImageList;
ImageListSize: TImageList;
ImageListPosition: TImageList;
ImageListModifyPreview: TImageList;
ImageListAddinTools: TImageList;
SaveDialog1: TSaveDialog;
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
FInspBusy: Boolean;
FInspForm: TRMInspForm;
FFindReplaceForm: TForm;
FOpenFiles: TStringList;
FAutoOpenLastFile: Boolean;
FWorkSpaceColor: TColor;
FInspFormColor: TColor;
FFieldForm: TRMInsFieldsForm;
FEditorForm: TForm;
FUndoBufferLength, FRedoBufferLength: Integer;
FBusy: Boolean; // busy flag. need!
FUnlimitedHeight: Boolean;
FCurPage: Integer;
FCurPageEditor: TRMCustomPageEditor;
FCurDocName, FCaption: string;
FOldFactor: Integer;
FShowGrid, FGridAlign: Boolean;
FGridSize: Integer;
FPopupMenuOpendFiles: TRMPopupMenu;
// 主菜单
FMainMenu: TRMMenuBar;
FBarFile: TRMSubmenuItem;
padFileNew: TRMmenuItem;
padFileOpen: TRMmenuItem;
padFileSave: TRMmenuItem;
padFileSaveAs: TRMmenuItem;
N40: TRMSeparatorMenuItem;
padVarList: TRMmenuItem;
LoadDictionary1: TRMmenuItem;
MergeDictionary1: TRMmenuItem;
SaveAsDictionary1: TRMmenuItem;
N21: TRMSeparatorMenuItem;
padPageSetup: TRMmenuItem;
padPreview: TRMmenuItem;
FMenuFileHeaderFooter: TRMMenuItem;
padPrint: TRMmenuItem;
N24: TRMSeparatorMenuItem;
padFileProperty: TRMmenuItem;
N2: TRMSeparatorMenuItem;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -