Martin wrote:
On 25/02/2012 18:40, Mark Morgan Lloyd wrote:
Martin wrote:
On 25/02/2012 16:48, Mark Morgan Lloyd wrote:
Is my understanding correct that in order to get Synedit's replace facility working, one has to write a custom OnReplaceText handler?

What does this in the source do:

CurReplace:=AReplace;
if ssoRegExpr in AOptions then
  CurReplace:=fTSearch.RegExprReplace;

Is there (partial) support for regex-based S&R, and if so how does one use it?


What is wrong with:
replace one (first after x/y = 1/1)
SynEdit1.SearchReplaceEx('a(.)', 'b$1', [ssoReplace, ssoRegExpr], Point(1,1));

or replace all (after x/y = 1/1)
SynEdit1.SearchReplaceEx('a(.)', 'b$1', [ssoReplaceAll, ssoRegExpr], Point(1,1));

SynEdit has no build-in confirm dialog, if that is what you mean

No, I just mean I don't understand how to use it and can't find any usage notes. What's supposed to happen- does Synedit call the OnReplaceText handler and expect this to actually do the search/replace? Or is the handler there to allow a confirmation dialogue to be displayed, after which code like you've shown above should be called explicitly?

(I think I understand the regex usage in your example, thanks for that).


Yes I am aware of the total lack of documentation for SynEdit...

But at least Google should pick this thread up.

Anyway:

1) you need to use "SyneditTypes"

the options are
  TSynSearchOption =
    ( ssoMatchCase, ssoWholeWord,
      ssoBackwards,
      ssoEntireScope, ssoSelectedOnly,
      ssoReplace, ssoReplaceAll,
      ssoPrompt,
ssoSearchInReplacement, // continue search-replace in replacement (with ssoReplaceAll) // replace recursive
      ssoRegExpr, ssoRegExprMultiLine,
ssoFindContinue // Assume the current selection is the last match, and start search behind selection // (before if ssoBackward) // Default is to start at caret (Only SearchReplace / SearchReplaceEx has start/end param)
    );
  TSynSearchOptions = set of TSynSearchOption;

2) The callback
  bPrompt := (ssoPrompt in AOptions);
        if bPrompt and Assigned(fOnReplaceText) then begin
            nAction := DoOnReplaceText(ASearch,CurReplace,
                                       ptFoundStart.Y,ptFoundStart.X);
// calling your event
  TReplaceTextEvent = procedure(Sender: TObject; const ASearch, AReplace:
string; Line, Column: integer; var ReplaceAction: TSynReplaceAction) of object;


NOTE: if you call BeginUpdate, then SynEdit can not paint. So make sure you have not called it.

The editor will select the found text and move it into the visible area, before it calls the event

your callback can set TSynReplaceAction to:
  TSynReplaceAction = (raCancel, raSkip, raReplace, raReplaceAll);

Cancel, aborts the search
ReplaceAll, means no further callbacks

Thanks Martin, I think I've got that :-)

It looks as though my basic mistake was setting ssoPrompt, at which point since I'd implemented an empty callback (i.e. wasn't setting ReplaceAction) nothing was happening.

--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]

--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to