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 :

test de pointeur non null


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Points : 44
    Points
    44
    Par défaut test de pointeur non null
    pour tester si un pointeur est null on peut écrire
    mais quel test effecuter pour voir s'il est non null ?

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Points : 44
    Points
    44
    Par défaut
    voilà,c'est résolu, mais maintenant, est-il possible de tester pendant toute l'utilisation du programme si le pointeur est null ? pour faire une sorte d'interruption

  3. #3
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Utilises un timer...(pas très élégant je sais)

  4. #4
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Si tu nous dis ce que tu veux faire avec ton pointeur : on peut peut être mieux t'aider.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Points : 44
    Points
    44
    Par défaut
    le seul moyen de vérifier la présence d'une smartcard dans mon lecteur est de vérifier si un pointeur est null ou pas, je voudrais donc pouvoir tester tout au long de l'application s'il y a une carte ou pas afin que mon processus de lecture sur la carte puisse se faire à l'insertion et pas après avoir cliqué sur un bouton

  6. #6
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Bon et bien le principe du timer devrait aller.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Points : 44
    Points
    44
    Par défaut
    je suis très très très débutant, comment puis-je réaliser cela avec un timer ?

  8. #8
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Tu mets un TTimer sur ta Forme principale.
    Tu vas dans les événements tu doubleCliques sur ONTimer : ça ouvre le code dans lequel tu mets ton test.
    Tu Vérifies que pour ton TTimer le enabled est à true et tu mets dans Interval la valeur en ms d'interrogation (style 500 pour ton appli).

  9. #9
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut Test si carte insérée
    Bonjour,

    Il suffit de poser un composant TTimer sur la fiche.

    Fixer la propriété Interval à la valeur désirée (en millisecondes)

    et implémenter l'évènement OnTimer

    ex pour l'évènement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    type
     TForm1 = class(TForm)
     private
       IsSmartCardInserted: Boolean;
      (...)
     end;
     
    implementation
     
    procedure TForm1.OnTimer(Sender: TObject);
    begin
      IsSmartCardInserted := Assigned(MonPtr);
    end;
    Akim Merabet

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Points : 44
    Points
    44
    Par défaut
    je n'ai pas d'evènement OnTimer pour la forme principale après avoir mis un composant timer

  11. #11
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Tu selectionnes ton Ttimer sur ta forme, tu fais <F11> : ça affiche les propriétés de ton Ttimer, tu cliques sur l'onglet événements, tu dblCliques sur OnTimer.

  12. #12
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 556
    Points : 3 936
    Points
    3 936
    Par défaut
    salut

    une autre solution consiste à utiliser un objet qui emballe le pointer et déclenche un événement lors de sa modification, le point important est qu'il faut toujours affecter le pointer via l'objet pour que cela fonctionne :

    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
     
    TAdvPointer = class
    private
      FPtr: Pointer;
      FOnChange: TNotifyEvent;
      procedure SetValue(const P: Pointer);
    public
      constructor Create(P: Pointer);
      property Value: Pointer read FPtr write SetValue;
      property OnChange: TNotifyEvent read FOnChange write FOnChange;
    End;
     
    procedure TAdvPointer.SetValue(const P: Pointer);
    begin
      if P = FPtr then
       exit;
      FPtr := P;
      if Assigned(FOnChange) then
        FOnChange(self);
    End;
     
    constructor TAdvPointer.Create(P: Pointer);
    begin
      Value := P;
    End;
     
    // Utilisation -----------------------------
     
    procedure TForm1.AVChange(Sender: Tobject);
    begin
    // ton code en cas de changement de valeur
      if not Assigned(AV.Value) then
        ShowMessage('Plus affecté');
    End;
     
     
    var
      AP: TAdvPointer;
    begin
      AP := TAdvPointer.Create(Nil);
      AP.OnChange := AvChange;
      // Toujours affecter via le pointer via la propriété Value.
      AP.Value := ...
    cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  13. #13
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    Pour tester si ton pointer est non null

    [Il était une fois Delphi ....]


  14. #14
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    une autre solution consiste à utiliser un objet qui emballe le pointer et déclenche un événement lors de sa modification
    C'est certe plus élégant (et plus compliqué aussi) mais ici j'ai l'impression que le pointeur est modifié par une appli externe donc ton principe ne marchera pas.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Points : 44
    Points
    44
    Par défaut
    juste, le pointeur est non null si une smartcard est insérée, maintenant tout fonctionne sauf un détail qui pourrait poser problème par la suite, j'aimerais faire une sorte d'interruption,parce que là je fais tout mon processus pendant le timer, mais alors si la carte est toujours insérée, le processus continue de faire la lecture de la carte

  16. #16
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Quand tu as trouvé ta carte tu fais timer.enabled := false;

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Points : 44
    Points
    44
    Par défaut
    oui mais alors...le compteur est arrêté donc la " boucle " ne se fera plus et il n'y aura plus aucune détection de carte après

  18. #18
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut
    Dans ce cas, il faut passer la propriété Enabled de ton timer à FALSE.

    Cela aura pour conséquence de stopper l'interruption levée par ton timer.

    Le plus propre en général et de stopper justement l'exécution du timer quand tu entres dans l'événement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Tform1.TimerTimer(Sender: TObject);
    begin
      Timer.Enabled := FALSE; // Ici, on stoppe les interruptions futures du timer
     
      code à exécuter à chaque fois que le timer se déclenche
     
      Timer.Enabled := TRUE; // Ici on relance le timer
    end;

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Points : 44
    Points
    44
    Par défaut
    oui mais si la carte reste insérée....le pointeur sera toujours non null donc il repassera dans mon code à chaque interval vu que à la fin je le remet a true

  20. #20
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut
    Bon, si je comprends bien ton problème, tu veux exécuter une fonction lorsque tu insères ta carte, mais une seule fois.

    Ensuite, si on retire la carte et qu'on l'insère à nouveau, il faut recommencer??

    Dans ce cas, je préconise d'utiliser une variable de sauvegarde pour connaître l'état de la carte (insérée ou pas)

    Exemple rapide qui devrais fonctionner:

    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
    procedure Tform1.TimerTimer(Sender: TObject);
    var
      insertion_carte : boolean;
    begin
      Timer.Enabled := FALSE;
      insertion_carte := FALSE;
     
      // On teste la présence de la carte
      if (pointeur = nil) then
        carte_presente := FALSE  // Carte_presente est une variable globale de type booléen
      else
      begin
        // Ici, le pointeur est non-nul, donc il y a une carte, mais ce n'était pas le cas avant! Conclusion: on vient d'insérer une carte!
        if (not carte_presente) then 
          insertion_carte := TRUE;
     
        // Ici, on indique au programme que la carte est présente, ce qui évitera de relancer plusieur fois la fonction!
        carte_presente := TRUE;
     
        // Ici, comme on vient d'insérer la carte, on appelle la fonction ad hoc
        if (insertion_carte) then procedure_insertion_carte();
      end;
     
      Timer.Enabled := TRUE; // On 'oublie pas de relancer le timer pour détecter si la carte est enlevée ou pas!!!
    end;

Discussions similaires

  1. Test de pointeur a null
    Par Seth77 dans le forum C#
    Réponses: 38
    Dernier message: 12/11/2007, 13h16
  2. [Tableaux] Appeler une variable que si non NULL
    Par GarGamel55 dans le forum Langage
    Réponses: 6
    Dernier message: 08/10/2005, 14h07
  3. [insertion]0 et non NULL pour un champ real
    Par Tchinkatchuk dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 12/07/2005, 18h19
  4. return array vide et non null
    Par mereyj dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 18/04/2005, 20h25
  5. [VB.Net] DataAdapter, Affichage si non null ???
    Par Sophy dans le forum ASP.NET
    Réponses: 12
    Dernier message: 20/02/2004, 18h03

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