IdFTP i obsługa wątków.

Sharow

Użytkownik
Dołączył
Wrzesień 12, 2008
Posty
42
Witam, mam problem z moim programem. A mianowicie program łączy się z FTP (IdFtp) i wszystko gra tak samo przy pobieraniu pliku z internetu (URLDownloadToFile) jaki i wysyła go na FTP (IdFTP.Put) lecz czy przy pobieraniu lub wysyłaniu program się zawiesza a gdy wykona swoją funkcję wyśle/pobierze działa poprawnie. Poczytałem o komponencie IdThreadComponent który daje efekt wątkowości. Więc też ładnie to dodałem do kodu i przy pobieraniu już się nie wiesza lecz jak bym nie dodał wysyłania na FTP program albo się nadal wiesza lub automatycznie po pobraniu wysyła na serwer lub w obu przypadkach nic się nie dzieje. Siedzę na tym od rana i nic. Oto kod programu (jest chaotyczny ale narazie ważne by działał).

Kod:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, Menus, StdCtrls, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdFTP, URLMon, XPMan, INIFiles, IdThreadComponent,
  IdAntiFreezeBase, IdAntiFreeze;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    MainMenu1: TMainMenu;
    Ustawienia1: TMenuItem;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    IdFTP1: TIdFTP;
    XPManifest1: TXPManifest;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button5: TButton;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    ProgressBar1: TProgressBar;
    Button6: TButton;
    GroupBox3: TGroupBox;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label5: TLabel;
    Label11: TLabel;
    Button7: TButton;
    Edit8: TEdit;
    ProgressBar2: TProgressBar;
    Label12: TLabel;
    Label13: TLabel;
    IdThreadComponent1: TIdThreadComponent;
    Label14: TLabel;
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure IdFTP1Connected(Sender: TObject);
    procedure IdFTP1Disconnected(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure IdThreadComponent1Run(Sender: TIdCustomThreadComponent);
    procedure Button2Click(Sender: TObject);
    procedure IdFTP1Status(ASender: TObject; const AStatus: TIdStatus;
      const AStatusText: String);
    








  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button3Click(Sender: TObject);
begin
IdFTP1.Host:=Edit1.Text;
IdFTP1.Username:=Edit2.Text;
IdFTP1.Password:=Edit3.Text;
if not IdFTP1.Connected then
IdFTP1.Connect();
if Button2.Enabled=false then Button2.Enabled:=true else Button2.Enabled:=true;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
if IdFTP1.Connected then
IdFTP1.Disconnect;
if Button2.Enabled=true then Button2.Enabled:=false else Button2.Enabled:=false;
end;

procedure TForm1.IdFTP1Connected(Sender: TObject);
begin
MessageBox(Handle, 'Połączono z serwerem!', 'Simple Setup WordPress', MB_OK or MB_ICONINFORMATION);
end;

procedure TForm1.IdFTP1Disconnected(Sender: TObject);
begin
MessageBox(Handle, 'Odłączono od serwera!', 'Simple Setup WordPress', MB_OK or MB_ICONINFORMATION);
end;

procedure TForm1.Button5Click(Sender: TObject);
var
INI : TINIFile;
begin
INI := TINIFile.Create(ExtractFilePath(Application.ExeName) + 'ssw.ini'); // stworz plik INI na dysku C
try
INI.WriteString('Host', 'Ip', Edit1.Text);
INI.WriteString('User', 'Nazwa', Edit2.Text);
INI.WriteString('Password', 'Hasło', Edit3.Text);
INI.WriteString('Port', 'Port', Edit8.Text);
finally
INI.Free;
end;
end;

procedure TForm1.Button7Click(Sender: TObject);
var
INI : TINIFile;

begin
INI := TINIFile.Create(ExtractFilePath(Application.ExeName) + 'ssw.ini');
try
    Edit1.Text := INI.ReadString('Host', 'Ip','plik INI nie istnieje');
    Edit2.Text := INI.ReadString('User', 'Nazwa','plik INI nie istnieje');
    Edit3.Text := INI.ReadString('Password', 'Hasło','plik INI nie istnieje');
    Edit8.Text := INI.ReadString('Port', 'Port','plik INI nie istnieje');
finally
INI.Free;
end;
end;




procedure TForm1.Button1Click(Sender: TObject);
begin
IdThreadComponent1.Start;
end;

procedure  TForm1.Button2Click(Sender: TObject);
begin
IdThreadComponent1.Start;
end;

procedure TForm1.IdThreadComponent1Run(Sender: TIdCustomThreadComponent);
begin
if
URLDownloadToFile(Nil,'http://pl.wordpress.org/wordpress-3.1.1-pl_PL.zip','c:wordpress-3.1.1-pl_PL.zip',0,Nil)<=3 then
MessageBox(Handle, 'Pobrano oprogramowanie WordPress. Opragramowanie gotowe do instalacji!', 'Simple Setup WordPress', MB_OK or MB_ICONINFORMATION);
if
URLDownloadToFile(Nil,'http://pl.wordpress.org/wordpress-3.1.1-pl_PL.zip','c:wordpress-3.1.1-pl_PL.zip',0,Nil)<>0 then
MessageBox(Handle, 'Błąd przy pobieraniu!', 'Simple Setup WordPress', MB_OK or MB_ICONEXCLAMATION);
IdThreadComponent1.Stop;
begin
IdFTP1.Put('C:\Users\Michał\Pictures\wordpres\wordpress-3.1.1-pl_PL.zip', 'wordpress-3.1.1-pl_PL.zip');
IdThreadComponent1.Stop;
end;
end;



procedure TForm1.IdFTP1Status(ASender: TObject; const AStatus: TIdStatus;
  const AStatusText: string);
begin
Label14.Caption:= AStatusText;
end;

end.

Dodam że nie do końca znam się na Delphi. Dopiero się uczę i nie wszystko może być dobrze jak i poprawnie napisane.

Ps. a mam jeszcze takie pytanie jak pod button1 podpiąć progressbar2 żeby wraz ze wzrostem rozmiaru stan progressbara postępował. I jak podpiąć progressbar1 do button2 żeby działał tak jak wyżej. Mile widziane odnośniki do poradników itp.

Ps2. I takie ostatnie pytanko. Jak zauważyliście pewnie zostaje pobierane oprogramowanie wordpress w zip'ie. I teraz pytanie jak to wysłać na serwer rozpakowane aby to już działało albo jak to na serwerze rozpakować zdalnie przez program.

Pozdrawiam.
 

Legalnl

Użytkownik
Dołączył
Październik 8, 2008
Posty
828
żaden komponent, skorzystaj z klasy thread ( http://4programmers.net/Delphi/Kompendium/Rozdział_8 )

pobieraniu pliku z internetu (URLDownloadToFile)
Daj sobie z tym spokuj, i skorzystaj z idhttp. URLDownloadToFile jest beznadziejny i na dodatek nie pobiera najnowszej wersji pliku tylko pobiera ją z cache, więc jak byś chciał tą funkcją pobierać co jakiś czas plik, to zapomnij. Użyj idhttp, tam możesz także podpinać progressbar. Jest to potężny komponent do pobierania, wszystko na nim możesz zrobić co związane z pobieraniem pliku.
 

Sharow

Użytkownik
Dołączył
Wrzesień 12, 2008
Posty
42
Dzięki za odpowiedz. Zabieram się do czytania i wcielania tego w "życie". A macie jakiś pomysł z tym rozpakowaniem i wysłaniem na FTP plików wordpressa?
 

Legalnl

Użytkownik
Dołączył
Październik 8, 2008
Posty
828
najpierw je wyślij w paczce, a co do rozpakowywania to musiałbyś ssh użyć albo napisać jakiś skrypt w php do wypakowywania i podpiąć go pod Twoj program
 

Sharow

Użytkownik
Dołączył
Wrzesień 12, 2008
Posty
42
Aha dzięki za szybką odpowiedz. A da radę zrobić edycję pliku php tak żeby np. wpisywany tekst z edtia zapisywał się w tym pliku w odpowiednim miejscu ? podejrzewam ze jeśli się da to jest to skomplikowane.. Ale nie zaszkodzi jakiś link do artykułu, poradnika. Był bym wdzięczny.

Ps. możesz mnie nakierować lub podać procedurę idhttp którą ściągnę plik? szukam po google 4programmers i konkretnej odpowiedzi nie mogę znaleźć.
 
Ostatnia edycja:

Legalnl

Użytkownik
Dołączył
Październik 8, 2008
Posty
828
Ps. możesz mnie nakierować lub podać procedurę idhttp którą ściągnę plik? szukam po google 4programmers i konkretnej odpowiedzi nie mogę znaleźć.

W to Ci nie wierze, na samym 4p jest tego ze 100, już nie mówiąc o googlach.

Wysyłasz do php odpowiednie zmienne które ustawiają CI jaki plik, co , gdzie kiedy i co chcesz, w programowaniu można wszystko, widze że nie masz zbyt dużej wiedzy więc czytaj czytaj czytaj.
 

Sharow

Użytkownik
Dołączył
Wrzesień 12, 2008
Posty
42
Przeszukałem jeszcze raz znalazłem co nie co a mianowicie mam o to taka procedure niby działa ale plik pojawia się praktycznie zaraz po kliknięciu na button z pełnym rozmiarem.
Kod:
procedure TForm1.Button1Click(Sender: TObject);
var t: TFileStream;
begin
 t := TFileStream.Create(ExtractFilePath(Application.ExeName)+ 'wordpress-3.1.1-pl_PL.zip', fmCreate);
try
   IdHTTP1.HandleRedirects:=true;
   IdHTTP1.Get('http://pl.wordpress.org/wordpress-3.1.1-pl_PL.zip',t);
finally
   t.Free;
end;
end;

Ps. testowałem z innym plikiem i pobiera prawidłowo. A i mam takie pytanie w tym programie zamierzam zrobić info o serwerze wersje php itp. I tak mi się nasuwa myśl czy właśnie dzięki idhttp to zrobię a robił by to tak że na serwerze był by plik php a w nim phpinfo(); i za pomocą idhttp z czytał by zawartość strony do memo a z memo odpowiednie linie wyświetlił w labelach. Dobrze myślę? jak nie to poprawcie mnie.

Ps2 mam już skrypt który działa i rozpakowuje archiwum zip na serwerze.
PHP:
<?php
$zip = new ZipArchive() ;
if ($zip->open("archiwum.zip") !== TRUE) {die ("error!");}
$zip->extractTo("./");
$zip->close();
echo("ok");
?>

I teraz pytanie jak to podpiąć pod mój program ? Głównie chodzi mi o to że przy połączeniu był by wysyłany ten skrypt na serwer a po wysyłaniu archiwum odpalony. Myślę zrobić to tak że po wysłaniu archiwum był by otwierany link do skryptu w web browser dobre by było takie rozwiązanie?
 
Ostatnia edycja:
Do góry Bottom