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

Langage Delphi Discussion :

Comment mettre une variable de type TDate à Null ?


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 171
    Points : 52
    Points
    52
    Par défaut Comment mettre une variable de type TDate à Null ?
    Bonjour,

    Comme dit dans le titre, j'ai une erreur lorsque j'essaye de mettre une variable de type TDate de mon objet à null.

    Concretement j'ai un composant TDateEdit avec lequel je peux choisir une date dans un petit calendrier, mais si je modifie la date retournée par le calendrier et que je la met à vide ( ' / / ' ), lors de mon evenement OnExit lorsque je déclenche la modification de ma variable alors j'ai le méssage suivant qui apparait : "Conversion de type variant incorrecte"

    La methode que j'utilise pour mettre la date à null est :
    MonObjet.DteRachat := null;

    Je ne vois vraiment pas comment je peux faire ca, j'ai déja cherché de fond en comble sur google, je vous remercie d'avance de m'éclairer sur la méthode à utiliser !

  2. #2
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 681
    Points
    681
    Par défaut
    Pour mettre un variable à null, il faut utiliser nil.

    Maintenant (étant donné que je ne connais pas ce composant) pourquoi ne pas mettre une date quelconque ?
    Je ne comprend pas bien où vous voulez en venir.

  3. #3
    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
    TDateTime n'est pas un type objet, c'est un double en vérité. Vous ne pouvez pas affecter NIL comme pour un objet, encore moins le Null qui s'applique pour les variants.

    Si vous avez la main sur le type de la propriété de votre objet déclarez-la de type Variant et affectez Null lorsqu'il n'y a pas de date et un TDateTime le reste du temps.

    Si vous ne pouvez pas changer le type alors il faut décider d'une valeur indiquant le "vide". 0 est généralement une valeur acceptable mais attention cependant car 0 pour un TDateTime ne correspond pas à une date "nulle" mais bien à une date réelle (30/12/1899 12:00 am), attention pour l'affichage
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 486
    Points : 24 962
    Points
    24 962
    Par défaut
    Un Clear pourrait aider, c'est une méthode standard d'effacement d'une valeur dans un TCustomEdit

    En général, les composants date sont assez tétu ... et non par de Clear, parfois un accès à Text mais rare aussi !

    Pour ma part, je préfère utiliser un TMaskEdit, un TBouton avec un TMonthCalendar, cela permet une saisie plus souple que dans la plupart des TDateEdit (tel que le TDateTimePicker) et aussi l'effacement (ou l'auto-complétion des dates ...)

    Petite précision sur le nil, null en plus des propos de Aka Guymelef
    "nil" c'est pour les pointeurs (instances comprises), c'est une constante simple
    "Null" c'est la valeur nulle pour un variant, ne pas confondre avec "Empty" qui signifie vide, ce n'est pas une constante, mais une fonction qui renvoie un variant avec le type "varNull", énormément utiliser avec les composants DB (IsNull d'un TField, très utile)

    La gestion du null pour les objets métiers est indispensables, mais oblige l'utilisation massive de variants ce qui pose de problèmes lors des condition car souvent on a l'erreur de conversion sur par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if MonVariant = '' then
      MonVariant := 'Toto';
    il faut écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if VarIsEmpty(MonVariant) or VarIsNull(MonVariant) or (VarIsStr(MonVariant) and MonVariant ='') then
      MonVariant := 'Toto';
    Fastidieux, ... mieux vaut encapsuler le tout mais cela devient alors compliqué pour créer ses objets obligeant de passer par des accesseurs ... ayant fait une couche de persistance DB (genre ECO ou TInstantObjects mais plus spécifiques et moins génériques), j'ai souffert des nulls, et j'ai fait une bonne grosse usine à gaz, pour avoir des propriétés variantes avec des valeurs par défaut (type défini via la DB) et des propriétés supplémentaire pour tester la nullité ... cela simplifie grandement l'écriture du code et évite les erreurs de conversion, ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/06/2009, 13h28
  2. Réponses: 3
    Dernier message: 20/01/2008, 23h12
  3. Comment mettre une variable dans du texte?
    Par Xanto dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/12/2007, 13h50
  4. Réponses: 2
    Dernier message: 10/04/2007, 23h43
  5. comment declarer une variable de type date ?
    Par MAJIK_ENIS dans le forum JDBC
    Réponses: 1
    Dernier message: 26/05/2006, 00h02

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