-
Хочу использовать в своей программе результаты работы AJAX-программы на сервере. Для этого посылаю ей запрос: WB_LoadHTML(EmbeddedWB1, HTMLCode) где EmbeddedWB1 компонент в котором будет отображен результат работы, а HTMLCode созданный по специальному шаблону HTML-документ.
procedure WB_LoadHTML( WebBrowser: TEmbeddedWB; HTMLCode: string ); var sl: TStringList; ms: TMemoryStream; begin WebBrowser.Navigate( 'about:blank' ); while WebBrowser.ReadyState < READYSTATE_INTERACTIVE do Application.ProcessMessages;
if Assigned( WebBrowser.Document ) then begin sl := TStringList.Create; try ms := TMemoryStream.Create; try sl.Text := HTMLCode; sl.SaveToStream( ms ); ms.Seek( 0, 0 ); ( WebBrowser.Document as IPersistStreamInit ).Load( TStreamAdapter.Create( ms ) ); finally ms.Free; end; finally sl.Free; end; end; end;
В итоге в компоненте EmbeddedWB1 вижу результат работы (это текст), однако теперь мне нужно его из EmbeddedWB1 извлечь и поместить в Memo. По таймеру делаю так:
if EmbeddedWB1.ReadyState = READYSTATE_COMPLETE then begin Timer1.Enabled:=false; Memo1.text:=EmbeddedWB1.DocumentSourceText; end;
но несмотря на то что содержимое в EmbeddedWB1 есть, в Memo ничего не отображается. С чем это может быть связано?
-
> leonidus (05.08.2008 16:19:00) [0]
Сюда попадаешь? Timer1.Enabled:=false; Какой тип у DocumentSourceText
-
Да попадаю. DocumentSourceText это string.
-
Раз попадаешь, что показывает отладчик для DocumentSourceText
-
заметил сейчас вот что, первый раз DocumentSourceText='', но стоит запросить данные еще раз и все начинает работать как по нотам...
-
Ну это ладно, теперь возник другой вопрос, текст с помощью DocumentSourceText извлекается типа string, но результат AJAX-приложения выдается в юникоде, в связи с чем вопрос, как мне получить именно юникод?
-
Функция преобразования строки в UTF-8: AnsiToUtf8, модуль System
Обратное: Функция преобразования UTF-8 в строку (в отличае от стандартной работает на строках, где встречаются не только UTF-8 символы, что часто бывает в сети): function UTF8ToStrForce(Value: String): String; var Digit: String; i: Word; HByte: Byte; Len: Byte; begin Result := ''; Len := 0; if Value = '' then Exit; for i := 1 to Length(Value) do begin if Len > 0 then begin Digit := Digit + Value[i]; Dec(Len); if Len = 0 then Result := Result + UTF8ToStr(Digit); end else begin HByte := Ord(Value[i]); if HByte in [$00..$7f] then //Standart ASCII chars Result := Result + Value[i] else begin //Get length of UTF-8 char if HByte and $FC = $FC then Len := 6 else if HByte and $F8 = $F8 then Len := 5 else if HByte and $F0 = $F0 then Len := 4 else if HByte and $E0 = $E0 then Len := 3 else if HByte and $C0 = $C0 then Len := 2 else begin Result := Result + Value[i]; Continue; end; Dec(Len); Digit := Value[i]; end; end; end; end;
-
Krolm я что-то вас не понял, во первых у вас в функции встречается функция UTF8ToStr, я правильно понял что вы подразумевали эту функцию:
function UTF8ToStr(Value: String): String; var buffer: Pointer; BufLen: LongWord; begin BufLen := Length(Value) + 4; GetMem(buffer, BufLen); FillChar(buffer^, BufLen, 0); MultiByteToWideChar(CP_UTF8, 0, @Value[1], BufLen - 4, buffer, BufLen); Result := WideCharToString(buffer); FreeMem(buffer, BufLen); end;
?
Далее. Я не совсем понимаю как можно из строки которая по сути 8-ми битная получить 16-ти битную и я так понимаю ваша функция этого и не делает... или я что-то не так понял?
|