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

📄 rm_designer.pas

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