grigorij89 napisał(a):Jej działanie jakby zawiesza się w momencie kliknięcie przycisku pokaż wynik.
Masz tam dwie pętle, ale tylko w jednej odświeżasz kolejkę komunikatów funkcją Application->ProcessMessages(). Umieść tą funkcję również w drugiej pętli.
Dodatkowe opóźnienie powoduje funkcja Sleep, która po prostu wstrzymuje aplikację. Zastanów się, czy zależy Tabie na tym by obrazować proces parsowania za pomocą ProgressBar, czy raczej wolisz by aplikacja działała szybko. Funkcja Sleep jest tutaj absolutnie zbędna i tylko szkodzi, miast pomagać.
Ten kod zawiera błąd:
grigorij89 napisał(a):
void __fastcall TForm1::Button1Click(TObject *Sender,TStringList* Lista)
{
Label2->Visible = True;
for(int i = 0; i < 100; i++)
{
ProgressBar1->Position += 1;
Sleep(100);
Application->ProcessMessages();
}
for(int i = 0; i < Lista->Count; i++)
{
Memo1->Lines = GetAdressURL(urlBing + Lista->Strings[i]); // dodaje adres url do memo
Memo1->Lines->Add("#######################################");
Label2->Visible = False;
delete Lista;
}
Powinno być:
void __fastcall TForm1::Button1Click(TObject *Sender,TStringList* Lista)
{
Label2->Visible = True;
for(int i = 0; i < 100; i++)
{
ProgressBar1->Position += 1;
Sleep(100);
Application->ProcessMessages();
}
for(int i = 0; i < Lista->Count; i++)
{
Memo1->Lines = GetAdressURL(urlBing + Lista->Strings[i]); // dodaje adres url do memo
}
Memo1->Lines->Add("#######################################");
Label2->Visible = False;
delete Lista; // <-- BŁĄD !!!
}
Poza tym ta pierwsza pętla jest zbędna gdyż ona tylko porusza ProgressBar-em, który nie odzwierciedla tego co program robi. Zastanawiałeś się wogóle nad tym kodem.
Powinno to wyglądać tak:
void __fastcall TForm1::Button1Click(TObject *Sender,TStringList* Lista)
{
Label2->Visible = True;
int iCount = Lista->Count;
float fProgress = 100.00 / (float)iCount;
for(int i = 0; i < iCount; i++)
{
Memo1->Lines = GetAdressURL(urlBing + Lista->Strings[i]); // dodaje adres url do memo
ProgressBar1->Position += (int)fProgress;
Application->ProcessMessages();
}
Memo1->Lines->Add("#######################################");
Label2->Visible = False;
// delete Lista; - BŁĄD
}
delete Lista - dlaczego błąd?! Dlatego, że lista jest tworzona w zdarzeniu OnClick przycisku Button3 więc jest obiektem lokalnym niedostępnym poza tym zdarzeniem. Nie rozumiem jak ten kod w zaprezentowanej przez Ciebie postaci mógł się Tobie wogóle skompilować.
Jeżeli lista jest obiektem lokalnym to może być używana tylko lokalnie, jeżeli jest obiektem globalnym to nie należy jej niszczyć w zdarzeniu lokalnym gdyż po zniszczeniu obiekt nie będzie już dostępny.