TWebBrowser用以下代码修改选定内容源码,选择范围会消失:1.取选定内容源码:
src:=((webbrowser.Document as IHTMLDocument2).selection.createRange as IHtmlTxtRange).htmlText;
2.修改选定内容的源码:
3.写回修改了的源码:
((webbrowser.Document as IHTMLDocument2).selection.createRange as IHtmlTxtRange).pasteHTML(src);
如何写回修改的源码,且仍维持选择范围﹖
src:=((webbrowser.Document as IHTMLDocument2).selection.createRange as IHtmlTxtRange).htmlText;
2.修改选定内容的源码:
3.写回修改了的源码:
((webbrowser.Document as IHTMLDocument2).selection.createRange as IHtmlTxtRange).pasteHTML(src);
如何写回修改的源码,且仍维持选择范围﹖
R:IHTMLTxtRange; doc:=IHTMLdocument2(webbrowser.Document) ;
R:=IHTMLTxtRange(doc.selection.createRange);
R.findText('xxxxx',0,0);
R.select;
> R:IHTMLTxtRange;
>
> doc:=IHTMLdocument2(webbrowser.Document) ;
> R:=IHTMLTxtRange(doc.selection.createRange);
> R.findText('xxxxx',0,0);
> R.select; 呃,这好像不是我要的。仔细看看我的问题,
我说的是,当pastHTML之后,选择范围会不再存在选择状态。
而我希望选择状态能够维持。根据你的解法,似乎是在范围内选范围。
我并不是问这个,
你明白了吗﹖谢谢!
我自己动手试了的。
可以。
比如:当前选定的是'abc'。
paste的是'iseekcode'。
运行我的代码后,'iseekcode'处于选择状态。
明天回答你。试之前先说说我的疑虑:
pasteHTML(src)
后再
find src时,
万一有相同的src呢﹖
不就找到别处了吗﹖
PasteHTML后,
要求TWebBrowser从SelStart处开始,选择length(src)长度做为选择范围吗﹖
我想,可以先将PASTE前的IHTMLTxtRange保存在一个变量里。
PASTE后,FINDTEXT,找到后与那个变量对比,不相等的话就继续FIND。
没有测试。当然,很可能有更好的方法,但这东西太复杂,函数太多了,一下子搞不清。有时间的话,应该是没有问题的。
> 我想,可以先将PASTE前的IHTMLTxtRange保存在一个变量里。
> PASTE后,FINDTEXT,找到后与那个变量对比,不相等的话就继续FIND。呃,我猜你提 IsEqual 这个方法行不通,
你想啊,Paste后,Range内容都变了,怎么可能还 Equal﹖我的想法是,你参考一下以下代码,它可以根据 start 和 length 来 select,
所以,如果我们有办法取得某个 Range 的 start 就好了。procedure TMyWebBrowser.SetSelection(Start,Length:integer);
var
TextRange:IHtmlTxtRange;
begin
self.Doc.selection.empty;
TextRange:=self.Doc.selection.createRange as IHtmlTxtRange;
TextRange.collapse(true);
TextRange.moveEnd('character',Start+Length);
TextRange.moveStart('character',Start);
TextRange.select;
end;
插入后,movestart就可以了。
也就是说,你上面的那段代码已经可以回答你的问题了。>>Range内容都变了,怎么可能还 Equal因为IHTMLTxtRange也是对象,即使内容变了,地址是不会变的。这也是你上面那段代码所以能够工作的原因。
不需要selstart的,这也是我过去认识上的一个误区。
R:IHTMLTxtRange;
tofind:string; doc:=IHTMLdocument2(webbrowser.Document) ;
R:=IHTMLTxtRange(doc.selection.createRange);
R.findText(tofind,-length(tofind),0);
R.select; 只要tofind确定,这样就可以了。
是从当前位置反向查找。
> 插入后,movestart就可以了。
> 也就是说,你上面的那段代码已经可以回答你的问题了。好极> doc:=IHTMLdocument2(webbrowser.Document) ;
> R:=IHTMLTxtRange(doc.selection.createRange);
> R.findText(tofind,-length(tofind),0);
> R.select;R.PastHtml(src);
R.moveStart('character',-length(src));//character 或 word
R.select;我想的是这样子。
晚上回去试试行不行!
> R:=IHTMLTxtRange(doc.selection.createRange);
> if R.findText(tofind,-length(tofind),0) then
> R.select; 方法二:> R.PastHtml(src);
> R.moveStart('character',-length(src));
> R.select;上述两个方法,经我验证后,均可行。
最后我采用方法一,
因为有 FindText 的保证,可确保不会选择错误范围而导致看起来像bug。谢谢 iseekcode 的回应与帮助!