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 :

Pb à la copie d’une table avec BatchMove dans une procédure secondaire


Sujet :

Delphi

  1. #1
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 167
    Points : 89
    Points
    89
    Par défaut Pb à la copie d’une table avec BatchMove dans une procédure secondaire
    Bonjour à tous.

    Dans une Application la copie d’une table se fait dans plusieurs Procédures.
    Plutôt que d’écrire à chaque fois la routine de Copie, j’ai créé une procédure de copie de cette table.

    A la compilation j’ai le message suivant : ‘ Indicateur non déclaré « Self » ‘ à la ligne (en rouge)
    nomTable := TTable.Create(self);

    Lorsque je masque cette procédure secondaire (mise en place d'accolades) le programme se compile normalement et la copie est faite correctement (Procédure BoutonSecondaire).

    J’ai matérialisé cela avec les deux boutons (ButtonPrincipal et ButtonSecondaire)

    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
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, DBTables, DB;
    
    type
      TForme = class(TForm)
        ButtonPrincipal: TButton;
        ButtonSecondaire: TButton;
        MtCartoP: TTable;
        dsCartoP: TDataSource;
        BatchMove1: TBatchMove;
        MtCartoPProv: TTable;
        DataSource4: TDataSource;
        procedure ButtonPrincipalClick (Sender: TObject);
        procedure ButtonSecondaireClick (Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
    
    var
      Forme: TForme;
      nomTable:TTable;
      procedure CopierTable(); forward;
    implementation
    
    {$R *.dfm}
    
    procedure TForme. ButtonPrincipalClick (Sender: TObject);
    begin
        MtCartoP.Active:=false;
        MtCartoP.TableName:='MtCartoP';
        MtCartoP.Active:=True;
        nomTable := TTable.Create(self);
        nomTable.TableType :=ttParadox;
        MtCartoPProv.Active:=false;
        nomTable.TableName :='MtCartoPProv';
        BatchMove1.Source :=MtCartoP;
        BatchMove1.Destination :=nomTable;
        BatchMove1.Mode :=batCopy;
        BatchMove1.Execute;
        nomTable.AddIndex('','Cle Interne',[IxPrimary]);
        nomTable.AddIndex('CartoPProvCodepNtrNdrv','CodDepart;NumTroncon;NumDerivat',[]);
        MtCartoPProv.Active:=True;
    end;
    
    
    procedure CopierTable();
    begin
    {
      with Forme do
      begin
        MtCartoP.Active:=false;
        MtCartoP.TableName:='MtCartoP';
        MtCartoP.Active:=True;
        nomTable := TTable.Create(self);
        nomTable.TableType :=ttParadox;
        MtCartoPProv.Active:=false;
        nomTable.TableName :='MtCartoPProv';
        BatchMove1.Source :=MtCartoP;
        BatchMove1.Destination :=nomTable;
        BatchMove1.Mode :=batCopy;
        BatchMove1.Execute;
        nomTable.AddIndex('','Cle Interne',[IxPrimary]);
        nomTable.AddIndex('CartoPProvCodepNtrNdrv','CodDepart;NumTroncon;NumDerivat',[]);
        MtCartoPProv.Active:=True;
      end;
    }
    end;
    
    procedure TForme. ButtonSecondaireClick (Sender: TObject);
    begin
      CopierTable();
    end;
    
    end.
    Je voudrais savoir où se situe mon erreur.
    Merci

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Self représente l'objet lui-même à l'intérieur d'une méthode dudit objet.

    Or ici CopierTable() n'est plus une méthode d'un objet mais une simple procédure, donc plus de référence à Self. Tu dois donc créer l'objet ainsi et surtout pas oublier de le libérer une fois le travail accompli.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    nomTable := TTable.Create(NIL);
    try
      [...]
     
    finally
      nomTable.Free;
    end;
    Par ailleurs il y a clairement un problème de conception dans ta routine car tu te sert de "l'astuce" de passer par la variable globale Forme pour accéder aux objets déposés sur la fiche. Théoriquement ces objets devraient être passés en paramètre de ta routine.

  3. #3
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 167
    Points : 89
    Points
    89
    Par défaut
    Bonjour.
    Merci Aka Guymelef pour ton aide, c'est Parfait.

    pour ce qui concerne la conception :
    Par ailleurs il y a clairement un problème de conception dans ta routine car tu te sert de "l'astuce" de passer par la variable globale Forme pour accéder aux objets déposés sur la fiche. Théoriquement ces objets devraient être passés en paramètre de ta routine.
    Je suis tout à fait d'accord avec toi.

    J'utilise cependant cet artifice car dans certains cas le nombre de paramètres est très grand.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Comment afficher le resultat dune BDD avec javascript dans une nouvelle page
    Par modemo2005 dans le forum Langages
    Réponses: 1
    Dernier message: 16/12/2014, 20h24
  2. Problème avec Insert dans une table contenant deux clés
    Par pure_blue dans le forum Accès aux données
    Réponses: 5
    Dernier message: 23/10/2006, 20h32
  3. [Conception] Problème avec INSERT dans une TABLE
    Par dunbar dans le forum PHP & Base de données
    Réponses: 26
    Dernier message: 20/07/2006, 13h56
  4. Réponses: 4
    Dernier message: 10/07/2006, 14h51
  5. Réponses: 4
    Dernier message: 13/10/2005, 15h44

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