Я использую uHTMLEdit.pas, предоставленный в RadPHP 3, в качестве редактора HTML (на основе TWebbrowser).
Когда я загружаю некоторые файлы HTML, программа аварийно завершает работу. В качестве примера сохраните эту страницу StackOverflow и загрузите ее в TWebbrowser. Он выйдет из строя:
Детали аварии:
Access violation at address 005FAF9B in module 'TestHtmlEditRad.exe'. Read of address 00000000.
Сбой в строке Doc.Body.SetAttribute('contentEditable', 'true', 0)
:
procedure THTMLEdit.EditText(const text: string);
VAR
Doc: IHTMLDocument2;
sl: TStringList;
f: string;
begin
sl := TStringList.Create;
TRY
sl.Text := text;
f := gettempfile('.html');
sl.SaveToFile(f);
wbBrowser.Navigate(f);
Doc := GetDocument;
if Doc <> NIL
then Doc.Body.SetAttribute('contentEditable', 'true', 0); **Crash HERE**
DeleteFile(f);
FINALLY
FreeAndNil(sl);
END;
end;
Он работает с небольшими (не такими сложными) файлами HTML.
У меня вопрос: нормально ли происходит сбой TWebBrowser?
Для воспроизведения вам понадобится только этот код и файл uHTMLEdit.pas (уже предоставленный вместе с Embarcadero RadPHP).
unit FormMain;
interface
USES
Vcl.Controls, Vcl.Forms, Vcl.StdCtrls, uHTMLEdit;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
IMPLEMENTATION {$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
VAR debug: string;
begin
debug:= stringfromfile('test.htm'); // this temporary line of code is mine, for testing. All other code is Embarcadero's
with THTMLEditDlg.Create(application) do begin
try
edittext(debug);
if ShowModal= 0
then debug:= getText;
finally
free;
end;
end;
end;
end.
Doc.Body.SetAttribute
. Я ничего не знаю о uHTMLEdit.pas. Попробуйте загрузить файл непосредственно вTWebBrowser
, а затем установите его:Body.SetAttribute...
в событии завершения документа. помните, что по умолчанию TWebBrowser использует режим совместимости с IE7. см.: stackoverflow.com/questions/25843845/ - person kobik   schedule 20.09.2016Doc.DesignMode := 'On'
после полной загрузки документа. - person kobik   schedule 20.09.2016if Assigned....
как для документа, так и для тела. - person kobik   schedule 20.09.2016wbBrowser.Navigate(f);
становится асинхронным. Вам нужно дождаться ReadyState READYSTATE_COMPLETE. или используйте событие DocumentComplete. ИМО, этот код плохо написан. - person kobik   schedule 20.09.2016