Wczytywanie źródła strony do komponentu RichEdit lub Memo

0

Cześć
Mam problem z całym wczytaniem kodu źródłowego strony www do Memo lub Richedit.
Wczytuję za pomocą komponentu idHTTP.

var
  ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;
  try
   IdHTTP1.Get('http://www.costam.pl', ms);
  ms.SaveToFile('D:\stronka.html');
  Richedit1.Lines.LoadFromFile('D:\stronka.html');
  Richedit1.Text:= UTF8Decode(Richedit1.Text);
  finally
    ms.Free;
  end;
end;

Chodzi o to, że jak skopiuję kod ze strony i wkleję na żywca do Richedit to jest OK, gorzej z bezpośrednim odczytem kodu poprzez idHTTP lub z pliku.
Jak to naprawić? Nie chcę używać komponentu Webbrowser.

1

Pewnie jest problem ze znakami końca linii lub tekst nie jest w UTF-8. A i wyjaśnij mi, dlaczego dokonujesz tak przedziwnych kombinacji, z zapisem pliku na dysku. Zamiast po prostu zrobić RichEdit1.Lines.LoadFromStream(MS);?

I nie używam Indyka od lat, ale jeśli mnie pamięć nie myli to Get potrafi - zdaje się - zwrócić od razu w stringu to, co zostało pobrane z danego adresu. Pod Synapse i THTTPSend, gdzie zawsze zapis jest najpierw do własności Document typu TMemoryStream, używałem takiego kodu:

function StreamToStr(AStream : TMemoryStream) : string;
begin
  Result := '';
  if AStream.Size > 0 then
  begin
    SetLength(Result, AStream.Size);
    AStream.Read(PChar(Result)^, Length(Result));
    Result := UTF8ToAnsi(Result);
  end;
end;
0

Ja wiem Olesio, że jak wchodzi temat Indy to Ty zaraz swoje synapse :), ale chciałem zrozumieć jedną rzecz łopatologicznie, dlaczego nie wczytuje do memo/richedit całego kodu źródłowego (w przypadku, gdy jest on bardzo duży) z linka poprzez idHTTP, tylko muszę go ręcznie wklejać? :)

Po prostu chciałem napisać malutki program, w którym czytałbym źródło i szukał między tagami jakieś słowo. Z tym nie mam problemu tylko z tym źródłem się męczę. :(

1

Po pierwsze na pewno strona ma kodowanie UTF-8?
Po drugie jaka wersja Delphi i jaka Indy?
Po trzecie w nowych wersjach wersji to się robi inaczej:

RichEdit1.Text:= IdHTTP1.Get('http://mail.ru'); //ruska strona z zachowaniem kodowania w RichEdit

ewentualnie:

var
  html: TStringStream;
begin
  html:= TStringStream.Create('', TEncoding.UTF8);
  try
  IdHTTP1.Get('http://www.yomiuri.co.jp/', html); //japońska strona a co ;)
  RichEdit1.Text:= html.DataString;
  finally
    html.Free;
  end;
end;

W Delphi 7 zapomnij o poprawnym wyświetlaniu tekstu w kontrolkach bo nie obsługują one kodowania UTF-8 (jest TNTControls czy jakoś tak ale nie mam i nie próbowałem).

@olesio SetString ;)

0

@kAzek:
W źródle strony jest <meta charset="utf-8">
Wersja Delphi XE2, a Indy to chyba 10?

0

No to chyba nic nie stoi na przeszkodzie aby wykorzystać TEncoding (jak w moim kodzie tym niżej).

0

@kAzek
Albo ja czegoś nie rozumiem, albo my obaj się nie rozumiemy...
Od początku nie chodzi mi o kodowanie znaków, bo tekst nie jest ważny, może mieć krzaki.
Chodzi mi dlaczego nie wczytuje całego kodu źródłowego strony do komponentów richedit lub memo tylko niecałą połowę (średnio ponad 40 tys znaków przy np. 110 tys. rzeczywistych), gdy pobieram go np. za pomocą Twojego kodu.

Gdy w przeglądarce biorę kod obojętniej z jakiej strony, np. z Allegro http://acer.strefamarek.allegro.pl/laptop-acer-pb-en-te69bm-n2920-4gb-win8-zestaw.html wrzucam przez Ctrl+V go do richedit to pokazuje wszystko ok.
Gdy ten sam kod pobieram za pomocą idhttp czy inną metodą to skraca go średnio o połowę.
Spróbuj skrobnąć na szybko taki programik i sam zobacz o co mi chodzi. :)

Na czym to polega? Czy jakieś ograniczenia mają te komponenty przy takiej metodzie pobierania?
Tego nie mogę skumać, nie charsetów, bo krzaczki mogą sobie być.
:)

0

Pobiera cały kod którego długość to 68825 (W Delphi 7 czyli Ansi 69336) znaki nie wiem skąd masz informacje niby powinno być ich 110 tys. zresztą jak byk po kodzie widać że jest on cały i nie widzę powodu dla którego miałoby być inaczej. Zresztą setki a może 1000 razy pobierałem różne strony za pomocą Indy i nigdy nie było takiego problemu.

0

Sprawdzałem ilość znaków w kompilatorze i w Wordzie: ze spacją, bez spacji, ilość wyrazów itd.
Dobra dzięki, dałem sobie spokój, temat do kosza.

1 użytkowników online, w tym zalogowanych: 0, gości: 1