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

Windows Forms Discussion :

[C#] Convertion de structure vers Delphi .NET [Débutant(e)]


Sujet :

Windows Forms

  1. #1
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut [C#] Convertion de structure vers Delphi .NET
    [Delphi 2005 Evaluation]
    [.NET Framework version 1.1]
    [XP pro]

    Bonjour,
    je cherche à comprendre ce que fait exactement cette portion de code avant de la traduire en Delphi pour .Net.
    Ce code est extrait d'un tutorial sur le C# disponible dans la version de Delphi 2005.
    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
     
    public struct DBBool
    {
       // The three possible DBBool values:
       public static readonly DBBool dbNull = new DBBool(0);
       public static readonly DBBool dbFalse = new DBBool(-1);
       public static readonly DBBool dbTrue = new DBBool(1);
       // Private field that stores -1, 0, 1 for dbFalse, dbNull, dbTrue:
       int value; 
     
       // Private constructor. The value parameter must be -1, 0, or 1:
       DBBool(int value) 
       {
          this.value = value;
       }
    ...
    }
    En Delphi j'ai la possibilité d'utiliser une classe ou record +- identique à ce type de structure, mais j'ai un peu de mal à convertir ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public static readonly DBBool dbNull = new DBBool(0);
    Il s'agit, si j'ai bien compris, d'une propriété propre à la classe en lecture seule.
    L'instruction dbNull = new DBBool(0) est-elle une assignation d'un objet créé par le constructeur de la structure/classe DBOOL ?
    Et dans ce cas à quel moment ce code est-il exécuté ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Test 
    {
       static void Main() 
       {
          DBBool a, b;
          a = DBBool.dbTrue;
          b = DBBool.dbNull;
    ...
    }
    Que fait cette portion de code a = DBBool.dbTrue; ? Il me semble que c'est une assignation mais je ne vois d'appel de constructeur ?
    Mais la réponse est peut-être dans la compréhension du point précédent.

    Merci

    PS:
    Merci de ne pas déplacer ce post dans le forum Delphi.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 114
    Points : 71
    Points
    71
    Par défaut
    Je n'ai pas eu le temps de faire une recherche, mais il y a un ou deux jours un trhead portant sur le dbnull a été résolu:

    http://www.developpez.net/forums/viewtopic.php?t=280308

    voilà ^^

  3. #3
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Merci Ukyuu, mais le thread en question est lié à la fonction isDBNull qui n'est pas ma problématique ici.

    J'ai eu un doute, j'ai donc regarder dans le SDK il existe une classe DBNull mais ici il s'agit de dbNull qui est une des 3 valeurs possibles pour le nouveau type que je souhaite créer.
    Le C# est me semble-t-il sensible à la casse, non ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 114
    Points : 71
    Points
    71
    Par défaut
    Ce que je sais, c'est que DBnull normalement teste si oui ou non ton champ est null et qu'il s'applique aux datasets et aux bases de données..

    Je serais mal avisée de te répondre, et d'ailleurs, je m'excuse si je t'ai mal orienté.

    Pour ce qui est de la sensibilté à la casse, je ne saurais pas trop te le dire, je suis débutante en la matière.

    Je regardes si je trouve quelque chose sur le net qui explique celà.

    Je te dirais ce que j'ai trouvé tout à l'heure.

  5. #5
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    C# est bien sensible à la casse.
    Le lien d' Ukyuu n'a rien à voir avec ton problème tu as raison.

    Dans ton problème, DBBool est une structure avec un membre privé de type int (value).
    Il y a aussi un constructeur privé qui initialise value avec -1, 0 ou 1.
    Le constructeur est privé , tu ne peux donc construire directement des objets DBBool depuis ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBBool x = new DBBool(0); // provoquerait une erreur dans ton code
    Par contre la structure DBBool possède trois objets statiques DBBool (un peu comme des variables globales en fait)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     public static readonly DBBool dbNull = new DBBool(0);
    DBBool.dbNull en fait partie. C'est un objet DBBool avec value = à 0.
    Les objets statiques sont contruits au démarrage de l'application si je ne me trompe.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 114
    Points : 71
    Points
    71
    Par défaut
    /me s'incline devant abdelman.

    /me s'excuse.

    /me promets de retourner étudier le framework afin d'être plus utile.

    ( /me se sent un peu misérable là )

  7. #7
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par Ukyuu
    /me s'incline devant abdelman.

    /me s'excuse.

    /me promets de retourner étudier le framework afin d'être plus utile.

    ( /me se sent un peu misérable là )
    mais non mais non ...
    faut pas

  8. #8
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Merci, mais j'ai cherché dans la doc du SDK et par tâtonnement je pense avoir un début de solution, enfin je dois vérifier si tes explications Abelman correspondent avec ma solution
    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
     
    type
      // étendue du type
     IDBType = -1..1;
     
    const
      // valeurs du type autorisé
     cdbNull   : IDBType =0;
     cdbFalse  : IDBType =-1;
     cdbTrue   : IDBType =1;
     
    type
     
       TDBBool = record
         strict private
          Class var // propriété de classe
           Class function GetdbNull  : TDBBool; Static;
           Class function GetdbFalse : TDBBool; Static;
           Class function GetdbTrue  : TDBBool; Static;
         private
             // Champ privé pour stocker 1, 0,-1 associé à dbTrue, dbFalse, dbNull
          FValeur : integer;
          Constructor Create(AValeur: IDBType);
     
         Public
          Class property dbNull  : TDBBool read GetdbNull;
          Class property dbFalse : TDBBool read GetdbFalse;
          Class property dbTrue  : TDBBool read GetdbTrue;
           // Surchage/déclaration d'opérateur pour ce type
          Class operator Implicit(Avalue: Boolean): TDBBool;
          Class operator Implicit(x: TDBBool): String;
          Class operator Explicit(x: TDBBool): Boolean;
          Class operator Equal(x,y : TDBBool):TDBBool; //  =
          Class operator NotEqual(x,y : TDBBool):TDBBool; // <>
          Class operator LogicalNot(x : TDBBool):TDBBool; // not
          Class operator LogicalAnd(x,y : TDBBool):TDBBool; // and
          Class operator LogicalOr(x,y : TDBBool):TDBBool; // or
     
          { Pas d'opérateur True ou False !
             True operator. Returns true if the operand is dbTrue, false otherwise:
             False operator. Returns true if the operand is dbFalse, false otherwise:
          }
          procedure Equals(x: TObject);Override;
        end;
    Il me reste un soucis pour surcharger la méthode Equals de l'objet de base System.Object mais je vais voir avec les Delphistes comment on fait pour utiliser des classes du framework qui ne sont pas mappées dans Delphi.

  9. #9
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Aprés vérification ce que j'ai fait ne me semble pas correcte, à chaque fois que j'accéde à un des 3 champs je crée une instance du type TDBBool :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Class function TDBBool.GetdbNull: TDBBool;
       Begin
        Result:=TDBBool.Create(cdbNull);
       end;
    C'est ce point qui me pose le plus de difficulté de traduction :

    Par contre la structure DBBool possède trois objets statiques DBBool (un peu comme des variables globales en fait)
    Schématiquement, sont-ils accessibles partout dans le code et par les tous les objet ?

    public static readonly DBBool dbNull = new DBBool(0);

    Les objets statiques sont contruits au démarrage de l'application si je ne me trompe.
    Ils sont donc construit (et ce sans appel explicite de constructeur) une seule fois et pas pour chaque instance de cette structure ?
    Cette construction est-elle dépendante de la déclaration d'une variable de type DBOOL ?

    Est-ce qu'il s'agit de variable/propriéte de classe ?

    Excuse moi si je suis confus sur ce point mais je manipule pas encore correctement la terminologie .Net.

  10. #10
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par Laurent Dardenne
    Schématiquement, sont-ils accessibles partout dans le code et par les tous les objet ?
    Oui et ils ne sont pas modifiables à cause du readonly

    public static readonly DBBool dbNull = new DBBool(0);
    Les objets statiques sont contruits au démarrage de l'application si je ne me trompe.
    Citation Envoyé par Laurent Dardenne
    Ils sont donc construit (et ce sans appel explicite de constructeur) une seule fois et pas pour chaque instance de cette structure ?
    Ils sont bien construits une seule fois oui.
    Leur construction utilise le constructeur de DBBool car ce sont des variables de type DBBool.
    Si la syntaxe de l'expression comportant la déclaration et l'assignation d'un membre d'une structure n'existe pas en delphi .NET, cherche si il existe des constructeur statiques en delphi .net

    Connais tu un peu C++ ? ou Java ? Si oui le mot clé static dans ton code C# e le même sens que dans ces langages.

    Citation Envoyé par Laurent Dardenne
    Est-ce qu'il s'agit de variable/propriéte de classe ?
    dbNull est un membre de la structure DBBool tout comme value (le champ privé)
    dbNull est accessible dans ton code sans que tu aies besoin d'instancier variable DBBool
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Console.WriteLine(DBBool.dbnull);

  11. #11
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Merci pour toutes ces explications !
    Je ne connais pas le C++ ni le Java mais je vais regarder dans des tutoriels.

    Un derniére question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static readonly DBBool dbNull = new DBBool(0);
    Est-ce qu'il y a plus ou moins une notion de 'constante' associé à cette construction ?
    cf.
    Citation Envoyé par abelman
    dbNull est accessible dans ton code sans que tu aies besoin d'instancier variable DBBool
    Mais je vais laisser décanter tout ça pendant la nuit

  12. #12
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Il n'y a pas de quoi.

    La notion de constante comme tu dis c'est dû au readonly.

  13. #13
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    N'ayant pas vraiment avancé, je voulais comprendre par rapport à la définition de structure donnée au début si le test dans le code suivant renvoie une référence ou si implicitement il y a création d'une variable de classe ?
    (Il s'agit de la même structure )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public static implicit operator DBBool(bool x) 
     {
      return x? dbTrue: dbFalse;
     }
    Et l'assignation dans le code suivant fait-elle une recopie d'objet à partir du champs de classe dbTrue ou est-ce une référence ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     DBBool a, b;
          a = DBBool.dbTrue;
    Aprés ça j'irais poster dans le forum Delphi.

  14. #14
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Dans le premier code, le test renvoie une reference pointant sur les objets DBBool.dbTrue ou DBBool.dbFalse. Il n'y a pas de création d'instance.

    Idem dans le second code, il n'y a pas de recopie d'objet, juste une affectation de reference.
    Il faut implementer l'interface IClonable. (Je ne sais pas si on peut implementer des interface avec les structures)

  15. #15
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Merci.
    Je vais aller chercher le reste d'infos dans le forum Delphi

  16. #16
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par abelman
    Il faut implementer l'interface IClonable. (Je ne sais pas si on peut implementer des interface avec les structures)
    Il faut lire : Pour pouvoir faire des copie Il faut implementer l'interface IClonable ...

    Oubli de ma part

  17. #17
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Merci.
    Une derniére pour la route
    N'ayant pas encore bien compris la gestion de la mémoire sous .Net, je me suis posé la question suivante :
    Le type structure n'implémente pas de méthode de destruction, je suppose qu'elle hérite de Dispose ou implément IDisposable ?

    J'ai lu que tout est objet sous .Net, dans ce cas ou se situe la différence en C# entre une structure et une classe ?
    Excuse moi mais j'ai le cogito qui s'emballe

  18. #18
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    En fait depuis le debut je parle par abus de langage et ce n'est pas bon.
    Ce que je t'ai dit pour les assignation et les recopies ne vaut que pour les classes. (me culpa)

    Il n'y a pas de notion de reference sur les structures, seulement sur les classes

    Les structures sont de types valeurs et les classes de type reference.

    Quand tu crées une variable dont le type est une structure, et que tu lui assigne une autre variable il y a bien une copie membre par membre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DBBool a, b;
          a = DBBool.dbTrue
    Les valeurs des membres de dbTrue sont copiées vers les membres de a.
    Les deux variables sont bien distinctes et il n'y a pas de references

  19. #19
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par abelman
    (me culpa)
    Loin de moi l'idée d'un quelconque reproche. De mon coté j'aurais pu lire le SDK mais c'est l'impatiente du débutant qui prime dans mon cas.
    J'ai tout de même lu le trés bon bouquin de Dick Lantim et suis entrain de lire celui d'Olivier Dahan sur Delpi pour .Net mais faut un peu de temps pour que cela porte ces fruits. Pour l'instant je suis dans la confusion.

    Mais cette convertion de code, ambitieuse vu mes connaissances en la matiére, met en lumiére par mal d'aspect lié à la compréhension de .Net.
    Pour mon premier prg sous .Net c'est déjà bien .

    Et concernant la question sur la libération de structure ?

  20. #20
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Tu n'as rien à liberer sur une structure puisque ce n'est pas une reference
    C'est comme un Record classique en Delphi. Il n'y a pas de notion de destructeur.

    Un objet strucure n'est pas un pointeur - pas de mecanisme de destruction
    Un objet classe en est un (ou une reference) - mecanisme de destruction interne à .NET (Garbage Collector)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Migrer de Delphi 7 vers Delphi .Net
    Par Klemsy78 dans le forum Delphi .NET
    Réponses: 11
    Dernier message: 24/04/2009, 14h15
  2. Conversion C# vers Delphi.NET
    Par JulioG dans le forum Delphi .NET
    Réponses: 2
    Dernier message: 15/02/2008, 13h03
  3. migration de delphi vers delphi.net
    Par momo629 dans le forum Delphi .NET
    Réponses: 2
    Dernier message: 03/08/2007, 21h11
  4. Réponses: 2
    Dernier message: 22/11/2006, 16h54
  5. Migrer de delphi7 vers delphi.NET
    Par Kallamou dans le forum Delphi .NET
    Réponses: 2
    Dernier message: 08/10/2006, 19h16

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