pour tester si un pointeur est null on peut écrire
mais quel test effecuter pour voir s'il est non null ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part if(monptr=nil)
pour tester si un pointeur est null on peut écrire
mais quel test effecuter pour voir s'il est non null ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part if(monptr=nil)
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
Utilises un timer...(pas très élégant je sais)
Si tu nous dis ce que tu veux faire avec ton pointeur : on peut peut être mieux t'aider.
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
Bon et bien le principe du timer devrait aller.
je suis très très très débutant, comment puis-je réaliser cela avec un timer ?
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).
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
je n'ai pas d'evènement OnTimer pour la forme principale après avoir mis un composant timer
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.
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 :
cdlt
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 := ...
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."
Pour tester si ton pointer est non null
Code : Sélectionner tout - Visualiser dans une fenêtre à part if(monptr<>nil)
[Il était une fois Delphi ....]
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.une autre solution consiste à utiliser un objet qui emballe le pointer et déclenche un événement lors de sa modification
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
Quand tu as trouvé ta carte tu fais timer.enabled := false;
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
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;
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
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;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager