AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Problem mit Selection im tWebbrowser

Problem mit Selection im tWebbrowser

Ein Thema von c.wuensch · begonnen am 30. Mär 2005 · letzter Beitrag vom 21. Apr 2005
Antwort Antwort
c.wuensch

Registriert seit: 19. Dez 2004
Ort: Münster
96 Beiträge
 
#1

Problem mit Selection im tWebbrowser

  Alt 30. Mär 2005, 22:02
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)
  Mit Zitat antworten Zitat
c.wuensch

Registriert seit: 19. Dez 2004
Ort: Münster
96 Beiträge
 
#2

Re: Problem mit Selection im tWebbrowser

  Alt 21. Apr 2005, 16:37
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

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
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#3

Re: Problem mit Selection im tWebbrowser

  Alt 21. Apr 2005, 16:39
Hallo!

Schicke mal ein Demo-Projekt, dann schau ich's mir mal an.
Thomas
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Problem mit Selection im tWebbrowser

  Alt 21. Apr 2005, 16:54
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
  Mit Zitat antworten Zitat
c.wuensch

Registriert seit: 19. Dez 2004
Ort: Münster
96 Beiträge
 
#5

Re: Problem mit Selection im tWebbrowser

  Alt 21. Apr 2005, 18:43
@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?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Problem mit Selection im tWebbrowser

  Alt 21. Apr 2005, 19:00
Die Methode ist schon richtig, nur die Bedingung taugt nicht.
Teste mal hElement.tagName = 'body'

Grüße vom marabu
  Mit Zitat antworten Zitat
c.wuensch

Registriert seit: 19. Dez 2004
Ort: Münster
96 Beiträge
 
#7

Re: Problem mit Selection im tWebbrowser

  Alt 21. Apr 2005, 20:05
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) <> 'BODYDo 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?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Problem mit Selection im tWebbrowser

  Alt 21. Apr 2005, 20:34
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?
hElement.outerHtml := '';
  Mit Zitat antworten Zitat
c.wuensch

Registriert seit: 19. Dez 2004
Ort: Münster
96 Beiträge
 
#9

Re: Problem mit Selection im tWebbrowser

  Alt 21. Apr 2005, 20:56
Klappt tatsächlich!

Komisch, dass ich immer auf das Einfachste nicht komme

Also danke nochmal!!!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:38 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