Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Извлечение текста из 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;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.058 c
2-1275124913
tamako
2010-05-29 13:21
2010.08.27
dbf в txt как?


2-1274643123
RWolf
2010-05-23 23:32
2010.08.27
Выполнить код при завершении программы


2-1273221089
Savek
2010-05-07 12:31
2010.08.27
Объединение таблиц из раных баз


4-1237182519
Cypher
2009-03-16 08:48
2010.08.27
Управление чужим окном


11-1215697287
KOLBOSS
2008-07-10 17:41
2010.08.27
как добавить страницу в RichEdit





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский