Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Problem mit Selection im tWebbrowser (https://www.delphipraxis.net/43215-problem-mit-selection-im-twebbrowser.html)

c.wuensch 30. Mär 2005 21:02


Problem mit Selection im tWebbrowser
 
Hi,

ich bin dabei, mit Delphi und dem tWebbrowser einen einfachen WYSIWYG-Editor zu erstellen. Als Besonderheit (weil ich das häufiger benötige) soll dieser auch das Kopieren / Verschieben von ganzen Bereichen (entweder mit <div> oder mit <table>) ermöglichen, wenn sich nur der Cursor in einem solchen Bereich befindet.

Dazu habe ich mir folgendes überlegt:

Die Erkennung eines solchen Bereichs soll dadurch erfolgen, dass er sich nur eine Ebene unter <body> befindet. (Allerdings könnte auch ein besonderer Kommentar zur Kennzeichnung der Bereiche verwendet werden).

Also zum Beispiel:

XML-Code:
<html>
  <head>
    ...
  </head>

  <body>
    <div>
     

Dies ist der erste Bereich</p>
      <table><tr><td>Zelle 1</td><td>Zelle 2</td></tr></table>
     

Dies ist noch immer der erste Bereich</p>
    </div>

    <table>
      <tr><td>2. Bereich</td></tr>
    </table>
  </body>
</html>
Wenn sich der Cursor irgendwo im 1. Bereich befindet, soll der ganze HTML-Code von <div> bis </div> zurückgegeben werden, wenn er sich im 2. Bereich befindet, alles von <table> bis </table>.

Zur Selektierung eines Bereiches habe ich folgende Prozedur geschrieben:

Delphi-Quellcode:
procedure TMainForm.Button1Click(Sender: TObject);
var
  selectionObj: IHTMLSelectionObject;
  selectionRange: IHtmlTxtRange;
  bodyElement: IHtmlElement;
begin
  selectionObj := IHTMLDocument2(Webbrowser.Document).Selection;
  selectionRange := IHtmlTxtRange(selectionObj.CreateRange);
  bodyElement := IHtmlElement(IHTMLDocument2(Webbrowser.Document).body);

  while selectionRange.parentElement <> bodyElement do begin
    selectionRange.movetoelementtext(selectionRange.parentElement);
    showmessage(selectionRange.htmlText);
  end;
end;
Leider läuft diese Schleife immer weiter, ohne die Markierung zu erweitern.

Was könnte ich denn da falsch machen???

(Gerne sind auch alternative Lösungsvorschläge für das beschriebene Problem willkommen)

c.wuensch 21. Apr 2005 15:37

Re: Problem mit Selection im tWebbrowser
 
Hi nochmal,

das Problem besteht immernoch! Ich kriege es einfach nicht hin, die Selection nach oben und nach unten zu erweitern, so dass der richtige Bereich markiert wird :cry:

Hier mal der Link zur MSDN-Seite, auf der die verschiedenen Methoden des IHtmlTxtRange beschrieben werden: http://msdn.microsoft.com/library/de...e/txtrange.asp

Ich kann auch gerne mal ein Testprojekt schicken, falls das weiterhelfen sollte.

Cu, Chris

toms 21. Apr 2005 15:39

Re: Problem mit Selection im tWebbrowser
 
Hallo!

Schicke mal ein Demo-Projekt, dann schau ich's mir mal an.

marabu 21. Apr 2005 15:54

Re: Problem mit Selection im tWebbrowser
 
Zitat:

Zitat von c.wuensch
Leider läuft diese Schleife immer weiter, ohne die Markierung zu erweitern.

Beim Drüberschauen fällt mir auf, dass du mit movetoElementText() arbeitest. Ich glaube nicht, dass sich bei deinem ersten paragraph dadurch das parentElement ändert - warum auch?

[edit]Hangel dich hinauf bis parentElement = bodyElement und pack dir dann outerHtml[/edit]

Grüße vom marabu

c.wuensch 21. Apr 2005 17:43

Re: Problem mit Selection im tWebbrowser
 
@marabu:
Danke für den Tipp, die Idee ist echt gut!

Leider habe ich ein Problem mit dem "Hochhangeln":

Delphi-Quellcode:
  hElement := selectionRange.parentElement;
  While hElement <> bodyElement Do Begin
    hElement := hElement.parentElement;
    showmessage (hElement.outerHTML);
  End;
Durch die Message nach jedem Durchgang der Schleife sehe ich, dass die Bedingung wohl nicht false wird, selbst wenn bereits das body-Element erreicht ist. Der nächste Durchlauf führt dann zu einem Laufzeitfehler.

Gibt es denn eine andere Möglichkeit, diese Bedingung zu formulieren, oder vielleicht eine andere Methode des Hochhangelns?

marabu 21. Apr 2005 18:00

Re: Problem mit Selection im tWebbrowser
 
Die Methode ist schon richtig, nur die Bedingung taugt nicht.
Teste mal hElement.tagName = 'body'

Grüße vom marabu

c.wuensch 21. Apr 2005 19:05

Re: Problem mit Selection im tWebbrowser
 
Hallo nochmal,

es funktioniert tatsächlich! Vielen Dank!!!

Ein kleines Problem habe ich allerdings noch:

Um Bereiche kopieren, ausschneiden, löschen, etc. zu können, brauche ich eine Selection. Diese erzeuge ich nach Durchlauf der Schleife folgendermaßen:

Delphi-Quellcode:
  hElement := selectionRange.parentElement;
  While UpperCase(hElement.parentElement.tagName) <> 'BODY' Do Begin
    hElement := hElement.parentElement;
  End;

  If hElement <> nil Then selectionRange.moveToElementText(hElement);
  selectionRange.Select;

  showmessage (hElement.outerHTML);
  showmessage (selectionRange.htmlText);
SelectionRange enthält dann allerdings nicht den Text von outerHTML, sondern den von innerHTML. Es fehlt also das äußerste HTML-Tag. Wenn ich aber noch einmal parentElement einbaue, dann wird gleich der gesamte body markiert.

Das Problem habe ich (etwas provisorisch) gelöst durch Einfügen der folgenden Zeilen:

Delphi-Quellcode:
  selectionRange.moveStart ('character', -1);
  selectionRange.moveEnd ('character', 1);
Dadurch wird allerdings ein Zeichen zuviel markiert. Gibt es denn noch eine bessere Möglichkeit, den vollen outerHTML-Text in eine Selection umzuwandeln?

marabu 21. Apr 2005 19:34

Re: Problem mit Selection im tWebbrowser
 
Zitat:

Zitat von c.wuensch
Um Bereiche kopieren, ausschneiden, löschen, etc. zu können, brauche ich eine Selection.

Sicher? Was passiert, wenn du dem outerHtml einen leeren String zuweist?
Delphi-Quellcode:
hElement.outerHtml := '';

c.wuensch 21. Apr 2005 19:56

Re: Problem mit Selection im tWebbrowser
 
Klappt tatsächlich!

Komisch, dass ich immer auf das Einfachste nicht komme ;-)

Also danke nochmal!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz