Written by Maverichposted in Lazarus 1.0 Dicembre 08, 2011, 11:43:00 am21973 ViewsRating: 0 (0 Rates)Print
queste note si riferiscono ai componenti Indy
utilizzare il package Indy dal pannello IndyClients Core utilizzare il componente TCP - sul form IdTCPClient1 dal pannello IndyClients Protocols (am) utilizzare il componente TIdFTP - sul form IdFTP1
in un Form inserite - controllo TTreeView e assegnate nell'ObjectInspector Name = TVFolder - controllo TListBox e assegnate nell'ObjectInspector Name = LbDirectory - sRootDirFTP: string;
//connessione al server procedure TForm1.ConnettiServerFTP; var sMesg: string; bEsito: Boolean; begin sMesg := 'Il Server FTP non risponde';
//Test Client su Server bEsito := False;
//questo per ALice.it , //se usate invece un server su Host inserire l'indirizzo del server es: 62.211.68.45
idTCPClient1.Host := 'ftp.webalice.it'; idTCPClient1.Port := 21; //porta per comuicare con il server FTP //un test per verificare se il servizio Host risponde try idTCPClient1.Connect;
//legge e visualizza Directory presenti nel server FTP procedure TForm1.DisplayFTP; var i, c : Integer; s : String; begin lbDirectory.Items.Clear; IdFTP1.List(lbDirectory.Items, '', false);
TvFolder.Items.Clear;
for c := 0 to lbDirectory.Items.Count -1 do begin s := lbDirectory.Items[c]; i := IdFTP1.Size(s); if i = -1 then TvFolder.Items.Add(nil, s); // Directory end; end;
il componente IdFTP ha degli eventi che possono essere utilizzati per avere un controllo sullo stato di avanzamento del file.
IdFTP1.OnWorK
FTPWork(ASender, AWorkMode, AWorkCount);
IdFTP1.WorkBegin - chiamata all'inizio del trasferimento
//iDimFile dovra' essere Int64 e non Int -> iDimFile: Int64; if AWorkMode = wmRead then AWorkCountMax := iDimFile; FTPWorkBegin(ASender, AWorkMode, AWorkCountMax);
IdFTP1.WorkEnd
FTPWorkEnd(ASender, AWorkMode);
per scaricare un file dal server usate la funzione Get IdFTP1.Get(s, SaveFile.FileName, True, IdFTP1.ResumeSupported);
procedure Tfrm_AccessoRemoto.act_DownloadExecute(Sender: TObject); var i : Integer; ext, s : String; b : boolean; begin i := lbDirectory.ItemIndex; if i <> -1 then begin s := lbDirectory.Items[i]; i := IdFTP1.Size(s); iDimFile := i; if i = -1 then CambioFTPDir(s) // Directory else begin // File ext := ExtractFileExt(s); SaveFile.Filter := ext + ' files|*' + ext + '|All Files|*.*'; SaveFile.FileName := s; if SaveFile.Execute then begin b := true; if FileExists(SaveFile.FileName) then if MessageDlg('File già presente : sovrascrivere ?', mtWarning, [mbYes,mbNo], 0) = mrYes then DeleteFile(SaveFile.FileName);
{if ASCIIText1.Checked then FTP.TransferType := ftASCII else} IdFTP1.TransferType := ftBinary;
if b then IdFTP1.Get(s, SaveFile.FileName, True, IdFTP1.ResumeSupported); end; end; end else MessageDlg('Il file da scaricare non è stato selzionato', mtWarning, [mbOK], 0); end;
per Inviare al Server usate la funzione Put IdFTP1.Put(OpenFile.FileName, ExtractFileName(OpenFile.FileName));
[/code] procedure Tfrm_AccessoRemoto.act_UploadExecute(Sender: TObject); begin //utilizzata la unit Dialogs per scgliere il file if OpenFile.Execute then begin IdFTP1.TransferType := ftBinary; IdFTP1.Put(OpenFile.FileName, ExtractFileName(OpenFile.FileName)); DisplayFTP; end; end; [/code]
per cambiare Directory , attivate nel TVFolder (TTreeView), l'evento OnDblClick, in modo da poter cambiare.
//evento doppio click sul TTreeView (TVFolder) procedure Tfrm_AccessoRemoto.TvFolderDblClick(Sender: TObject); var i : Integer; s : String; begin inherited;
if Assigned(TvFolder.Selected) then lbDirectory.ItemIndex := lbDirectory.Items.IndexOf(TvFolder.Selected.Text); else lbDirectory.ItemIndex := -1;
i := lbDirectory.ItemIndex; if i <> -1 then begin s := lbDirectory.Items[i]; i := IdFTP1.Size(s); if i = -1 then CambioFTPDir(s); // Directory end; end;
//cambia Direcory e visualizza contenuti procedure Tfrm_AccessoRemoto.CambioFTPDir(NewDir: String); begin FLastDirStack.Add(IdFTP1.RetrieveCurrentDir); IdFTP1.ChangeDir(NewDir); //cambio directory DisplayFTP; //visualizza end;
da un qualunque livello per tornare alla radice utilizzare la variabile sRootDirFTP memorizzata al momento della connessione conviene utilizzare la variabile anziche' ChangeDir('\') , non sapendo a priori quale Directory il server utilizzera' come Root
Written by Maverichposted in Lazarus 1.0 Dicembre 07, 2011, 06:58:00 pm21653 ViewsRating: 0 (0 Rates)Print
in Delphi utilizzando JvBackground (Librerie Jedi), si risolve il problema; in Lazarus si puo' ottenere lo stesso effetto con un minimo di ingegno;
in base alle dimensioni della BitMap si calcola quante volte puo' essere scritta nel Form (ClientWidth e ClientHeight)
si utilizzano 2 Array di tipo TImage BmpX: array[0..1300] of TImage; // per il Form BmpT: array[0..50] of TImage; // per il Panel
nel form si utilizza un TImage e si carica un'immagine/logo da un file (Image1) scriveremo una procedure DisegnaBmp ed una EliminaArrayBmp (presenti in fondo al testo)
vediamo passo passo come costruire:
calcoliamo il numero di volte che il Form puo' contenere la BitMap in orizzontale
// numero Colonne i := 0; iNumImg := 0; while i <= Self.ClientWidth do begin iNumImg := iNumImg + 1; i := i + Image1.Width; end; iNumColonne := iNumImg;
//Crea TImage per Panel for i := 0 to iNumColonne do begin BmpT[i] := TImage.Create(nil); BmpT[i].Width := Image1.Width; BmpT[i].Height := Image1.Height;
//si assegna alla TImage(n) il contenuto della Image1 inserita sul Form BmpT[i].Picture.Bitmap := Image1.Picture.BitMap; end;
a questo punto basta un ciclo, che visualizzi le Immagini
//Disegna TImage for i := 0 to iNumImg do begin //crea img orizzontali BmpX[i].Left := iPosizioneX; BmpX[i].Top := iPosizioneY; BmpX[i].Parent := Self; BmpX[i].Show;
//nuova posizione orizzontale iPosizioneX := BmpX[i].Left + BmpX[i].Width;
//se Posizione sinistra > Larghezza Client //disegna img verticali if (BmpX[i].Left + Image1.Width) > Self.ClientWidth then begin iPosizioneY := BmpX[i].Top + BmpX[i].Height; iPosizioneX := Image1.Left; end; end;
ad ogni cambio di Dimensioni del Form (Evento OnResize), si eliminano le BitMap create e si ripete il ciclo di disegno
//Elimina tutte le TImage create for i := 0 to iNumImg do BmpX[i].Free;
Cosa analoga si puo' fare per simulare la trasparenza su un TPanel; Si disegnano le BitMap sul TPanel;
Esistono altre tecniche sovrascrivendo il metodo CreateParams dei genitore TWinControl, che pero' non danno sempre i rusltati attesi, spesso per i temi utilizzati (Windows)
//Disegna TImage iPosizioneX := 0; for i := 0 to iNumColonne do begin //crea img orizzontali if i > 0 then iPosizioneX := BmpX[i].Left + BmpX[i].Width; BmpT[i].Left := iPosizioneX; //nuova posizione BmpT[i].Top := 0; BmpT[i].Parent := Panel1; BmpT[i].Show;
//nuova posizione iPosizioneX := BmpT[i].Left + BmpX[i].Width;
ed a fine ciclo si portano in primo piano i vari controlli presenti sul TPanel stesso es:
//Verifica Numero Immagini Vertcali su Form //volendo risparmiare un po' di Bmp (se la Bmp e' piccola) si puo' cambiare la posizione Verticale di partenza i := 0; //iPosizioneY
iNumImg := 0; while i <= Self.ClientHeight do begin iNumImg := iNumImg + 1; i := i + Image1.Height; end; iNumRighe := iNumImg;
//Verifica Numero Immagini Orizzontali su Form i := 0; iNumImg := 0; while i <= Self.ClientWidth do begin iNumImg := iNumImg + 1; i := i + Image1.Width; end; iNumColonne := iNumImg;
//Crea TImage for i := 0 to iNumImg do begin BmpX[i] := TImage.Create(nil); BmpX[i].Width := Image1.Width; BmpX[i].Height := Image1.Height; BmpX[i].Picture.Bitmap := Image1.Picture.BitMap; end;
//Crea TImage per Panel for i := 0 to iNumColonne do begin BmpT[i] := TImage.Create(nil); BmpT[i].Width := Image1.Width; BmpT[i].Height := Image1.Height; BmpT[i].Picture.Bitmap := Image1.Picture.BitMap; end;
iPosizioneX := Image1.Left;
//Disegna TImage for i := 0 to iNumImg do begin //crea img orizzontali BmpX[i].Left := iPosizioneX; BmpX[i].Top := iPosizioneY; BmpX[i].Parent := Self; BmpX[i].Show;
//nuova posizione iPosizioneX := BmpX[i].Left + BmpX[i].Width;
//se Posizione sinistra > Larghezza Client //disegna img verticali if (BmpX[i].Left + Image1.Width) > Self.ClientWidth then begin iPosizioneY := BmpX[i].Top + BmpX[i].Height; iPosizioneX := Image1.Left; end; end;
//Disegna TImage iPosizioneX := 0; for i := 0 to iNumColonne do begin //crea img orizzontali if i > 0 then iPosizioneX := BmpX[i].Left + BmpX[i].Width; BmpT[i].Left := iPosizioneX; //nuova posizione BmpT[i].Top := 0; BmpT[i].Parent := Panel1; BmpT[i].Show;
//nuova posizione iPosizioneX := BmpT[i].Left + BmpX[i].Width; end;
procedure TForm1.CheckPulsante(Sender: TObject); var tPulsante: TSpeedButton; X, Y : integer; begin //in base al pulsante setta il PopUpmenu relativo if Sender = SpeedButton1 then begin mnuAttivo := PopUpMenu1; tPulsante := SpeedButton1; //assegna TSpeedButton a tPulsante end else if Sender = SpeedButton2 then begin mnuAttivo := PopUpMenu2; tPulsante := SpeedButton2; end else if Sender = SpeedButton3 then begin mnuAttivo := PopUpMenu3; tPulsante := SpeedButton3; end;
if mnuPrecedente = mnuAttivo then begin mnuPrecedente := nil; mnuAttivo.Close; //chiude il menu presente end else begin //fissa posizione pulsante X := tPulsante.ClientOrigin.X;
//per posizionare sotto il pulsante si agginge l'altezza dello stesso Y := tPulsante.ClientOrigin.Y + SpeedButton3.Height; CheckMenuAttivo(mnuAttivo, X, Y); mnuPrecedente := mnuAttivo; end; end;
si va a verificare se il menu visualizzato e' diverso da quello assegnato al Pulsante e si posiziona il Menu con PopUp(X,Y), dove X = posizione orizzontale del Pulsante Y = posizione verticale del Pulsante
Questo blog non rappresenta una testata giornalistica poiché viene
aggiornato senza alcuna periodicità. Non può pertanto considerarsi un
prodotto editoriale ai sensi della legge n. 62/2001.
Questo sito utilizza cookie, anche di terze parti, per offriti servizi in linea con le tue preferenze. Chiudendo questo banner, scorrendo questa pagina, cliccando su un link o proseguendo la navigazione in altra maniera, acconsenti all’uso dei cookie.