Dzięki już nie trzeba, napisałem w Synapsie i wszystko działa poprawnie ;]
Jest jednak coś w czym przydała by mi się pomoc. Kod programu i kilka wyjaśnień:
WIPWindow to specjalne okienko które nadzoruje dodawanie plików do listy, coś jak okno w Winrarze które odpala się gdy coś pakujemy lub rozpakowujemy.
Box to ListBox, wiem że gółbym zrobić sobie w locie jakiegoś StringLista ale tak mi wygodniej ;)
FoundErrorsWindow to okienko które wyłapuje wszystkie uszkodzone linki, a po zakończeniu dodawania wyświetla się.
LinkList to memo do którego użytkownik wrzuca linki (w formie listy).
Main list to ListView z linkami, które dostały doń dodane, jeżeli są poprawne.
{Check is ON} //została wybrana opcja by sprawdziło linki przed dodaniem do listy.
begin
{Preparation}
WIPWindow.Checked.Caption:='0';
WIPWindow.Proper.Caption:='0';
WIPWindow.Broken.Caption:='0';
FoundErrorsWindow.ErrorList.Clear;
for I:=0 to LinkList.Lines.Count-1 do
begin
{Preparation}
Box.Clear;
Code:=0;
WIPWindow.CheckBar.MaxValue:=LinkList.Lines.Count-1;
{Canceled}
if BRK=True then
begin
MainWindow.MainList.Clear;
FoundErrorsWindow.ErrorList.Clear;
Break;
end;
//poniższy kod sprawdza czy wrzucony przez użytkownika link spełnia wymagania. Jeżeli tak to stara się "wymuskać" własciwy link. Dlaczego tak? Bo np. przed linkiem może znajdować się spacja, albo jakieś niepotrzebne rzeczy, wtedy zostaną obcięte
if Pos('http://rapidshare.com', LinkList.Lines.Strings[I])>0 then
begin
P:=Pos('http://rapidshare.com', LinkList.Lines.Strings[I]);
Link:=Copy(LinkList.Lines.Strings[I],P,Length(LinkList.Lines.Strings[I]));
Checker:=THttpSend.Create;
Checker.HTTPMethod('GET', Link);
Checker.Document.SaveToFile(Dir+'\Data\Link.htm');
Code:=Checker.ResultCode;
Checker.Free;
//ta część odczytuje kod operacji i sprawdza co właśnie zaszło, w tym przypadku źródło zostało odczytane poprawnie.
{Link Readed}
if Code=200 then
begin
Box.Items.LoadFromFile(Dir+'\Data\Link.htm');
//a to mój prosty sposób na sprawdzenie czy plik został usuniety. Dobry plik zawiera w 134 linijce podany rozmiar w kilobajtach. Zły link, nawet nie ma tylu linijek... Przy okazji pobiram sobie rozmiar pliku.
{File has been found}
if Box.Items.Count>134 then
begin
Line:=Box.Items.Strings[134];
Box.Clear;
ExtractStrings(['|'],[],Pchar(Line),Box.Items);
Line:=Box.Items.Strings[1];
Box.Clear;
ExtractStrings(['<'],[],Pchar(Line),Box.Items);
Line:=Copy(Box.Items.Strings[0],2,Length(Box.Items.Strings[0])-4);
Box.Clear;
FSize:=StrToInt(Line);
if FSize>=1048576 then FSize:=FSize div 1048576 else FSize:=FSize div 1024;
ExtractStrings(['/'],[],Pchar(Link),Box.Items);
FName:=Box.Items.Strings[Box.Items.Count-1];
Ext:=ExtractFileExt(FName);
{to bardziej skomplikowane, każdy plik w ListView ma swoją ikonę odpowiadającą jego rozszerzeniu. Ikony są dodawane do ImageList w locie, więc zapisuję rozszerzenia które już mam, dzięki temu nie będe miał po kilka razy tych samych ikon).
{Check extension list}
if Pos(Ext,MainWindow.ExtList.Text)>0 then
begin
for N:=0 to MainWindow.ExtList.Lines.Count-1 do
if MainWindow.ExtList.Lines.Strings[N]=Ext then IconIndex:=N;
end else
begin
FIcon:=TIcon.Create;
BMP:=TBitmap.Create;
BMP.Width:=16;
BMP.Height:=16;
MainWindow.ExtList.Lines.Add(Ext);
IconIndex:=MainWindow.ExtList.Lines.Count-1;
Box.Items.SaveToFile(Dir+'Data\Icon'+Ext);
try
GetIconFromFile(Dir+'Data\Icon'+Ext,FIcon,SHIL_SYSSMALL);
BMP.Canvas.Draw(0,0,FIcon);
MainWindow.FileIcon.Add(BMP,nil);
finally
DeleteFile(Dir+'Data\Icon'+Ext);
FIcon.Free;
BMP.Free;
end;
end;
{Add to list}
Delete(FName,Length(FName)-Length(Ext)+1,Length(Ext));
LI:=MainWindow.MainList.Items.Add;
LI.Caption:=FName;
LI.SubItems.Add(FloatToStrF(FSize, ffNumber, 32, 2)+' MB');
LI.SubItems.Add('');
{Gauge}
Gauge:=TsGauge.Create(nil);
Gauge.Parent:=MainWindow.MainList;
LI.Data:=Gauge;
Gauge.Left:=491;
Gauge.Height:=14;
Gauge.Top:=LI.Top+1;
Gauge.Width:=52;
Gauge.SkinData.SkinManager:=MainWindow.sSkinManager7;
Gauge.Progress:=0;
Gauge.Show;
LI.SubItems.Add(' ');
LI.SubItems.Add(' ');
LI.SubItems.Add('In queue');
LI.SubItems.Add(Copy(Ext,2,Length(Ext)));
LI.SubItems.Add(IntToStr(0));
LI.SubItems.Add(IntToStr(IconIndex));
LI.SubItems.Add('YES');
LI.SubItems.Add(Link);
LI.StateIndex:=0;
LI.ImageIndex:=IconIndex;
{Progress} //ustawia parametry w WIPWidnow żeby użytkownik widział co sie dzieje.
Application.ProcessMessages;
WIPWindow.Checked.Caption:=IntToStr(I)+'/'+IntToStr(A);
WIPWindow.Proper.Caption:=IntToStr(MainWindow.MainList.Items.Count-1);
WIPWindow.CheckBar.Progress:=I;
end else
{File removed} //Źródło ma mniej niż 134 linijki, czyli adres jest poprawny, ale plik został skasowany.
begin
ELI:=FoundErrorsWindow.ErrorList.Items.Add;
ELI.Caption:=Link;
ELI.StateIndex:=4;
{Progress}
Application.ProcessMessages;
WIPWindow.Broken.Caption:=IntToStr(FoundErrorsWindow.ErrorList.Items.Count);
WIPWindow.CheckBar.Progress:=I;
end;
end;
{Connection or link error} //500 oznacza że albo link jest zepsuty, albo nie ma połączenia z netem - trzeba to zbadać. W tym celu powtarzam operację, ale dla jakiegoś "niezniszczalnego" serwisu. Ja wybrałem www.yahoo.com
if Code=500 then
begin
ErrorCode:=0;
Checker:=THttpSend.Create;
Checker.HTTPMethod('GET', 'http://www.yahoo.com/');
ErrorCode:=Checker.ResultCode;
Checker.Free;
{No connection} //Yahoo zwraca 500, nie ma neta
if ErrorCode=500 then
begin
ShowMessage('Chyba nie masz neta');
FoundErrorsWindow.ErrorList.Clear;
MainWindow.MainList.Clear;
Break;
end;
{Link is broken} //Yahoo zrwca 200, link był zły
if ErrorCode=200 then
begin
ELI:=FoundErrorsWindow.ErrorList.Items.Add;
ELI.Caption:=Link;
ELI.StateIndex:=4;
{Progress}
Application.ProcessMessages;
WIPWindow.Broken.Caption:=IntToStr(FoundErrorsWindow.ErrorList.Items.Count);
WIPWindow.CheckBar.Progress:=I;
end;
end;
end;
if FileExists(Dir+'\Data\Link.htm') then DeleteFile(Dir+'\Data\Link.htm');
Application.ProcessMessages;
WIPWindow.Checked.Caption:=IntToStr(I)+'/'+IntToStr(A);
end;
end;
Kod działa, ale problem jest taki że program czasem się zawiesza - nie wiem dlaczego. Wrzucam do sprawdzenia 100 linków to działa OK. Wrzucam 300 to przy 5 linku program przestaje odpowiadać... Jakieś pomysły?