* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Novembre 24, 2024, 12:14:38 pm

Inserisci il nome utente, la password e la durata della sessione.

53 Visitatori, 0 Utenti

Autore Topic: [RISOLTO] Verificare aggiornamento programma  (Letto 2933 volte)

antoniog

  • Scrittore
  • Sr. Member
  • *****
  • Post: 257
  • Karma: +0/-0
    • Informatica Utile
[RISOLTO] Verificare aggiornamento programma
« il: Marzo 25, 2021, 11:50:21 pm »
Buonasera,
ho in archivio due programmi gestionali da me scritti con Lazarus, aggiornato alla ver. 2.0.6, vorrei verificare all'avvio dei programmi se ci sono degli aggiornamenti nel mio sito web, quindi con collegamento al mio sito ed analisi delle cartelle e dei file di download ed eventuale segnalazione all'utente, ma non so da dove cominciare, qualcuno può aiutarmi?
« Ultima modifica: Marzo 28, 2021, 07:38:46 pm da antoniog »
avrai solo la libertà che riuscirai a conquistarti e anche questa sarà incerta.

schumi

  • Full Member
  • ***
  • Post: 220
  • Karma: +1/-0
Re:Verificare aggiornamento programma
« Risposta #1 il: Marzo 26, 2021, 08:34:47 am »
il sistema più semplice è creare un eseguibile stile "launcher" che come prima cosa controlla dal sito l'ultima versione,
se non ci sono aggiornamenti lancia l'eseguibile principale del gestionale, se invece trova un aggiornamento lo scarica e applica (da valutare se con una richiesta dell'utente).
Ci sono varie strade su come scaricare un pacchetto di aggiornamento, FTP, HTTP, drive, ecc ognuno valido.

ciao

bonmario

  • Hero Member
  • *****
  • Post: 1360
  • Karma: +11/-1
Re:Verificare aggiornamento programma
« Risposta #2 il: Marzo 26, 2021, 10:25:03 am »
Oltre a quanto scritto da "schumi", potresti anche valutare il fatto di far uscire un messaggio all'utente con cui gli dici che c'è un nuovo aggiornamento, poi decide lui quando caricarlo.

Io anni fa', avevo fatto una cosa simile:
- sul mio sito, nella directory "download" c'era uno zip per ogni mio programma
- nel mio programma avevo messo un bottone "verifica aggiornamenti"
- cliccandoci sopra, mi collegavo al mio sito e reperivo la data di ultima modifica dello zip
- se tale data era superiore rispetto a quella del .exe del io programma, gli segnalavo che c'era un aggiornamento disponibile.

Se invece vuoi fare qualcosa di più fine e che però ti comporta anche più manutenzione, potresti fare così:
- sul tuo sito metti un file txt in cui, in ogni riga scrivi: nome eseguibile, ultima versione, elenco modifiche
- dal tuo eseguibile scarichi questo file, e reperisci le info dell'eseguibile. Se la versione attuale è inferiore rispetto a quella letta dal file di testo, procedi con l'aggiornamento e/o la segnalazione all'utente

Ciao, Mario

antoniog

  • Scrittore
  • Sr. Member
  • *****
  • Post: 257
  • Karma: +0/-0
    • Informatica Utile
Re:Verificare aggiornamento programma
« Risposta #3 il: Marzo 27, 2021, 01:43:08 pm »
Grazie per le risposte ma prima dovrei scrivere qualcosa che mi consenta di collegarmi al mio sito, quindi quale pacchetto installare e vedere qualche esempio. Ho provato ad utilizzare le istruzioni di Maverich che sono del dicembre 2011, Indy gestiore server FTP lato Client
 ma mi vengono segnalati molti errori
avrai solo la libertà che riuscirai a conquistarti e anche questa sarà incerta.

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1400
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Verificare aggiornamento programma
« Risposta #4 il: Marzo 27, 2021, 02:28:09 pm »
Ti posto un pezzo di codice da cui partire, l'ho buttato giu senza neanche testarlo quindi và rifinito (gestione degli errori, .....)

Spero ti sia di aiuto.

Codice: [Seleziona]

procedure Download_FTP(NomeFile: string, NomeHost, NomeUtente, PassworUtente: string);
var
  tempStream: TFileStream;
  IdFTP: TIdFtp;
begin
  try
tempStream:= TFileStream.create(NomeFile, fmCreate)
IdFTP := TIdFtp.create(self);
    with IdFTP do begin
      Host:= NomeHost;
      Username:= NomeUtente;
      Password:= PassworUtente;
    end
    IdFtp.Connect(true, 1500)
    IdFtp.Passive:= true;
    IdFtp.ChangeDir('/Ripositorio');       //Qui devi indicare la direcotry remota da cui scaricare il file
    IdFtp.Get(NomeFile, tempStream, false);
    //Se vuoi vedere quanto hai scaricato: ShowMessage(IdFtp.size(NomeFile).toString));
  finally
    tempStream.Free;
    IdFtp.Quit;
    IdFtp.Free;
  end; 
end;


Saluti
« Ultima modifica: Marzo 27, 2021, 02:41:02 pm da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1400
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Verificare aggiornamento programma
« Risposta #5 il: Marzo 27, 2021, 02:37:48 pm »
Quella è un piccola procedura per scaricare (download) di un file tramite FTP.

Se vuoi fare un client completo (me non ne vedo la necessità per la tua applicazione) la cosa è più complessa. Giusto per capire la funzionalità di un client ftp prova a scaricarti FileZilla https://filezilla-project.org/.

Ciao
 
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

antoniog

  • Scrittore
  • Sr. Member
  • *****
  • Post: 257
  • Karma: +0/-0
    • Informatica Utile
Re:Verificare aggiornamento programma
« Risposta #6 il: Marzo 27, 2021, 03:14:56 pm »

Ciao DragoRosso, grazie per la dritta, proverò e faro sapere. Mi serve anche verificare nella directory /miosito/download l'eventuale presenza di una versione (nome file) aggiornata.
FileZilla lo uso da sempre per caricare file sui vari siti web da me realizzati, è ottimo ma in questo caso non mi serve.

avrai solo la libertà che riuscirai a conquistarti e anche questa sarà incerta.

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1400
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Verificare aggiornamento programma
« Risposta #7 il: Marzo 27, 2021, 03:55:34 pm »
Dopo il "connect" e il "ChangeDir" puoi usare la funzione List per caricare in una lista di stringhe il contenuto della directory.
La dichiarazione var è da aggiungere ovviamente nella sezione apposita della procedura.

In Elenco dovresti avere un lista di stringhe che corrispondono al contenuto della tua direcotry remota.

Codice: [Seleziona]

var Elenco: TStringList;
begin
  Elenco := TSringList.Create;
  IdFTP.List(Elenco, '', false);
 // ..... fai qualcosa
 Elenco.Free;
end;

:) Ogni alba è un regalo, ogni tramonto è una conquista :)

antoniog

  • Scrittore
  • Sr. Member
  • *****
  • Post: 257
  • Karma: +0/-0
    • Informatica Utile
Re:Verificare aggiornamento programma
« Risposta #8 il: Marzo 28, 2021, 06:54:12 pm »
DragoRosso, grazie per i tuoi suggerimenti che mi sono stati molto utili.
Prendendo spunti da varie parti h
o scritto una procedura che all'attivazione della form verifica se ci sono aggiornamenti, . La procedura funziona anche se al momento verifica l'esistenza di un file e chiede se si vuole scaricarlo.  La verifica corretta dovrebbe essere sulle date di compilazione fra il programma in uso e il file da scaricare, se la data di compilazione del file da scaricare è successiva a quella del programma in uso verrà avanzata la richiesta di download. Posto il programma
Codice: [Seleziona]
unit Unit1;


{$mode objfpc}{$H+}


interface


uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, StdCtrls,
  Buttons, ExtCtrls, CodyCtrls, IdTCPClient, IdFTP, IdFTPCommon;


type


  { TForm1 }


  TForm1 = class(TForm)
    IdFTP1: TIdFTP;
    IdTCPClient1: TIdTCPClient;
    LbDirectory: TListBox;
    SaveFile: TSaveDialog;
    procedure ConnettiServerFTP;
    procedure FormActivate(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure Download_FTP(NomeFile: string);
    procedure ListafileFTP;
  private


  public


  end;


var
  Form1: TForm1;
  mDir: string = '/public_html/gescomp/download/' ;
  sRootDirFTP : string;
implementation


{$R *.lfm}
procedure TForm1.ConnettiServerFTP;
var sMesg: string;
    bEsito: Boolean;
    FLastDirStack : TStringList;
    tempStream: TFileStream;
    IdFTP: TIdFtp;
begin
   sMesg := 'L''aggiornamento non è andato a buon fine, riprova più tardi..';


   //Test Client su Server
   bEsito := False;


   idTCPClient1.Host := 'ftp.xxxxxxxx.xx';
   idTCPClient1.Port := 21; //porta per comuicare con il server FTP
   //un test per verificare se il servizio Host risponde
   try
   idTCPClient1.Connect;


     try
       IdTCPClient1.IOHandler.WriteLn('Client message');
       //Self.Caption := IdTCPClient1.IOHandler.ReadLn;
     finally
       IdTCPClient1.Disconnect;
       bEsito := True;
     end;


   except
     ShowMessage(sMesg);
     IdTCPClient1.Disconnect;
   end;


  //se il server ha risposto possiamo procedere
  if bEsito  then
    begin


      IdFTP1.Host := 'ftp.xxxxxxxx.xx';
      IdFTP1.Port := 21;


      try
        //utilizzate il vostro account per accedere al server FTP
        IdFTP1.Username := 'xxxxxxxxxx';
        IdFTP1.Password := 'xxxxxxxxxx';


        //per utilizzare la modalita ftBinary dovete aggiungere
        //nelle uses la unit IdFTPCommon


        IdFTP1.TransferType := ftBinary;
        if IdFTP1.Connected then IdFTP1.Disconnect;
        IdFTP1.Connect;
         IdFtp1.Passive:= true;
         IdFtp1.ChangeDir(mDir);
        FLastDirStack := TStringList.Create;
        FLastDirStack.Clear;


        sRootDirFTP := IdFTP1.RetrieveCurrentDir; //memorizziamo la directory radice
        IdFTP1.List;
        //DisplayFTP;
        ListafileFTP;
      except
        ShowMessage(sMesg);
        IdFTP1.Disconnect;
      end;
    end;
end;


procedure TForm1.FormActivate(Sender: TObject);
begin
  ConnettiServerFTP;
end;


procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  IdTCPClient1.Disconnect;
end;




procedure TForm1.ListafileFTP;
var i, c : Integer;
    s : String;
   Lista: TStringList;
begin
  Lista := TStringList.Create;
  IdFTP1.List(Lista ,'',false);
  //DMPcopia.ZDati.GetTableNames('', Lista);
  For c:= 0 to Lista.Count-1  do
    begin
      s := lista[c];
      i := IdFTP1.Size(s);
      if s='Aggiorna_Gescomp.exe' then
               if  MessageDlg('c''è un aggiornamento, vuoi scaricarlo?', mtConfirmation, mbYesNo, 0) = mrYes then
                  Download_FTP(s) else IdTCPClient1.Disconnect;
    end;
 Lista.Free;
end;


procedure TForm1.Download_FTP(NomeFile: string);
var i, iDimFile : Integer;
    ext, s : String;
    b : boolean;
begin
  Screen.Cursor := crHourGlass;
  i := lbDirectory.ItemIndex;
      s := nomefile;
      i := IdFTP1.Size(s);
       // 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);


                IdFTP1.TransferType := ftBinary;


              if b then
                IdFTP1.Get(s, SaveFile.FileName, True, IdFTP1.ResumeSupported);
            end;
 Screen.Cursor := crDefault;
 IdTCPClient1.Disconnect;
end;




end.



avrai solo la libertà che riuscirai a conquistarti e anche questa sarà incerta.

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1400
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Verificare aggiornamento programma
« Risposta #9 il: Marzo 28, 2021, 07:02:29 pm »
Sono contento di esserti stato utile.
Solo un ultimo consiglio, invece delle date di compilazione, su cui ci possono essere false interpretazioni (dipende dal file system, dal paese, etc...) ti consiglio di evidenziare il file presente sul server (Aggiorna_Gescomp.exe) con i dati di release per esempio:

Aggiorna_Gescomp_xx.exe

dove xx è un numero progressivo.

Così è più chiaro, e potrai mantenere anche diverse versioni sul server (ad esempio se devi fare degli aggiornamenti incrementali).

Saluti
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

antoniog

  • Scrittore
  • Sr. Member
  • *****
  • Post: 257
  • Karma: +0/-0
    • Informatica Utile
Re:Verificare aggiornamento programma
« Risposta #10 il: Marzo 28, 2021, 07:38:09 pm »
DragoRosso, grazie. Penserò come organizzarmi per le ver. incrementali.
Al momento ho riscritto la procedura sulla verifica della data di compilazione, sarà da sostituire la precedente procedura
Citazione
TForm1.ListafileFTP
con la seguente e a questo punto posso mettere [RISOLTO]
Codice: [Seleziona]
procedure ListafileFTP;
var i, c : Integer;
    s,f,o : String;
   Lista: TStringList;
   Sd, Sf : TDateTime;
   fa : Longint;
begin
  try
     {$IFDEF WINDOWS}
       fa:=FileAge(Application.Location+'Gescomp.exe');
        f:='Aggiorna_Gescomp.exe'
     {$ENDIF$}
      {$IFDEF LINUX}
       fa:=FileAge(Application.Location+'Gescomp');
        f:='Aggiorna_Gescomp.zip';
      {$ENDIF$}
     If Fa<>-1 then
        begin
          Sd:=FileDateTodateTime(fa);
          //showmessage('I''m from : '+DateTimeToStr(Sd));
        end;
  Lista := TStringList.Create;
  GescompF.IdFTP1.List(Lista ,'',false);
  For c:= 0 to Lista.Count-1  do
    begin
      s := lista[c];
      i := GescompF.IdFTP1.Size(s);
      Sf:= GescompF.IdFTP1.FileDate(s);
      if s=f then
         begin
           //showmessage('data su pc : '+DateTimeToStr(Sd)+' data sul sito : '+DateTimeToStr(Sf));
           if (Sd<Sf) then
               if  MessageDlg('c''è un aggiornamento, vuoi scaricarlo?', mtConfirmation, mbYesNo, 0) = mrYes then
                  Download_FTP(s) else GescompF.IdTCPClient1.Disconnect;
           exit;
         end;
    end;
  finally
     Lista.Free;
     GescompF.IdTCPClient1.Disconnect;
  end;



end;         
« Ultima modifica: Marzo 29, 2021, 04:03:54 am da antoniog »
avrai solo la libertà che riuscirai a conquistarti e anche questa sarà incerta.

 

Recenti

How To

Utenti
  • Utenti in totale: 803
  • Latest: maXim.FI
Stats
  • Post in totale: 19182
  • Topic in totale: 2288
  • Online Today: 97
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 53
Total: 53

Disclaimer:

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.