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