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 :

Peut-on imbriquer un TDataBase dans une classe héritée de TDataBase


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 73
    Points : 61
    Points
    61
    Par défaut Peut-on imbriquer un TDataBase dans une classe héritée de TDataBase
    Ca peut paraître une bête question, je sais :-) Mais ce sont mes premiers pas avec les classes, et je rame un peu...

    Bon, j'ai une class TMaClasse( TDataBase ) qui se connecte à une DB2/400. Je l'instancie au démarrage de l'appli, et je la passe à tous les sous-programmes par après; elle me permet, quand mon utilisateur s'identifie, d'aller voir dans une table locale quels sont ses droits etc. une bonne fois pour toutes.
    (l'autre objectif sera de pouvoir switcher aisément entre DB2/400 et MySQL, simplement en modifiant le code de TMaClasse que je passe à toutes mes fonctions, mais ne nous égarons pas...)

    Dans mon appli, toutes les données essentielles sont sur la DB2, mais j'ai en local une série de tables qui contiennent des libellés etc. En fait, j'ai plusieurs bases locales, et selon la langue de l'utilisateur, j'ouvre l'une plutôt qu'une autre.

    Du coup, dans mon TMaClasse, j'ai ajouté un autre TDataBase qui me permet de me connecter une bonne fois pour toutes à la bonne base de données locale.

    Mais j'ai un problème à la libération de TMaClasse. Dans mon Destructor, soit il n'y a pas moyen de libérer mon TDataBase local, soit j'y arrive mais à la sortie du code du Free, j'ai une "opération de variant incorrecte", ou pire, l'appli est dans le gaz (Ctrl+F2 pour l'arrêter)...
    Ou plus exactement, j'instancie ma classe, puis je libère : là pas de problème. Je réinstancie et je libère : plantage. Le problème vient bien du TDataBase imbriqué, car lorsqu'il n'est pas là, la libération se passe fort bien...

    Bref : primo, est-ce possible d'imbriquer un TDataBase dans une classe dérivée de TDataBase ? Et secundo, pourquoi rogntudju mon appli plante ainsi ?

    Merci pour vos lumières !

    A tout hasard, je mets le code :

    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
       TMaClasse = class( TDataBase )
          Public
          TypeDeConnexion    : ShortString;
          IdUtilisateur      : ShortString;
          MotDePasse         : ShortString;
          EspaceDeTravail    : ShortString;
          Machine            : ShortString;
          AdresseIP          : ShortString;
          ExerciceEnCours    : integer;
          TarifEnCours       : double;
          ChargementEnCours  : double;
          Horizon            : TDateTime;
          DBLocale           : TDataBase;
          Constructor Create( pUserName  : string = 'IESSAI';
                              pPassWord  : string = 'IIESSAI';
                              pLibrairie : string = 'DEFAUT';
                              pNomDB     : string = '__400AUTO' );
          Destructor Libere;
       end;
     
    constructor TMaClasse.Create( pUserName,
                                  pPassWord,
                                  pLibrairie,
                                  pNomDB : string );
    var
       _DecimalSeparator : char;
       pgm400 : TCall400;
       AS400 : TAS400;
       i : integer;
    begin
       inherited Create(nil);
       Connected          := False;
       IdUtilisateur      := pUserName;
       MotDePasse         := pPassWord;
       EspaceDeTravail    := pLibrairie;
       Machine            := NomOrdinateur;
       AdresseIP          := AdresseIPDuPc;
       (... autres remplissages )
       _DecimalSeparator:= DecimalSeparator;
       DecimalSeparator := '.';
       TypeDeConnexion := '400';
       DriverName := 'IDCO400';
       LoginPrompt := False;
       Params.Add( 'USER NAME=' + pUserName );
       Params.Add( 'DATABASE NAME=INTEGRAL' );
       Params.Add( 'LIBRARY NAME=' + pLibrairie );
       Params.Add( 'PASSWORD=' + pPassWord );
       if pLibrairie = '=DEFAUT' then begin
          AS400 := TAS400.Create( nil );
          AS400.Name := '_AS400';
          AS400.BufferSize := 5000;
          AS400.Userid := pUserName;
          AS400.PWD := pPassWord;
          AS400.Active := True;
          pgm400 := TCall400.Create( nil );
          pgm400.Name := 'CallConfigUser';
          pgm400.ProgramName := 'CONFIGUSER';
          pgm400.LibraryName := 'PRODROUTIN';
          pgm400.AS400 := AS400;
          for i := 1 to 6 do pgm400.AddParam( 'A', 10, 0 );
          pgm400.Execute;
          Params[2] :=  'LIBRARY NAME=' + pgm400.Value[0];
          pgm400.Free;
          AS400.Free;
       end;
       Connected := True;
       DecimalSeparator := _DecimalSeparator;
       DBLocale := TDataBase.Create( nil );
       DBLocale.DriverName := 'STANDARD';
       DBLocale.DatabaseName := 'BDLOC';
       DBLocale.Params.Add( 'PATH=' + 'C:\Imagine\BDLocale\Codes' );
       DBLocale.Params.Add( 'DEFAULT DRIVER=PARADOX' );
       DBLocale.Params.Add( 'ENABLE BCD=FALSE' );
       DBLocale.Connected := True;
    end;
     
    destructor TMaClasse.Libere;
    begin
       DBLocale.Close;
       DBLocale.Free;
       inherited Free;
    end;

  2. #2
    Membre du Club
    Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 73
    Points : 61
    Points
    61
    Par défaut Le problème est sur le code du Free
    J'ai un peu avancé sur le sujet...

    SI je mets un try... except à l'intérieur du Destructor Free, j'ai quand même le message "opération de variant incorrecte". Si par contre je mets un try..except sur l'appel au destructeur dans le programme principal (Try / MonInstance.Free / Except), là le message est bien intercepté...

    Ensuite, si au lieu d'un MonInstance.Free, je fais un FreeAndNil( MonInstance ), il n'y a plus de problème semble-t-il.

    Mon code dans le free est pourtant on ne peut plus simple, rogntudju...
    En fait, il n'y a même plus rien dans le Destructor, car dans le create de ma variable DBLocale, je l'ai rattachée à MonInstance ( DBLocale.Create( MonInstance ) et donc (si j'ai bien compris), la libération de MonInstance provoque la libération de tous les composants qui lui sont rattachés...

    Dites-moi où je déconne, là, chuis perdu...

    Merci
    Paul

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/08/2010, 15h13
  2. peut on mettre du javascript dans une classe css
    Par aléatoire dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 21/08/2009, 20h34
  3. Réponses: 2
    Dernier message: 04/12/2005, 21h10
  4. Réponses: 2
    Dernier message: 27/03/2005, 16h09

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