IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Aide pour la structure d'un objet


Sujet :

Delphi

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2016
    Messages : 8
    Points : 1
    Points
    1
    Par défaut Aide pour la structure d'un objet
    bonjour,

    je suis en train de me mettre a la prog objet. le programme marche bien mais je pense pas qu'il soit fait comme il faudrait...

    j'ai fait une class Tftp, qui a grosso modo cette structure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    type Tftp=class
    private
      fHost : string;
      fport : integer;
      fUsername : string;
      fpassword : string;
      frep_racine : string;
      fpassive : boolean;
      ftp : Tidftp;  //indy
    public
      constructor Create(Host,Username,password,rep_racine: string;passive : boolean);
      destructor destroy;
      function connect:boolean;
      function deconnexion:boolean;
      function download(LocalFile,ftpFile:string):boolean;
      function upload(LocalFile,ftpFile:string):boolean;
    end;
    dans mon create je fais ftp := Tidftp.Create(nil);


    après j'ai voulu ajouter le fait du pouvoir se connecter avec indy ou wininet

    j'ai donc modifier la class qui ressemble a celle la:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    type Tftp=class
    strict private
      function connect_indy:boolean;
      function connect_wininet:boolean;
      function deconnexion_wininet:boolean;
      function deconnexion_indy:boolean;
      function download_wininet(LocalFile,ftpFile:string): Boolean;
      function download_indy(LocalFile,ftpFile:string): Boolean;
      function upload_indy(LocalFile,FTPFile:string): Boolean;
      function upload_wininet(LocalFile,ftpFile:string): Boolean;
     
    private
      fHost : string;
      fport : integer;
      fUsername : string;
      fpassword : string;
      frep_racine : string;
      fpassive : boolean;
      ftype_transfert : Ttype_transfert;  // (csIndy, csWininet)
      ftp : Tidftp;  //indy
      hNet, hFTP : HINTERNET;  //wininet
    public
      constructor Create(Host,Username,password,rep_racine: string;passive : boolean);
      destructor destroy;
      function connect:boolean;
      function deconnexion:boolean;
      function download(LocalFile,ftpFile:string):boolean;
      function upload(LocalFile,ftpFile:string):boolean;
    published
      property type_transfert:Ttype_transfert read ftype_transfert write set_type_transfert;
    end;
    par exemple dans la methode dowload, suivant le type de transfert definit, j'appelle la bonne fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function Tftp.download(LocalFile,ftpFile:string):boolean;
    begin
      if ftype_transfert  = csIndy then Result := download_indy(LocalFile,ftpFile)
      else
        if ftype_transfert  = csWininet then Result := download_wininet(LocalFile,ftpFile);
    end;
    pour utiliser la classe, je fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FTP:=Tftp.create(....)
    FTP.type_transfert := CSindy;
    FTP.download(......);
    mais je pense pas du tout que se soit la bonne solution,
    j'ai essayé de faire une class Tindy , et une class Twininet, et une 3eme Tftp mais je suis un peu perdu
    dans la structure (heritage ou pas) .....
    quelqu'un pourrait il m'aider ?
    merci

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 794
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 794
    Points : 13 470
    Points
    13 470
    Par défaut
    Il te faut un classe de base TFTP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    type TFTP=class
    private
      fHost : string;
      fport : integer;
      fUsername : string;
      fpassword : string;
      frep_racine : string;
      fpassive : boolean;
    public
      constructor Create(Host,Username,password,rep_racine: string;passive : boolean);
      function connect:boolean; virtual; abstract;
      function deconnexion:boolean; virtual; abstract;
      function download(LocalFile,ftpFile:string):boolean; virtual; abstract;
      function upload(LocalFile,ftpFile:string):boolean; virtual; abstract;
    end;
    Et deux classes héritants de TFTP (chacune spécialisée dans un type d'accès) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    type TFTPIndy=class(TFTP)
    private
      idFTP : Tidftp;
    public
      function connect:boolean; override;
      function deconnexion:boolean; override;
      function download(LocalFile,ftpFile:string):boolean; override;
      function upload(LocalFile,ftpFile:string):boolean; override;
    end;
    
    type TFTPWinINet=class(TFTP)
    private
      hNet, hFTP : HINTERNET;
    public
      function connect:boolean; override;
      function deconnexion:boolean; override;
      function download(LocalFile,ftpFile:string):boolean; override;
      function upload(LocalFile,ftpFile:string):boolean; override;
    end;
    A l'appel, tu crées l'une ou l'autre de ces classes dérivées et l'assignes à une variable qui sera elle de type TFTP (polymorphisme).

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2016
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    merci pour ta réponse rapide.

    a l'appel, je voulais faire un truc genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ftp := Tftp.create(parametre_de_connexion:Tparametre_de_connexion; type_transfert:Ttype_transfert)
    ftp.upload(....,...);

    avec type_transfert= csIndy ou type_transfert=cswininet

    avec ta classe il faudrait faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if type_transfert= csIndy then 
      ftp := Tftp_indy.create(....)
    else
      ftp := Tftp_wininet.create(....)
    ??

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 794
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 794
    Points : 13 470
    Points
    13 470
    Par défaut
    Tu peux en passant par une méthode de classe mais il ne faut pas appeler le constructeur de TFTP (tu peux la déclarer comme classe abstraite suivant ta version de Delphi) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Type
      TFTP=class 
      public
        class function CreateType(..., type_transfert:Ttype_transfert) :TFTP;
      end;
     
    class function TFTP.CreateType(..., type_transfert:Ttype_transfert) :TFTP;
    begin
      case type_transfert of
        csIndy    : Result := Tftp_indy.create(....);
        csWinInet : Result := Tftp_wininet.create(....);
      end;
    end;

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2016
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    pour l'instant j'ai ça, ça te semble correct ?
    dans mon Button1Click, on est bien d'accord que je dois pas mettre de monftp.create ... ?

    encore merci pour ton aide !

    ps: au fait je suis sous delphi Xe berlin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    unit Unit1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,IdFTP,wininet,IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase,
      IdFTPCommon,  shellapi;
     
     type Ttype_transfert = (csIndy, csWininet, csTransfertLocal);
     
     
    type TFTP=class
    private
      fHost : string;
      fport : integer;
      fUsername : string;
      fpassword : string;
      frep_racine : string;
      fpassive : boolean;
    public
      class function CreateType(Host,Username,password,rep_racine: string;passive : boolean;type_transfert:Ttype_transfert) :TFTP;
      function connect:boolean; virtual; abstract;
      function deconnexion:boolean; virtual; abstract;
      function download(LocalFile,ftpFile:string):boolean; virtual; abstract;
      function upload(LocalFile,ftpFile:string):boolean; virtual; abstract;
    end;
     
    type TFTPIndy=class(TFTP)
    private
      idFTP : Tidftp;
    public
      constructor Create();
      function connect:boolean; override;
      function deconnexion:boolean; override;
      function download(LocalFile,ftpFile:string):boolean; override;
      function upload(LocalFile,ftpFile:string):boolean; override;
    end;
     
    type TFTPWinINet=class(TFTP)
    private
      hNet, hFTP : HINTERNET;
    public
      constructor Create();
      function connect:boolean; override;
      function deconnexion:boolean; override;
      function download(LocalFile,ftpFile:string):boolean; override;
      function upload(LocalFile,ftpFile:string):boolean; override;
    end;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
    {$R *.dfm}
    {-------------------------------------------------------------------------------}
    constructor TFTPIndy.Create();
    begin
      idftp := Tidftp.Create(nil);
    end;
    {-------------------------------------------------------------------------------}
    function TFTPIndy.connect:boolean;
    begin
    end;
    {-------------------------------------------------------------------------------}
    function TFTPIndy.deconnexion:boolean;
    begin
    end;
    {-------------------------------------------------------------------------------}
    function TFTPIndy.download(LocalFile,ftpFile:string):boolean;
    begin
      showmessage('indy_download');
    end;
    {-------------------------------------------------------------------------------}
    function TFTPIndy.upload(LocalFile,ftpFile:string):boolean;
    begin
    end;
    {-------------------------------------------------------------------------------}
    {-------------------------------------------------------------------------------}
    constructor TFTPWinINet.Create();
    begin
    end;
    {-------------------------------------------------------------------------------}
    function TFTPWinINet.connect:boolean;
    begin
    end;
    {-------------------------------------------------------------------------------}
    function TFTPWinINet.deconnexion:boolean;
    begin
    end;
    {-------------------------------------------------------------------------------}
    function TFTPWinINet.download(LocalFile,ftpFile:string):boolean;
    begin
      showmessage('wininet_download');
    end;
    {-------------------------------------------------------------------------------}
    function TFTPWinINet.upload(LocalFile,ftpFile:string):boolean;
    begin
    end;
    {-------------------------------------------------------------------------------}
    class function TFTP.CreateType(Host,Username,password,rep_racine: string;passive : boolean;type_transfert:Ttype_transfert) :TFTP;
    begin
      case type_transfert of
        csIndy    : Result := TFTPIndy.create;
        csWinInet : Result := TFTPWinINet.create;
      end;
    end;
    {-------------------------------------------------------------------------------}
    procedure TForm1.Button1Click(Sender: TObject);
    var monftp : Tftp;
    begin
      monftp := monftp.createtype('host','username','password','rep_racine',true,csIndy);
      monftp.download('local_file','ftp_file');
    end;
    {-------------------------------------------------------------------------------}
    end.

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 794
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 794
    Points : 13 470
    Points
    13 470
    Par défaut
    Citation Envoyé par BoulderDash Voir le message
    dans mon Button1Click, on est bien d'accord que je dois pas mettre de monftp.create ... ?
    Non en effet.
    Sinon, c'est un bon début. Juste déplacer la déclaration de MonFtp dans la déclaration de la fiche pour pouvoir le détruire le moment venu.

    Par la suite ce qui serait bien, c'est de déporter ce téléchargement dans un thread secondaire. Mais ce sera un autre sujet

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2016
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    encore merci pour ton aide,

    pour le thread pas sur que j'en ai besoin maintenant, car en fait je télécharge un backup sql en .zip, puis je dezip, puis restaure. donc je dois attendre la fin de chaque étape pour passer a la suivante.

    je continue de remplir mes méthodes, j’hésiterai pas si je suis bloqué.. ;o)

    bonne soirée


    G.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2016
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    salut,

    encore une dernière question et je ferme le sujet !
    dans la classe TFTP j'ai mis mes variable de connexion

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    type TFTP=class
     
    private
      fHost : string;
      fport : integer;
      fUsername : string;
      fpassword : string;
      frep_racine : string;
      fpassive : boolean;
     ....
    l'affectation, je l'ai mise dans le create de Tftpindy

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    constructor TFTPIndy.Create(Host,Username,password,rep_racine: string;passive : boolean;type_transfert:Ttype_transfert;nom_journal:string='');
    begin
      idftp := Tidftp.Create(nil);
      fport := 21;
      fHost := Host;
      fUsername := Username;
      fpassword := password;
      frep_racine := rep_racine;
      fpassive := passive;
    end;
    au début je voulais les mettre dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class function TFTP.CreateType(Host,Username,password,rep_racine: string;passive : boolean;type_transfert:Ttype_transfert;nom_journal:string='') :TFTP;
    begin
     fHost : string;
      fport : integer;
      fUsername : string;
      fpassword : string;
      frep_racine : string;
      fpassive : boolean;
     ....
      case type_transfert of
        csIndy    : Result := TFTPIndy.create(Host,Username,password,rep_racine,passive,type_transfert,nom_journal);
        csWinInet : Result := TFTPWinINet.create(Host,Username,password,rep_racine,passive,type_transfert,nom_journal);
        csICS     : Result := TFTPICS.create(Host,Username,password,rep_racine,passive,type_transfert,nom_journal);
      end;
    end;
    mais du coup il me dit que fhost,... sont inaccessibles, pour cela que j'ai mis dans le create de Tftpindy, Tftpwininet
    c'est comme ça qu'il faut faire ?

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 794
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 794
    Points : 13 470
    Points
    13 470
    Par défaut
    Il n'est pas possible d'initialiser des variables d'instance depuis une méthode de classe
    Laisse les déclarations communes dans TFTP et déclare son constructeur comme virtual. Les constructeurs des classes héritées sont à définir en override. Ces classes appelleront ensuite le constructeur de l'ancêtre par inherited.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    type
      TFTP=class
      public
        constructor Create(...); virtual;
      end;
    
      TFTPIndy=class
      public
        constructor Create(...); override;
      end;
    
    
      TFTPWinINet=class
      public
        constructor Create(...); override;
      end;
    
    constructor TFTP.Create(...);
    begin
      fHost := ...;
      ...
    end;
    
    constructor TFTPIndy.Create(...);
    begin
      inherited Create(...);
      fIndy := TIdFTP.Create(...);
    end;
    Le cheminement schématique est ainsi : TFTP.CreateType -> TFTP.Create (grâce au inherited) -> TFTPIndy.Create.

    A noter que Virtual/override ne sont pas obligatoires ici mais si tu décidais par la suite de modifier la création en passant par une méthode recevant en paramètre la classe à créer, le comportement polymorphique sera déjà assuré

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Type 
      TFTPClass = class of TFTP;
     
    class function TFTP.CreateType(aFTPClass :TFTPClass) :TFTP;
    begin
      Result := aFTPClass.Create(...);
    end;
     
    //Et l'appel
    FTP := TFTP.CreateType(TFTPIndy);

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2016
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    salut,

    pourquoi quand je mets la déclaration dans la procedure TForm1.Button1Click(Sender: TObject) , ça marche mais si je mets
    dans le var (sous Tform) ou dans le public de Tform, j'ai une violatrion d'accés ?

    merci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    unit Unit1;
    interface
    uses  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms,Vcl.Dialogs,transfert_ftp, Vcl.ComCtrls, Vcl.StdCtrls;
     
    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Button1: TButton;
        StatusBar1: TStatusBar;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var  monftp : Tftp;
    begin
      monftp := monftp.createtype('www.shortcuts.fr','maj_soft','ELL1mwgs1Y','/web/maj_soft/greg/',true,csIndy);
      monftp.statusbar := StatusBar1;
      monftp._message := Memo1;
      monftp.connect;
      monftp.deconnexion;
      monftp.Free;
    end;
     
    end.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    unit Unit1;
    interface
    uses  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms,Vcl.Dialogs,transfert_ftp, Vcl.ComCtrls, Vcl.StdCtrls;
     
    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Button1: TButton;
        StatusBar1: TStatusBar;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
       monftp : Tftp;
      end;
     
    var
      Form1: TForm1;
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
     
    begin
      monftp := monftp.createtype('www.shortcuts.fr','maj_soft','ELL1mwgs1Y','/web/maj_soft/greg/',true,csIndy);
      monftp.statusbar := StatusBar1;
      monftp._message := Memo1;
      monftp.connect;
      monftp.deconnexion;
      monftp.Free;
    end;
     
    end.

  11. #11
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 877
    Points : 11 373
    Points
    11 373
    Billets dans le blog
    6
    Par défaut
    Je suppose qu'une variable déclarée dans une méthode est initialisée (à nil, ici), alors qu'une déclarée à la définition de l'objet ne l'est pas, d'où une VA.

  12. #12
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 794
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 794
    Points : 13 470
    Points
    13 470
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monftp := TFTP.createtype('www.shortcuts.fr','maj_soft','ELL1mwgs1Y','/web/maj_soft/greg/',true,csIndy);
    C'est un pur coup de bol si ça fonctionne dans l'événement du bouton

    A la création d'un objet (ici la fiche), la mémoire est initialisée à 0 (nil pour les pointeurs). monftp est donc à nil.
    Dans une méthode, c'est au développeur d'initialiser les variables, monftp peut contenir n'importe quoi.

    D'après ce que tu as constaté (je n'avais jamais fait attention à cela), même un pointeur invalide est suffisant pour retrouver la classe ce qui ne semble pas être le cas sur un pointeur nil !

    Mais pour invoquer une méthode de classe, on l'appelle par la classe et non par une variable de ce type.

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2016
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    ahhhhhhhhhhh j'ai du caca d'orteil dans yeux ! depuis le début j'avais ça, vu que ça marchait, j'ai pas fait gaffe du tout a cette déclaration !
    merci encore antnotor ! si tu passes par nantes, j't'offre un jus de fruit bien frais
    merci a toi aussi tourlourou pour ta participation

  14. #14
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 794
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 794
    Points : 13 470
    Points
    13 470
    Par défaut
    Je te conseille tout de même d'envisager de lancer ces téléchargements depuis un thread secondaire.
    Si pour une quelconque raison le serveur ne répond pas ou que le téléchargement est très lent, Windows va râler et afficher L'application ne répond pas ce qui est toujours un peu déplaisant !

    Cerise sur le gâteau, ça te permettrait de lancer plusieurs téléchargements en parallèle

  15. #15
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2016
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    en fait une fois lancé, le programme
    download un backup de base de donnée
    dezip ce backup
    synchronize la base
    fait un backup de la base de données
    zip ce backup
    upload le backup
    fin du programme

    effectivement, j'ai le message "le programme ne répond pas" dés que je touche a la fenêtre, donc je mets quelque application.procressmessage.
    mais je vois pas quoi mettre dans un thread vu que je dois attendre la fin de l’exécution de chaque tache pour passer a la suivante.. non ?

  16. #16
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 794
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 794
    Points : 13 470
    Points
    13 470
    Par défaut
    A part la partie affichage (mémo, barre de status) qui doit être retravaillée, c'est l'ensemble du contenu de Button1Click qui sera déporté dans OnExecute du thread.

Discussions similaires

  1. [XL-2007] [Débutant] Aide pour "Object required"
    Par Runsh63 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 29/03/2011, 11h50
  2. [WD14] Aide Structure de fichiers
    Par david77320 dans le forum WinDev
    Réponses: 3
    Dernier message: 26/11/2009, 16h15
  3. Aide structure if then fi
    Par efelant dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 09/12/2008, 11h02
  4. [Conseils/Aide] Structure de mon premier programme
    Par Invité2 dans le forum Débuter
    Réponses: 44
    Dernier message: 13/09/2008, 14h08
  5. [Aide] Structure de ma base
    Par Gecko972 dans le forum Requêtes
    Réponses: 0
    Dernier message: 12/12/2007, 19h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo