Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   EmbeddedWB, TinyMCE und eigene Form.Submit-Calls (https://www.delphipraxis.net/169520-embeddedwb-tinymce-und-eigene-form-submit-calls.html)

Codehunter 26. Jul 2012 08:44

EmbeddedWB, TinyMCE und eigene Form.Submit-Calls
 
Hallo!

Ich bin beim gemütlichen Programmierfluss 8-) auf ein gemeines Problemchen gestoßen. Das Szenario sah wie folgt aus: Ein Form, darauf ein Button und ein EmbeddedWB (kann aber auch ein TWebbrowser sein). Im Browser ein HTML-Formular mit einer Textarea, welche mit TinyMCE "aufgepeppt" wird. Vom Webserver wird der Textarea ein Default-Wert vorgegeben.
Code:
<form action="index.php" method="post">
  <textarea name="ta1" id="ta1" class="ta1">Original content</textarea>
  <input type="submit" value="Save">
</form>
jetzt soll der Button im Delphi-Form das Submit-Procedere des HTML-Dokumentes auslösen. Dazu habe ich zunächst die übliche Variante hergenommen. Also das Objekt des HTML-Forms besorgen und die Submit-Methode auslösen:
Delphi-Quellcode:
var
  Doc: IHTMLDocument2;
  Forms: IHTMLElementCollection;
  Form: IHTMLFormElement;
begin
  Doc:= BrowserControl.Document as IHTMLDocument2;
  Forms:= Doc.Forms as IHTMLElementCollection;
  Form:= Forms.Item(0,'') as IHTMLFormElement;
  if Assigned(Form) then Form.submit;
end;
Das Auslösen des Submits funktioniert so zwar, aber man wird schnell feststellen, dass dabei nicht der vom User geänderte Inhalt des TinyMCE abgeschickt wird sondern der "Original content" wie im obigen Beispiel. Die Lösung findet sich im MSDN (Abschnitt "Remarks"). Zitat: "The IHTMLFormElement:: submit method does not invoke the HTMLFormElementEvents:: onsubmit event handler."

Also muss man den widerborstigen IE ein wenig überlisten. Lustigerweise wird der Delphi-Code dadurch wesentlich übersichtlicher. Zuerst aber muss man sein HTML ein bisschen anpassen, indem man dem Submit-Button eine ID verpasst:
Code:
<input type="submit" id="subm1" value="Save">
Nun holt man sich einfach das Objekt dieses Buttons und löst seine Click-Prozedur aus:
Delphi-Quellcode:
begin
  BrowserControl.ElementByID['subm1'].click;
end;
Und siehe da: Jetzt wird auch der vom User geänderte Inhalt vom TinyMCE richtig abgeschickt. Da nun aber zwei Submit-Buttons etwas übertrieben wären (einer im HTML-Dokument, einer auf dem Delphi-Form) kann man den im HTML via CSS verstecken:
Code:
<input type="submit" id="subm1" value="Save" style="visibility: hidden;">
Und wiedereinmal hat man die IE-Welt gerettet ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:59 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