Problem z wczytaniem kodu strony WEB do AnsiString

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

Problem z wczytaniem kodu strony WEB do AnsiString

Nowy postprzez Miroo_007 » Å›roda, 5 listopada 2008, 14:02

Kod: Zaznacz cały
AnsiString tekst = IdHTTP1->Get("http:\\...");

Kiedy wczytuję stronę http:\\ do zmiennej tekst nie pobiera mi całej strony tylko część. Jeżeli usunę część tekstu:
Kod: Zaznacz cały
tekst.Delete(1,100);

To wtedy pojawia się tekst, który nie zmieścił się wcześniej w zmiennej tekst. Przypuszczam, że problem leży przy ograniczeniu pojemności zmiennej tekst. Próbowałem rozwiązać problem tak:
Kod: Zaznacz cały
AnsiString *tekst = new AnsiString;

Jednak wyskakuje w błąd przy linijce:
Kod: Zaznacz cały
tekst = IdHTTP1->Get("http:\\...");

BÅ‚Ä…d: [C++ Error] Unit1.cpp(261): E2034 Cannot convert 'AnsiString' to 'AnsiString *'
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Problem z AnsiString

Nowy postprzez Cyfrowy Baron » Å›roda, 5 listopada 2008, 15:00

Powinno chyba być http://... a nie http:\\... a jeżeli już to http:\\\\....
Problem nie leży tyle w pojemności zmiennej, lecz raczej w tym, że jeżeli zmienna natknie się na jakiś znak, którego nie potrafi zinterpretować, to przestanie dalej pobierać znaki.

Możesz wczytać pobieraną stronę do obiektu typu TStringList:

Kod: Zaznacz cały
  TStringList *lista = new TStringList;
  lista->Text = IdHTTP1->Get("http:\\...");


tutaj nie powinieneś mieć już problemów z pojemnością.
Sugeruję jednak wczytać pobieraną stronę do obiektu Memo celem sprawdzenia, czy rzeczywiście jest to problem z pojemnością, czy też z jakimiś znakami w systemie UTF-8, Unicode, gdyż zmienna AnsiString nie potrafi wyświetlać znaków 64-bitowych, a tylko 32 bitowe. Na tym forum problem ze znakami Unicode był już poruszany i podawane było jakieś rozwiązanie.



W poradzie Wyciąganie adresów URL ze stron internetowych. podałem sposób na wyciąganie adresów, ale jest tam funkcja AnsiString ReadFileURL(AnsiString Url) wczytująca zawartość strony do zmiennej typu AnsiString, posiada ona tą zaletę, że eliminuje wszelkie znaki łamania linii i końca tekstu umożliwiając wczytanie całej strony do jednej zmiennej, więc być może to rozwiązanie będzie lepsze.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Problem z AnsiString

Nowy postprzez Miroo_007 » Å›roda, 5 listopada 2008, 19:20

Przypuszczałem wcześniej, że problem leży przy pojemności stosu pamięci jaką Windows przydziela dla mojego programu. Mam jeszcze jedno pytanie. Czy istnieje opcja w Indy pozwalająca ściągać plik http nie od początku tylko z określonego miejsca w pliku. Chodzi mi głównie oto aby przyspieszyć odpowiedź serwera ponieważ instrukcja IdHTTP1->Get() bardzo długo zwraca wynik.
Ostatnio edytowano środa, 5 listopada 2008, 23:50 przez Miroo_007, łącznie edytowano 1 raz
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Problem z AnsiString

Nowy postprzez Witold » Å›roda, 5 listopada 2008, 20:13

Miroo_007 napisał(a):Przypuszczam, że problem leży przy ograniczeniu pojemności zmiennej tekst

AnsiString może pomieścić do 2GB.

Miroo_007 napisał(a):Mam jeszcze jedno pytanie. Czy istnieje opcja w Indy pozwalająca ściągać plik http nie od początku tylko z określonego miejsca w pliku.


Może to:
IdHTTP->Request->ContentRangeStart
IdHTTP->Request->ContentRangeEnd
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Problem z wczytaniem kodu strony WEB do AnsiString

Nowy postprzez Miroo_007 » Å›roda, 5 listopada 2008, 21:11

Teoretycznie AnsiString może pomieścić dane o pojemności do 2 GB. Ale czy Windows na takie coś pozwala przydzielając pamięć dla programu. Myślę, że rzeczywistość może wyglądać trochę inaczej.
Zapewne dane o pojemność do 2 GB można zrealizować za pomocą instrukcji:
Kod: Zaznacz cały
AnsiString *tekst = new AnsiString;

Pytanie więc jaką maksymalną pojemność ma zmienna jeżeli zastosujemy coś takiego:
Kod: Zaznacz cały
AnsiString tekst;
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Problem z wczytaniem kodu strony WEB do AnsiString

Nowy postprzez Witold » czwartek, 6 listopada 2008, 01:53

Miroo_007 napisał(a):Teoretycznie AnsiString może pomieścić dane o pojemności do 2 GB. Ale czy Windows na takie coś pozwala przydzielając pamięć dla programu. Myślę, że rzeczywistość może wyglądać trochę inaczej.


Najlepiej sprawdź. Jeżeli masz sporo RAMu i znajdzie się odpowiednio duży, ciągły blok pamięci to powinno się udać. U mnie max ~300MB przy 2GB RAMu.

Kod: Zaznacz cały
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  const int _2GB = 2147483647; // 2147483648
  const int  _100MB = 104857600;

  const int ile_zarez = 10*_100MB;
 
  AnsiString as;
  as.SetLength(ile_zarez);
}


Zapewne dane o pojemność do 2 GB można zrealizować za pomocą instrukcji:
Kod: Zaznacz cały
AnsiString *tekst = new AnsiString;


Czemu tak sÄ…dzisz ?
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Problem z wczytaniem kodu strony WEB do AnsiString

Nowy postprzez Cyfrowy Baron » czwartek, 6 listopada 2008, 09:12

Zanim zaczniesz dalej brnąc w AnsiString, najpierw sprawdź kilka rzeczy:

Po pierwsze czy możesz tą stronę wczytać do właściwości Text obiektu Memo, tak jak to pokazałem w serwisie.
Po drugie jeżeli działa wczytywanie do Memo to spróbuj wczytać tą stronę do obiektu typu TStringList tak jak to pokazałem wyżej.
Po trzecie sprawdź wczytywanie tej strony do zmiennej AnsiString nie za pomocą komponentu INDY, lecz za pomocą przedstawionej przeze mnie funkcji AnsiString ReadFileURL(AnsiString Url).

Gdy już będziesz znał odpowiedzi na te pytania, będzie można szukać dalej przyczyny.
Podaj adres strony której nie możesz wczytać, a sprawdzę to, gdyż u mnie wczytywanie stron do zmiennej AnsiString dotychczas zawsze działało, ale być może nie natknąłem się jeszcze na taką stronę.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Problem z wczytaniem kodu strony WEB do AnsiString

Nowy postprzez Miroo_007 » sobota, 8 listopada 2008, 00:39

Sprawdziłem. Twój kod działa poprawnie. Cała strona http została wczytana. Ale dlaczego nie została wczytana do AnsiString?
Kod: Zaznacz cały
TStringList *lista = new TStringList;
lista->Text = IdHTTP1->Get("http:\\...");
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Problem z wczytaniem kodu strony WEB do AnsiString

Nowy postprzez Cyfrowy Baron » sobota, 8 listopada 2008, 09:49

Prawdopodobnie problem z pojemnością, lub jakieś ograniczenie funkcji INDY, dlatego chciałem żebyś wypróbował funkcję AnsiString ReadFileURL(AnsiString Url).
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Problem z wczytaniem kodu strony WEB do AnsiString

Nowy postprzez Witold » sobota, 8 listopada 2008, 10:46

Miroo_007 napisał(a): Ale dlaczego nie została wczytana do AnsiString?


Najwyraźniej została wczytana cała. TidHTTP.Get zwraca AnsiString.

AnsiString __fastcall TidHTTP.Get(AnsiString AURL)


Również właściwość TStringList.Text pobiera/zwraca AnsiString.

Nie napisałeś jak sprawdzałeś jakie dane znajdują się w AnsiStringu. W czym próbowałeś wyświetlić ten string.
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Problem z wczytaniem kodu strony WEB do AnsiString

Nowy postprzez Cyfrowy Baron » sobota, 8 listopada 2008, 11:08

No właśnie, to wszystko jest jakieś mocno nie jasne. Właściwość Text obiektu TStringList jest typu AnsiString, więc powinno działać tak samo w odniesieniu do zmiennej typu AnsiString, co łatwo sprawdzić:

Kod: Zaznacz cały
TStringList *lista = new TStringList;
lista->Text = IdHTTP1->Get("http:\\...");

AnsiString tekst = lista->Text;

Memo1->Text = tekst;


Jeżeli tak działa, to musi działać również tak:

Kod: Zaznacz cały
AnsiString tekst = IdHTTP1->Get("http:\\...");

Memo1->Text = tekst;
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Problem z wczytaniem kodu strony WEB do AnsiString

Nowy postprzez Darek_C++ » poniedziaÅ‚ek, 10 listopada 2008, 11:33

Tak na marginesie adres strony nie podaje się jak w tym poście:
IdHTTP1->Get("http:\\...");
ale
IdHTTP1->Get("http://...");
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
PodziÄ™kowaÅ‚ : 66
OtrzymaÅ‚ podziÄ™kowaÅ„: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    NieznanyNieznana

Re: Problem z wczytaniem kodu strony WEB do AnsiString

Nowy postprzez Miroo_007 » niedziela, 14 grudnia 2008, 15:54

Zmienna AnsiString sprawdzałem za pomocą Debuggera wykorzystując opcję Evaluate/Modify. Wyszukiwałem konkretnych danych w zmiennej AnsiString lecz nie znajdywał mi ich, dlatego że nie została wczytana cała strona http.
Co do uwagi Darka_c++ dotyczÄ…cÄ…:
IdHTTP1->Get("http:\\...");
Ten wpis został wykonany "na szybko" i nie jest odzwierciedleniem mojego kodu tylko przykładem.
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość