Witam,
jak pisałem w innym temacie - przepisuję posty program z Delphi do BCB. Zadanie programu to łączenie się z serwerem FTP i pobieranie listy plików i porozdzielanie ich osobno na listę folderów i osobno na listę katalogów. Jako metodę rozdzielania przyjąłem, że badane jest czy w nazwie pliku jest kropka. Jeśli nie to przyjmuję że jest to katalog a jeśli tak to przyjmuję że jest to plik. Może mało pomysłowe ale zawsze. Ale nie w tym rzecz. Chodzi o to, że w kod w Delphi kompiluje się poprawnie. W BCB również, jednak w BCB przy pobieraniu listy plików pokazuje się bład krytyczny "Access violation". Podejrzewam że źle tworze obiekt FTP ale czekam na Wasze propozycje. Zamieszczam kod Delphi i przetłumaczony przeze mnie kod CPP:
procedure TForm1.Button1Click(Sender: TObject);
var
i, j:integer;
mamKropke: boolean;
ListaFTP, ListaPlikow, ListaKatalogow: TStringList;
FTP: TIdFTP;
begin
ListaFTP := TStringList.Create;
ListaPlikow := TStringList.Create;
ListaKatalogow := TStringList.Create;
FTP := TIdFTP.Create(nil);
FTP.Host := 'host';
FTP.Username := 'username';
FTP.Password := 'password';
FTP.Passive := true;
FTP.Connect;
if ftp.Connected = true then
begin
ShowMessage('Polaczylem sie');
ftp.List(ListaFTP, '', false);
end
else
begin
ShowMessage('Nie polaczylem sie');
end;
FTP.Free;
mamKropke := false;
for i := 0 to listaftp.Count-1 do
begin
for j := 0 to length(listaFTP.Strings[i]) do
begin
if (listaFTP.Strings[i][j] = '.') then
begin
mamKropke := true;
ListaPlikow.Add(listaFTP.Strings[i]);
mamkropke := false;//jak juz umieszcze na liscie to zmieniam zmienna
break;
end;
if (j = length(listaFTP.Strings[i])) and (mamKropke = false) then //jesli wciaz nie ma kropy a robie teraz ostatnia literke to...
begin
ListaKatalogow.Add(listaFTP.Strings[i]);
end;
end;
end;
Katalogi.Text := ListaKatalogow.Text;
Pliki.Text := ListaPlikow.Text;
ListaFTP.Free;
ListaPlikow.Free;
ListaKatalogow.Free;
i kod CPP:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//zmienne lokalne:
bool mamKropke;
TStringList *ListaFTP = new TStringList;
TStringList *ListaPlikow = new TStringList;
TStringList *ListaKatalogow = new TStringList;
TIdFTP *FTP = new TIdFTP (this);
FTP->Host = "host";
FTP->Username = "username";
FTP->Password = "password";
FTP->Passive = true;
try
{
FTP->Connect();
if (FTP->Connected())
{
ShowMessage("Połączono!");
FTP->List(ListaFTP, "", false);
}
else
{
ShowMessage("Nie udało mi się połączyc!");
}
}
catch (Exception &VCLException)
{
throw new Exception("Błąd o kodzie: " + VCLException.Message);
};
FTP->Free();//juz nie bedziesz potrzebny :)
mamKropke = false;
for (int i = 0; ListaFTP->Count-1; i++)
{
for (int j = 0; ListaFTP->Strings[i].Length(); j++)
{
if (ListaFTP->Strings[i][j] == '.') //tutaj wpisujesz w apostrofach
{
mamKropke = true;
ListaPlikow->Add(ListaFTP->Strings[i]);
mamKropke = false;
break;
}
if ((j == ListaFTP->Strings[i].Length()) && (mamKropke == false))
{
ListaKatalogow->Add(ListaFTP->Strings[i]);
}
}
}
katalogi->Text = ListaKatalogow->Text;
pliki->Text = ListaPlikow->Text;
ListaFTP->Free();
ListaPlikow->Free();
ListaKatalogow->Free();
}
Jest jeszcze coś. Po odinstalowaniu BCB gdy uruchamiałem plik EXE skompilowany w BCB, pokazuje mi się komunikat o tytule
"Project1.exe - Nie można znaleźć składnika"
i treści
"Uruchomienie tej aplikacji nie powiodło się, ponieważ nie znaleziono vcl.bpl. Ponowne zaistaowanie aplikacji może naprawić ten problem"
dlaczego tak się dzieje? Czy to znaczy, ze jak napisze w BCB program to na innym komputerze bez BCB go nie uruchomie? Mozna jakos to wylaczyc?
Pozdrawiam!