Понадобилось, было не очевидно, решил записать
Способ №1 – на примере замены текста на таг итема (взято отсюда)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
procedure TTestReportConstructor.ReplaceItemToTag(RVData: TCustomRVData; const OldText, NewText: String); var i,r,c: Integer; table: TRVTableItemInfo; s:string; //TRVRawByteString; begin for i := 0 to RVData.Items.Count-1 do if RVData.GetItemStyle(i)>=0 then begin // this is a text item s := RVData.GetItemText(i); //RVData.Items[i]; // call your function for replacing OldText with NewText in s here if s=OldText then s:=NewText; RVData.SetItemText(i,s); //RVData.Items[i] := s; end else if RVData.GetItemStyle(i)=rvsTable then begin table := TRVTableItemInfo(RVData.GetItem(i)); for r := 0 to table.Rows.Count-1 do for c := 0 to table.Rows[r].Count-1 do if table.Cells[r,c]<>nil then ReplaceItemToTag(table.Cells[r,c].GetRVData, OldText, NewText); table.Changed; end; end; |
Применение, пусть текст задан так [R]Что-то[/R], а в этом итеме “Какой-то таг”, тогда пройтись по всем итемам и заменить текст на таг можно так
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
procedure TTestReportConstructor.bTestClick(Sender: TObject); var i: Integer; itemText,itemTag,leftBracket,rightBracket:string; begin with SRichViewEdit.ActiveEditor do begin for i := 0 to RVData.ItemCount-1 do begin itemText:=GetItemText(i); itemTag:=GetItemTag(i); leftBracket:=itemText.Substring(0,3); rightBracket:=itemText.Substring(itemText.Length-4,4); if (leftBracket='[R]') and (rightBracket='[/R]') and (itemTag<>'') then ReplaceItemToTag(SRichViewEdit.ActiveEditor.RVData,itemText,itemTag); Format; end; end; end; |
Способ №2 (источник)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
procedure SearchAndReplaceAll(InSearch, InReplace: string; Editor: TSRVRichViewEditType) ; var startpos, Position, endpos: integer; begin // if not SRichViewEdit.StartEditing(Editor) then exit; SRichViewEdit.CanUpdate := False; SRichViewEdit.ActiveEditor.SetSelectionBounds( 0, SRichViewEdit.ActiveEditor.GetOffsBeforeItem(0), 0, SRichViewEdit.ActiveEditor.GetOffsBeforeItem(0) ); while (SRichViewEdit.ActiveEditor.SearchText( InSearch, [ RVEdit.TRVESearchOption.rvseoMatchCase, RVEdit.TRVESearchOption.rvseoDown, RVEdit.TRVESearchOption.rvseoWholeWord, RVEdit.TRVESearchOption.rvseoMultiItem, RVEdit.TRVESearchOption.rvseoSmartStart ])) do SRichViewEdit.ActiveEditor.InsertText(InReplace, False); SRichViewEdit.CanUpdate := True; end; |
Также понадобится справка для этого способа
Замена контрола на текст( Жми, только сегодня, акция ))))