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)