Einzelnen Beitrag anzeigen

Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.284 Beiträge
 
Delphi 12 Athens
 
#1

EmbeddedWB, TinyMCE und eigene Form.Submit-Calls

  Alt 26. Jul 2012, 08:44
Hallo!

Ich bin beim gemütlichen Programmierfluss 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
  Mit Zitat antworten Zitat