Конференция "Сети" » Извлечение текста из WebBrowser`а [D6, WinXP]
 
  • leonidus (05.08.08 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 © (05.08.08 16:34) [1]
    > leonidus  (05.08.2008 16:19:00)  [0]

    Сюда попадаешь?  Timer1.Enabled:=false;
    Какой тип у DocumentSourceText
  • leonidus (05.08.08 16:46) [2]
    Да попадаю. DocumentSourceText это string.
  • Anatoly Podgoretsky © (05.08.08 16:50) [3]
    Раз попадаешь, что показывает отладчик для DocumentSourceText
  • leonidus (05.08.08 16:59) [4]
    заметил сейчас вот что, первый раз DocumentSourceText='', но стоит запросить данные еще раз и все начинает работать как по нотам...
  • leonidus (05.08.08 17:12) [5]
    Ну это ладно, теперь возник другой вопрос, текст с помощью DocumentSourceText извлекается типа string, но результат AJAX-приложения выдается в юникоде, в связи с чем вопрос, как мне получить именно юникод?
  • Krolm © (05.08.08 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 (05.08.08 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-ти битную и я так понимаю ваша функция этого и не делает... или я что-то не так понял?
 
Конференция "Сети" » Извлечение текста из WebBrowser`а [D6, WinXP]
Есть новые Нет новых   [134433   +22][b:0][p:0]