Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

Извлечение текста из WebBrowser`а   Найти похожие ветки 

 
leonidus   (2008-08-05 16:19) [0]

Хочу использовать в своей программе результаты работы 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 ничего не отображается. С чем это может быть связано?


 
Anatoly Podgoretsky ©   (2008-08-05 16:34) [1]

> leonidus  (05.08.2008 16:19:00)  [0]

Сюда попадаешь?  Timer1.Enabled:=false;
Какой тип у DocumentSourceText


 
leonidus   (2008-08-05 16:46) [2]

Да попадаю. DocumentSourceText это string.


 
Anatoly Podgoretsky ©   (2008-08-05 16:50) [3]

Раз попадаешь, что показывает отладчик для DocumentSourceText


 
leonidus   (2008-08-05 16:59) [4]

заметил сейчас вот что, первый раз DocumentSourceText="", но стоит запросить данные еще раз и все начинает работать как по нотам...


 
leonidus   (2008-08-05 17:12) [5]

Ну это ладно, теперь возник другой вопрос, текст с помощью DocumentSourceText извлекается типа string, но результат AJAX-приложения выдается в юникоде, в связи с чем вопрос, как мне получить именно юникод?


 
Krolm ©   (2008-08-05 18:57) [6]

Функция преобразования строки в 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;


 
leonidus   (2008-08-05 23:39) [7]

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-ти битную и я так понимаю ваша функция этого и не делает... или я что-то не так понял?



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.068 c
2-1267989705
Delphist
2010-03-07 22:21
2010.08.27
подключение DBGrid к SQL Server в Delphi 2010


2-1273908852
tippa
2010-05-15 11:34
2010.08.27
чтобы все ядра работали...


2-1268377125
Oleksiy
2010-03-12 09:58
2010.08.27
Размер Шрифта


2-1274194704
Delphist2
2010-05-18 18:58
2010.08.27
дата модификации файла


15-1274038912
Kerk
2010-05-16 23:41
2010.08.27
Второе место на spbhackday





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский