TWebBrowser用以下代码修改选定内容源码,选择范围会消失:1.取选定内容源码: 
src:=((webbrowser.Document as IHTMLDocument2).selection.createRange as IHtmlTxtRange).htmlText; 
2.修改选定内容的源码:
3.写回修改了的源码: 
((webbrowser.Document as IHTMLDocument2).selection.createRange as IHtmlTxtRange).pasteHTML(src);
如何写回修改的源码,且仍维持选择范围﹖ 

解决方案 »

  1.   

    var doc:IHTMLdocument2;
        R:IHTMLTxtRange;    doc:=IHTMLdocument2(webbrowser.Document) ;
        R:=IHTMLTxtRange(doc.selection.createRange);
        R.findText('xxxxx',0,0); 
        R.select;
      

  2.   

    > var doc:IHTMLdocument2; 
    >     R:IHTMLTxtRange; 

    >     doc:=IHTMLdocument2(webbrowser.Document) ; 
    >     R:=IHTMLTxtRange(doc.selection.createRange); 
    >     R.findText('xxxxx',0,0); 
    >     R.select; 呃,这好像不是我要的。仔细看看我的问题,
    我说的是,当pastHTML之后,选择范围会不再存在选择状态。
    而我希望选择状态能够维持。根据你的解法,似乎是在范围内选范围。
    我并不是问这个,
    你明白了吗﹖谢谢!
      

  3.   

    你试过吗?
    我自己动手试了的。
    可以。
    比如:当前选定的是'abc'。
    paste的是'iseekcode'。
    运行我的代码后,'iseekcode'处于选择状态。
      

  4.   

    当然,如果你说的是另一种情况,是在直接编辑SOURSCE状态下而不是在浏览器里,那就更容易了,就相当于在文本文件里查找选择。
      

  5.   

    我刚才又测试了一下,复杂的html不行,跨界了。
      

  6.   

    晚上回家就试试。
    明天回答你。试之前先说说我的疑虑:
    pasteHTML(src)
    后再
    find src时,
    万一有相同的src呢﹖
    不就找到别处了吗﹖
      

  7.   

    不能记住 pasteHTML 前的 selStart 位置﹖
    PasteHTML后,
    要求TWebBrowser从SelStart处开始,选择length(src)长度做为选择范围吗﹖
      

  8.   

    IHTMLTxtRange对象有一个isEqual函数。
    我想,可以先将PASTE前的IHTMLTxtRange保存在一个变量里。
    PASTE后,FINDTEXT,找到后与那个变量对比,不相等的话就继续FIND。
    没有测试。当然,很可能有更好的方法,但这东西太复杂,函数太多了,一下子搞不清。有时间的话,应该是没有问题的。
      

  9.   

    > IHTMLTxtRange对象有一个isEqual函数。 
    > 我想,可以先将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;
      

  10.   

    实际上,paste后,插入点应该还在,只是插入的内容在该点之前。
    插入后,movestart就可以了。
    也就是说,你上面的那段代码已经可以回答你的问题了。>>Range内容都变了,怎么可能还 Equal因为IHTMLTxtRange也是对象,即使内容变了,地址是不会变的。这也是你上面那段代码所以能够工作的原因。
    不需要selstart的,这也是我过去认识上的一个误区。
      

  11.   

    var doc:IHTMLdocument2; 
        R:IHTMLTxtRange;
        tofind:string;    doc:=IHTMLdocument2(webbrowser.Document) ; 
        R:=IHTMLTxtRange(doc.selection.createRange); 
        R.findText(tofind,-length(tofind),0); 
        R.select; 只要tofind确定,这样就可以了。
    是从当前位置反向查找。
      

  12.   

    > 实际上,paste后,插入点应该还在,只是插入的内容在该点之前。 
    > 插入后,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;我想的是这样子。 
    晚上回去试试行不行!
      

  13.   

    方法一:> doc:=IHTMLdocument2(webbrowser.Document) ; 
    > 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 的回应与帮助!