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 :

Action à chaque résultat différent d'une division


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Octobre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2011
    Messages : 23
    Points : 18
    Points
    18
    Par défaut Action à chaque résultat différent d'une division
    Bonjour,

    J'ai inclus une procédure de division dans un Timer pour effectuer une division en temps réel d'un chiffre qui change régulièrement. Le résultat de cette division change régulièrement donnant un chiffre compris entre 0 et 9.
    Pour chaque résultat différent, je dois prendre une action une seule fois.
    Avec l'instruction if...then l'action est répétée aussi longtemps que le résultat reste le même. Un tout grand merci à qui pourrait me donner la solution ? (ex. ci joint)
    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
    procedure TFMain.Timer5Timer(Sender: TObject);
    var X1 : Variant;
        X, Y, Z : Integer;
    begin
        X1 := Edit10.Text;
        X :=Integer(X1);
        Y := 10;
        Z := X mod Y;
        Edit9.text := FloatToStr(Z);
     
        if Z = 0 then Timer7.enabled:=false;
        if Z = 0 then Timer6.enabled:=true;
                 -
                 -    
        if Z = 9 then Timer7.enabled:=false;
        if Z = 9 then Timer6.enabled:=true;
    end;
     
    procedure TFMain.Timer6Timer(Sender: TObject);
    begin
       boBit[1]:=true;
       UpdateValue(CalcValue);
       Timer7.enabled:=true;
    end;
     
    procedure TFMain.Timer7Timer(Sender: TObject);
    begin
       boBit[1]:=false;
       UpdateValue(CalcValue);
       Timer6.enabled:=false;
    end;

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Moi,

    La solution est si évidente que je te laisse réfléchir.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Octobre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2011
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Bonjour Droggo,

    Merci pour ta réponse. La solution est peut-être si évidente que je ne la voit pas. Tu penses peut-être à stopper le Timer qui effectue la division mais je ne peux pas l'arrêter ou je n'ai plus de résultats et les impulsions envoyées vers le port ne seront pas synchronisées. J'ai pensé à la l'instruction 'break' ou 'go to' mais je ne vois pas comment faire. Mon niveau en Delphi est plutôt débutant, ton aide me serait précieuse et me permettra peut-être d'apprendre quelque chose de plus. D'avance merci.

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Lie,

    Ce n'est pas un problème de connaître un langage, mais du bon sens.

    Exemple :

    Tu as un robinet qui s'ouvre régulièrement, mais tu veux bien évidemment éviter que l'évier (qu'on suppose bouché !) finisse par déborder.

    Que feras-tu ?

    Tu installeras un système qui détectera que l'évier est plein, et qui empêchera l'ouverture du robinet.

    (Cet exemple est volontairement farfelu et hors "programmation" )
    Si les cons volaient, il ferait nuit à midi.

  5. #5
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Salut

    Je rejoint droggo sur ce qu'il dit.

    De plus, si tu me permet, j'ai plusieurs remarques à faire a propos de ton code. Je sais que tu es débutant, donc j'espere que ca te sera utile.

    Pourquoi utiliser le type Variant ? Si j'ai bien compris, ta variable va contenir le texte de ton Edit10 ? Donc, la définir en string est une bonne idée. Pour convertir un string en integer, utilise la fonction StrToInt, ou une de ses dérivée (TryStrToInt, StrToIntDef, F1 si tu ne connais pas ces fonctions)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Edit10.Text;
    Edit9.text
    Timer7;
    Timer6;
    Renomme tes composants ! Tu commence déja a avoir un nombre conséquent d'Edits, tu va finir par t'y perdre ! Par exemple, tu peux les nommer eResultat, eValeur ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        if Z = 0 then Timer7.enabled:=false;
        if Z = 0 then Timer6.enabled:=true;
                 -
                 -    
        if Z = 9 then Timer7.enabled:=false;
        if Z = 9 then Timer6.enabled:=true;
    Plusieurs remarques la :
    Utilise un bloc Begin end :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if Z=0 then
    begin
      Timer7.Enabled:=false;
      Timer6.Enabled:=true;
    end;
    Utilise un case of :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    case Z of :
      0 : begin
            ...
           end;
      1 :
      9 : 
    end;
    Enfin, pourquoi faire des tests, si l'action à effectuer est la même ?

    Dernier point : ton programme contient plein de Timer, c'est généralement signe d'un probleme de conception. Explique nous exactement le but de ton programme, et on verra si on peut faire differement.

    PS : un conseil, n'utilise JAMAIS l'instruction goto

  6. #6
    Membre à l'essai
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Octobre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2011
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Bonjour Droggo et Mick605,

    Merci pour vos réponses et conseils pertinents. La totalité du programme que je veux réaliser contient 3 parties. Les deux premières parties fonctionnent déjà et je suis tout à la fin de la troisième partie. Cette troisième partie consiste en ceci : on part d'un chiffre qui est une fréquence qui varie irrégulièrement et est actualisé chaque seconde.Je dois envoyer une impulsion vers un port parallèle à chaque changement de 100 Hz. J'ai conçu un système de division qui par le reste me donne une variation de 100Hz. C'est le but de la division ci-dessus. Chaque fois que le reste est différent cela veut dire que la fréquence de départ à varié de 100Hz et que je dois envoyer une et une seule impulsion au port. La valeur du reste n'a pas donc pas d'importance, chaque valeur n'est là que pour indiquer qu'il faut envoyer une impulsion.
    Encore merci pour le temps que vous me consacrez. Ce ne sera pas peine perdue puisqu' une fois le programme terminé je le mettrai à disposition gratuitement d'une autre communauté.

  7. #7
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par Cisco1 Voir le message
    on part d'un chiffre qui est une fréquence qui varie irrégulièrement et est actualisé chaque seconde.
    Comment est actualisé cette valeur ? Si c'est par programme, c'est au moment ou tu affecte ta nouvelle valeur que tu dois envoyer ton impulsion.

    Je ne comprends pas bien ton histoire de fréquence. Peut tu nous montrer des valeurs en exemple, et nous dire a quelles valeurs il faudrait envoyer ton impulsion ?

    Comment fonctionne ton impulsion ? Le coup des 2 Timers n'est pas propre. Peut tu nous poster le code de UpdateValue ?

  8. #8
    Membre à l'essai
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Octobre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2011
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Bonjour Mick605,

    Mon programme reçoit les données d'un autre programme par DDE. La valeur de la fréquence est actualisée dans ce programme. La fréquence est supérieure à 100 MHz (ex.123456789 Hz) et peut aller jusqu'à 1GHz. C'est très gentil à toi de vouloir me refaire un programme très propre mais dans ce cas cela va te prendre beaucoup de temps et ce forum n'est pas destiné à cela je pense. Je ne désire pas refaire mon programme, je voudrais juste une solution en partant de ma dernière division qui est dans mon premier message. Les 'Timer' me permettent de régler la durée de l'état haut et de l'état bas de l'impulsion.
    Le code UpdateValue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TFMain.UpdateValue(bTmp:byte);
    begin
    if CheckBox1.checked then Out32(PPAddr,bTmp);
    end;
    J'utilise un fichier DLL (inpout32.dll) pour l'accès au port parallèle.
    Merci encore pour ton aide.

  9. #9
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Dans ce cas, il te faut stocker dans une variable intermediaire OldFreq la valeur a laquelle a eu lieu ta derniere impulsion, et la comparer avec ta valeur actuelle. Si la différence est de 100, tu renvoie une impulsion et tu stocke ta nouvelle valeur dans OldFreq.

    Pour ton impulsion, tu peux gerer en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure SendImpulsion;
    begin
      boBit[1]:=true;
      UpdateValue(CalcValue);
      Sleep(100);   //ici, tu met la durée de ton impulsion, en millisecondes
      boBit[1]:=false;
      UpdateValue(CalcValue);
    end;
    Et tu appelles cette procedure dans le code du Timer5.

    Bonne chance

  10. #10
    Membre à l'essai
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Octobre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2011
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Bonjour Mick605

    Merci pour ta réponse. Je vais utiliser le code que tu m'a fait parvenir et faire les modifications que tu me conseilles. Mais peux-tu me dire comment stocker dans une variable intermédiaire et comment faire pour comparer les valeurs ? Quelles instructions utiliser ?

    Merci encore.

  11. #11
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Il te suffit de déclarer ta variable (section var du programme), puis d'affecter une valeur avec :=
    Ensuite, tu compare la différence de tes variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (OldFreq-Valeur)>100 then
    Ceci constitue quand même la base de la programmation. Si tu ne sais pas ca, je te conseille vivement de te tourner vers des cours ou tutoriels ...

  12. #12
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Abs(OldFreq-Valeur)>100 then
    si la variation peut être dans les 2 sens
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  13. #13
    Membre à l'essai
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Octobre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2011
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Bonjour à tous,

    Merci à Mick605 pour son aide et aussi à Tourlourou pour sa remarque qui va peut être me servir aussi. J'ai besoin de quelques jours pour terminer, je vous tiens au courant. Bonne continuation à tous et merci de consacrer bénévolement un peu de votre temps aux débutants.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/04/2015, 02h31
  2. [XL-2010] Impression sur nouvelle page pour chaque valeur différente d'une colonne
    Par matthieu.rolland dans le forum Excel
    Réponses: 3
    Dernier message: 02/02/2015, 16h54
  3. Réponses: 4
    Dernier message: 28/05/2010, 17h11
  4. gettime 2 résultats différents pour une meme date
    Par krolineeee dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 05/03/2007, 14h36
  5. Résultats différent entre une requête SQL, et la même en VBA
    Par thetaps dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 23/09/2005, 12h05

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