📄 rm_designer.pas
字号:
end;
procedure TRMSynEditor.RMDeleteSelected;
begin
{$IFDEF USE_SYNEDIT}
{$ELSE}
DeleteSelected;
{$ENDIF}
end;
procedure TRMSynEditor.RMUndo;
begin
{$IFDEF USE_SYNEDIT}
Self.Undo;
{$ELSE}
UndoBuffer.Undo;
{$ENDIF}
end;
procedure TRMSynEditor.RMRedo;
begin
{$IFDEF USE_SYNEDIT}
Self.Redo;
{$ELSE}
UndoBuffer.Redo;
{$ENDIF}
end;
{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{ TRMVirtualReportDesigner }
type
// TJvInterpreterArrayValues = array[0..10 - 1] of Integer;
THackInterpreterFunDesc = class(TJvInterpreterFunctionDesc);
constructor TRMVirtualReportDesigner.Create(aOwner: TComponent);
{$IFNDEF USE_SYNEDIT}
var
i: Integer;
{$ENDIF}
begin
inherited;
{$IFDEF USE_SYNEDIT}
FSynEditSearch := TSynEditSearch.Create(Self);
FSynEditRegexSearch := TSynEditRegexSearch.Create(Self);
{$ELSE}
FFindDialog := TFindDialog.Create(Self);
FFindDialog.OnFind := FindDialog1Find;
FReplaceDialog := TReplaceDialog.Create(Self);
FReplaceDialog.OnFind := ReplaceDialog1Find;
FReplaceDialog.OnReplace := ReplaceDialog1Replace;
FReplaceDialog.OnShow := ReplaceDialog1Show;
{$ENDIF}
FCodeMemo := TRMSynEditor.Create(Self);
with FCodeMemo do
begin
Parent := Tab1;
Visible := False;
{$IFDEF USE_SYNEDIT}
WantTabs := True;
{$ENDIF}
Align := alClient;
SetHighLighter(rmhlPascal);
Font.Name := 'Courier New';
Font.Size := 10;
SetGutterWidth(48);
SetGroupUndo(True);
SetUndoAfterSave(False);
SetShowLineNumbers(True);
SetReservedForeColor(clBlue);
SetCommentForeColor(clGreen);
{$IFNDEF USE_SYNEDIT}
Completion.DropDownCount := 8;
Completion.Enabled := True;
Completion.ItemHeight := 13;
Completion.Interval := 800;
Completion.ListBoxStyle := lbStandard;
Completion.CaretChar := '|';
Completion.CRLF := '/n';
Completion.Separator := '*';
Completion.Templates.Clear;
for i := Low(RMCompletionStr) to High(RMCompletionStr) do
Completion.Templates.Add(RMCompletionStr[i]);
{$ENDIF}
OnChange := OnCodeMemoChangeEvent;
{$IFDEF USE_SYNEDIT}
OnReplaceText := OnCodeMemoReplaceText;
OnStatusChange := OnCodeMemoStatusChange;
{$ELSE}
OnChangeStatus := OnCodeMemoSelectionChangeEvent;
{$ENDIF}
OnDragOver := DoDragOver;
OnDragDrop := DoDragDrop;
end;
FCodeGenEngine := TRMCodeGenEngine.Create;
FCodeGenEngine.OnGetScript := DoCodeGenGetScript;
FCodeGenEngine.OnScriptChanged := DoCodeGenScriptChanged;
end;
destructor TRMVirtualReportDesigner.Destroy;
begin
FCodeGenEngine.Free;
inherited;
end;
procedure TRMVirtualReportDesigner.OnCodeMemoChangeEvent(Sender: TObject);
begin
Modified := True;
EnableControls;
end;
{$IFDEF USE_SYNEDIT}
procedure TRMVirtualReportDesigner.DoSearchReplaceText(aReplace: Boolean;
aBackwards: Boolean);
var
lOptions: TSynSearchOptions;
begin
if aReplace then
lOptions := [ssoPrompt, ssoReplace, ssoReplaceAll]
else
lOptions := [];
if aBackwards then
Include(lOptions, ssoBackwards);
if FSearchCaseSensitive then
Include(lOptions, ssoMatchCase);
if not FSearchFromCaret1 then
Include(lOptions, ssoEntireScope);
if FSearchSelectionOnly then
Include(lOptions, ssoSelectedOnly);
if FSearchWholeWords then
Include(lOptions, ssoWholeWord);
if FSearchRegex then
FCodeMemo.SearchEngine := FSynEditRegexSearch
else
FCodeMemo.SearchEngine := FSynEditSearch;
if FCodeMemo.SearchReplace(FSearchText, FReplaceText, lOptions) = 0 then
begin
MessageBeep(MB_ICONASTERISK);
//Statusbar.SimpleText := STextNotFound;
if ssoBackwards in lOptions then
FCodeMemo.BlockEnd := FCodeMemo.BlockBegin
else
FCodeMemo.BlockBegin := FCodeMemo.BlockEnd;
FCodeMemo.CaretXY := FCodeMemo.BlockBegin;
end;
if RMConfirmReplaceDialog <> nil then
FreeAndNil(RMConfirmReplaceDialog);
end;
procedure TRMVirtualReportDesigner.ShowSearchReplaceDialog(aReplace: Boolean);
var
lDlg: TForm;
begin
if aReplace then
lDlg := TRMTextReplaceDialog.Create(Self)
else
lDlg := TRMTextSearchDialog.Create(Self);
with TRMTextSearchDialog(lDlg) do
begin
try
SearchBackwards := FSearchBackwards;
SearchCaseSensitive := FSearchCaseSensitive;
SearchFromCursor := FSearchFromCaret1;
SearchInSelectionOnly := FSearchSelectionOnly;
SearchText := FSearchText;
if FSearchTextAtCaret then
begin
if FCodeMemo.SelAvail and (FCodeMemo.BlockBegin.Line = FCodeMemo.BlockEnd.Line) then
SearchText := FCodeMemo.SelText
else
SearchText := FCodeMemo.GetWordAtRowCol(FCodeMemo.CaretXY);
end;
SearchTextHistory := FSearchTextHistory;
if aReplace then
begin
with lDlg as TRMTextReplaceDialog do
begin
ReplaceText := FReplaceText;
ReplaceTextHistory := FReplaceTextHistory;
end;
end;
SearchWholeWords := FSearchWholeWords;
if ShowModal = mrOK then
begin
FSearchBackwards := SearchBackwards;
FSearchCaseSensitive := SearchCaseSensitive;
FSearchFromCaret1 := SearchFromCursor;
FSearchSelectionOnly := SearchInSelectionOnly;
FSearchWholeWords := SearchWholeWords;
FSearchRegex := SearchRegularExpression;
FSearchText := SearchText;
FSearchTextHistory := SearchTextHistory;
if aReplace then
begin
with lDlg as TRMTextReplaceDialog do
begin
FReplaceText := ReplaceText;
FReplaceTextHistory := ReplaceTextHistory;
end;
end;
FSearchFromCaret1 := FSearchFromCaret1;
if FSearchText <> '' then
begin
DoSearchReplaceText(aReplace, FSearchBackwards);
FSearchFromCaret1 := True;
end;
end;
finally
lDlg.Free;
end;
end;
end;
procedure TRMVirtualReportDesigner.OnCodeMemoReplaceText(Sender: TObject; const aSearch,
aReplace: string; aLine, aColumn: Integer; var Action: TSynReplaceAction);
var
lPos: TPoint;
lEditRect: TRect;
begin
if ASearch = AReplace then
Action := raSkip
else
begin
lPos := FCodeMemo.ClientToScreen(
FCodeMemo.RowColumnToPixels(
FCodeMemo.BufferToDisplayPos(
BufferCoord(aColumn, aLine))));
lEditRect := ClientRect;
lEditRect.TopLeft := ClientToScreen(lEditRect.TopLeft);
lEditRect.BottomRight := ClientToScreen(lEditRect.BottomRight);
if RMConfirmReplaceDialog = nil then
RMConfirmReplaceDialog := TRMConfirmReplaceDialog.Create(Application);
RMConfirmReplaceDialog.PrepareShow(lEditRect, lPos.X, lPos.Y,
lPos.Y + FCodeMemo.LineHeight, aSearch);
case RMConfirmReplaceDialog.ShowModal of
mrYes: Action := raReplace;
mrYesToAll: Action := raReplaceAll;
mrNo: Action := raSkip;
else
Action := raCancel;
end;
end;
end;
procedure TRMVirtualReportDesigner.OnCodeMemoStatusChange(Sender: TObject;
Changes: TSynStatusChanges);
begin
if scModified in Changes then
begin
Modified := True;
end;
if scSelection in Changes then
begin
ShowPosition;
end;
EnableControls;
end;
{$ELSE}
procedure TRMVirtualReportDesigner.DoSearchReplaceText(aReplace: Boolean;
ABackwards: Boolean);
begin
FindNext;
end;
procedure TRMVirtualReportDesigner.ShowSearchReplaceDialog(aReplace: Boolean);
begin
if aReplace then
begin
FReplaceDialog.Execute;
end
else
begin
FFindDialog.FindText := FCodeMemo.GetWordOnCaret;
FFindDialog.Execute;
end;
end;
procedure TRMVirtualReportDesigner.OnCodeMemoSelectionChangeEvent(Sender: TObject);
begin
ShowPosition;
EnableControls;
end;
procedure TRMVirtualReportDesigner.FindDialog1Find(Sender: TObject);
begin
FFindDialog.CloseDialog;
FindNext;
end;
procedure TRMVirtualReportDesigner.ReplaceDialog1Find(Sender: TObject);
begin
Replace_FindNext;
end;
procedure TRMVirtualReportDesigner.ReplaceDialog1Show(Sender: TObject);
begin
FScriptCanReplace := False;
end;
procedure TRMVirtualReportDesigner.ReplaceDialog1Replace(Sender: TObject);
begin
if frReplaceAll in FReplaceDialog.Options then
begin
if not FScriptCanReplace then
Replace_FindNext;
while FScriptCanReplace do
begin
FCodeMemo.SelText := FReplaceDialog.ReplaceText;
Replace_FindNext;
end;
end
else
begin
if not FScriptCanReplace then
Replace_FindNext;
if FScriptCanReplace then
begin
FCodeMemo.SelText := FReplaceDialog.ReplaceText;
Replace_FindNext;
end;
end;
end;
procedure TRMVirtualReportDesigner.FindNext;
var
lStr, lStr1: string;
lPStr: PChar;
begin
lStr := FCodeMemo.Lines.Text;
lStr1 := FFindDialog.FindText;
if not (frMatchCase in FFindDialog.Options) then
begin
lStr := ANSIUpperCase(lStr);
lStr1 := ANSIUpperCase(lStr1);
end;
lPStr := StrPos(PChar(lStr) + FCodeMemo.SelStart, PChar(lStr1));
if lPStr <> nil then
begin
FCodeMemo.SelStart := lPStr - PChar(lStr);
FCodeMemo.SelLength := Length(lStr1);
end;
end;
procedure TRMVirtualReportDesigner.Replace_FindNext;
var
lStr, lStr1: string;
lPStr: PChar;
begin
FScriptCanReplace := False;
lStr := FCodeMemo.Lines.Text;
lStr1 := FReplaceDialog.FindText;
if not (frMatchCase in FReplaceDialog.Options) then
begin
lStr := ANSIUpperCase(lStr);
lStr1 := ANSIUpperCase(lStr1);
end;
lPStr := StrPos(PChar(lStr) + FCodeMemo.SelStart, PChar(lStr1));
if lPStr <> nil then
begin
FCodeMemo.SelStart := lPStr - PChar(lStr);
FCodeMemo.SelLength := Length(lStr1);
FScriptCanReplace := True;
end
else
FReplaceDialog.CloseDialog;
end;
{$ENDIF}
procedure TRMVirtualReportDesigner.DoDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := (not FCodeMemo.ReadOnly) and
(Source = TRMDesignerForm(Self).FFieldForm.lstFields);
end;
procedure TRMVirtualReportDesigner.DoDragDrop(Sender, Source: TObject; X, Y: Integer);
var
lStr: string;
begin
lStr := TRMDesignerForm(Self).FFieldForm.DBField;
if lStr <> '' then
begin
lStr := 'GetValue(''' + lStr + ''')';
{$IFNDEF USE_SYNEDIT}
if FCodeMemo.SelLength = 0 then
FCodeMemo.SelStart := FCodeMemo.PosFromCaret(FCodeMemo.CaretX, FCodeMemo.CaretY);
{$ENDIF}
FCodeMemo.SelText := lStr;
FCodeMemo.SelLength := 0;
// lStr1 := FCodeMemo.Lines[FCodeMemo.CaretY];
// while Length(lStr1) <= FCodeMemo.CaretX do
// lStr1 := lStr1 + ' ';
// System.Insert(lStr, lStr1, FCodeMemo.CaretX + 1);
// FCodeMemo.Lines[FCodeMemo.CaretY] := lStr1;
// FCodeMemo.SelText := 'ddd';
end;
end;
procedure TRMVirtualReportDesigner.SetModified(Value: Boolean);
begin
inherited;
if Value then
FCodeGenEngine.Modified;
end;
function TRMVirtualReportDesigner.FunctionExists(
const aFuncName: string): Boolean;
begin
Result := FCodeGenEngine.FunctionExists(AFuncName);
end;
function TRMVirtualReportDesigner.DefineMethod(const AFuncName,
AFuncDefine: string): boolean;
begin
Result := True;
try
FCodeMemo.BeginUpdate;
try
if not FCodeGenEngine.FunctionExists(AFuncName) then
begin
FCodeGenEngine.AddFunctionCode(AFuncName,AFuncDefine,nil);
end;
finally
FCodeMemo.EndUpdate;
end;
except
Result:=False;
end;
end;
function TRMVirtualReportDesigner.GotoMethod(const AFuncName:string): boolean;
var
i:Integer;
begin
result := True;
if FCodeGenEngine.FunctionExists(AFuncName) then
begin
i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -