![]() |
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:
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>.
<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> Zur Selektierung eines Bereiches habe ich folgende Prozedur geschrieben:
Delphi-Quellcode:
Leider läuft diese Schleife immer weiter, ohne die Markierung zu erweitern.
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; Was könnte ich denn da falsch machen??? (Gerne sind auch alternative Lösungsvorschläge für das beschriebene Problem willkommen) |
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: ![]() Ich kann auch gerne mal ein Testprojekt schicken, falls das weiterhelfen sollte. Cu, Chris |
Re: Problem mit Selection im tWebbrowser
Hallo!
Schicke mal ein Demo-Projekt, dann schau ich's mir mal an. |
Re: Problem mit Selection im tWebbrowser
Zitat:
[edit]Hangel dich hinauf bis parentElement = bodyElement und pack dir dann outerHtml[/edit] Grüße vom marabu |
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:
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.
hElement := selectionRange.parentElement;
While hElement <> bodyElement Do Begin hElement := hElement.parentElement; showmessage (hElement.outerHTML); End; Gibt es denn eine andere Möglichkeit, diese Bedingung zu formulieren, oder vielleicht eine andere Methode des Hochhangelns? |
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 |
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:
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.
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); Das Problem habe ich (etwas provisorisch) gelöst durch Einfügen der folgenden Zeilen:
Delphi-Quellcode:
Dadurch wird allerdings ein Zeichen zuviel markiert. Gibt es denn noch eine bessere Möglichkeit, den vollen outerHTML-Text in eine Selection umzuwandeln?
selectionRange.moveStart ('character', -1);
selectionRange.moveEnd ('character', 1); |
Re: Problem mit Selection im tWebbrowser
Zitat:
Delphi-Quellcode:
hElement.outerHtml := '';
|
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 11:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz