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 :

Faire des calculs et choix du type de variables


Sujet :

Delphi

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Faire des calculs et choix du type de variables
    Bonjour,

    Je me permet d'ouvrir un nouveau post concernant un problème de type de variable sur XE2.

    Voici le bout de code que j'aimerais faire 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
     
    procedure TCalcVEDebb.Button1Click(Sender: TObject);
     
      const
      N4=3600; // secondes
      N5=100;    //mm en m
     
    var
    N1: integer; // Largeur  en mm
    N2: integer; // Hauteur en mm
    N3: integer; // Débit
     
    Resultat:integer; // Vitesse en m/s
     
    begin
      N1:=StrToInt(EDLar.Text);
      N2:=StrToInt(EDHaut.Text);
      N3:=StrToInt(EDDeBR.Text);
     
      Resultat:=N3/N4/(N1/N5)/(N2/N5) ; // calcul du résultat
      Label5.Caption:=Resultat;//affichage du résultat dans un label -->chiffre à virgule
    end;
    L'erreur à la compilation est la suivante:
    E2010 Types incompatibles : 'Integer' et 'Extended'

    J'ai essayé de changer le type des variables mais j'arrive à rien, c'est pour cette raison que je recherche des informations clairs à ce sujet.

    Par la suite, j'aimerais que l'utilisateur à ne saisir que des chiffres dans mes trois Tedit.
    Le résultat dans le Label5 devrait afficher la valeur calculée à deux chiffres après la virgule.Mais je ne sais pas comment paramétrer ça.

    Ps: J'ai travaillé il y a de ça quelques années sur un programme en visual basic 6 que j'utilisais pour mon travail. Le parc informatique à ''subit'' une MAJ sur windows 7 et mon programme en VB6 ne se lance plus, sauf sur une machine virtuel XP, pas vraiment pratique.
    Je cherche donc à comprendre par de petit bout de code (comme celui faisant l'objet de ce post) comment fonctionne Delphi. D'une fois que je serait plus au clair, je compte ''convertir mon code en VB6 vers Delphi qui tourne très bien sur des system en 32 et 64 bits.

    D'avance merci pour votre aide et vos conseils.

  2. #2
    Fxg
    Fxg est déconnecté
    Membre éclairé
    Homme Profil pro
    ingénieur financier
    Inscrit en
    Septembre 2003
    Messages
    510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur financier

    Informations forums :
    Inscription : Septembre 2003
    Messages : 510
    Points : 837
    Points
    837
    Par défaut
    Bonjour

    Tu essayes de stocker le résultat d'un calcul qui peut être un réel dans une variable de type Entier (Integer).

    Il faut donc que tu modifies le type de ta variable Resultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Resultat:float; // Vitesse en m/s
    Après pour l'affichage dans le label il faut convertir le type float en string

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Label5.Caption:=floattostr(Resultat);//affichage du résultat dans un label -->chiffre à virgule
    Pour ta deuxième question sur la saisie uniquement de numériques dans ton TEdit, une petite recherche dasn la FAQ te permettra de trouver cet exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TMyForm.MyEditKeyPress(Sender: TObject; var Key: Char);
    begin
      if not (Key in ['0'..'9', DecimalSeparator, Chr(VK_BACK), Chr(VK_DELETE)]) then
      Key := #0;
      if Key = DecimalSeparator then
        if Pos(DecimalSeparator, MyEdit.Text) <> 0 then
          Key := #0;
    end;
    Un dernier conseil : la lecture des différents tuto disponibles sur le site :
    Ici par exemple

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 787
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 787
    Points : 13 440
    Points
    13 440
    Par défaut
    Il y a plusieurs façons de convertir une valeur flottante en chaîne de caractères :
    • FloatToStr (sans arrondi)
    • FormatFloat (avec arrondi)
    • Format (%f avec arrondi)


    Sous XE2, il y a la propriété NumbersOnly pour limiter la saisie à un nombre entier (mais ne supporte pas les types à virgule).

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    sinon, la division entière se note "div" en Pascal, "/" c'est forcément réel. Tu peux aussi ne conserver que la valeur arrondie (cf Round et Trunc)

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Alors j'ai essayé de remplacer mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Resultat: float; // Vitesse en m/s
    Mais j'ai une nouvelle erreur:

    [DCC Erreur] CalcVEDeb.pas(55): E2003 Identificateur non déclaré : 'float'

    J'ai acheté le livre "Delphi 7 studio'' de Monsieur Olivier Dahan et Paul Toth, mais ce n'est tout de même pas facile d'apprendre.
    J'essaie d'étudier les codes et de parcourir les différents tutos disponible sur le site, mais en général je tombe toujours sur un os...
    C'est pour ces raisons que je passe par le forum lorsque j'ai vraiment de la peine à saisir les subtilités de la programmation sur Delphi XE2.

    Merci encore pour vos informations.

  6. #6
    Membre averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 392
    Points
    392
    Par défaut
    Citation Envoyé par Boule2Bois Voir le message
    Alors j'ai essayé de remplacer mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Resultat: float; // Vitesse en m/s
    Mais j'ai une nouvelle erreur:

    [DCC Erreur] CalcVEDeb.pas(55): E2003 Identificateur non déclaré : 'float'
    La réponse de Fxg est un peu rapide (en pseudo-code ?) : il te précise qu'il faut utiliser une variable de type nombre à virgule flottante : single, double, extended ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // en fait : écris plutôt comme ça :
    var Resultat : double; // Vitesse en m/s

    Citation Envoyé par Boule2Bois Voir le message
    J'ai acheté le livre "Delphi 7 studio'' de Monsieur Olivier Dahan et Paul Toth

    Citation Envoyé par Fxg Voir le message
    Un dernier conseil : la lecture des différents tuto disponibles sur le site :
    Ici par exemple
    C'est en forgeant, que l'on devient forgeron ... il ne te reste plus qu'à lire ...


    Citation Envoyé par Boule2Bois Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TCalcVEDebb.Button1Click(Sender: TObject);
     
      const
      N4=3600; // secondes
      N5=100;    //mm en m
    Es-tu sûr de ta conversion mm -> m : facteur 1000 ?

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 949
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 949
    Points : 5 665
    Points
    5 665
    Par défaut
    Koa,
    Citation Envoyé par archonte Voir le message
    Es-tu sûr de ta conversion mm -> m : facteur 1000 ?
    Aïe, ça fait mal.

    Mais, au moins aussi important, il faut utiliser des noms explicites, ça facilite la lecture (et donc la maintenance), et ça évite les commentaires.

    D'accord, en lisant, je vois le commentaire indiquant que N5 permet de convertir des mm en m, mais quelques lignes plus loin, je ne m'en souviendrai pas forcément, d'autant plus qu'il y a une autre constante ayant un nom très proche.
    Donc, l'appeler - par exemple, ce n'est pas forcément le nom que j'utiliserais - mm_Dans_m permettra de savoir ce que ça signifie, sans avoir à revenir à la définition pour comprendre le code.

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Citation Envoyé par Boule2Bois Voir le message
    Alors j'ai essayé de remplacer mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Resultat: float; // Vitesse en m/s
    Mais j'ai une nouvelle erreur:

    [DCC Erreur] CalcVEDeb.pas(55): E2003 Identificateur non déclaré : 'float'
    float c'est en C, en Pascal c'est Single.

    Citation Envoyé par Boule2Bois Voir le message
    J'ai acheté le livre "Delphi 7 studio'' de Monsieur Olivier Dahan et Paul Toth, mais ce n'est tout de même pas facile d'apprendre.
    J'essaie d'étudier les codes et de parcourir les différents tutos disponible sur le site, mais en général je tombe toujours sur un os...
    C'est pour ces raisons que je passe par le forum lorsque j'ai vraiment de la peine à saisir les subtilités de la programmation sur Delphi XE2.

    Merci encore pour vos informations.
    "Delphi 7 Studio" n'est pas un livre d'initiation...les premiers chapitres ont pour vocation d'expliquer le langage Pascal aux développeur C/C++ ou VB en particulier histoire d'avoir des repères. Mais de façon général il demande un bon niveau au départ.

  9. #9
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 876
    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 876
    Points : 11 365
    Points
    11 365
    Billets dans le blog
    6
    Par défaut
    Pour débuter, il vaut sûrement mieux un "Tout en Poche" par exemple.

    Pour progresser, perfectionner des connaissances établies et découvrir ou approfondir moult domaines, "Delphi 7 Studio" est de premier choix.

  10. #10
    Fxg
    Fxg est déconnecté
    Membre éclairé
    Homme Profil pro
    ingénieur financier
    Inscrit en
    Septembre 2003
    Messages
    510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur financier

    Informations forums :
    Inscription : Septembre 2003
    Messages : 510
    Points : 837
    Points
    837
    Par défaut
    Citation Envoyé par archonte Voir le message
    La réponse de Fxg est un peu rapide (en pseudo-code ?) : il te précise qu'il faut utiliser une variable de type nombre à virgule flottante : single, double, extended ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // en fait : écris plutôt comme ça :
    var Resultat : double; // Vitesse en m/s
    Non pas de pseudo-code mais pseudo tête en l'air, je suis en phase d'aprentissage du C

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonsoir,
    Envoyé par archonte
    Es-tu sûr de ta conversion mm -> m : facteur 1000 ?
    J'ai effectivement oublié un zéro, merci pour cette remarque. A vrai dire je me concentre principalement sur le problème de compilation du code, mais c'est toujours ça de moins à corriger encore merci.

    Malgré toutes vos suggestions, mon code ne fonction toujours pas, j'ai essayé de modifier le type de variable en double, extended, single, etc... J'ai toujours un message me disant ''Type incompatible'' c'est assez décourageant. A croire que c'est le type qui programme qui n'eat pas compatible avec Delphi.

    Je vais allé lire les tutos proposés par Fxg en attendant de pouvoir passer à la librairie pour un livre partant de mon niveau...

    Pour le livre de Paul Toth et Olivier Dahan, je pensais qu'il était possible d'apprendre la programmation, mais en le lisant, même à plusieurs reprises pour certain passage, je n'arrive à rien. A part ça joli bouquin qui doit être très utile lorsque les bases sont acquises.

    Je laisse de coté ce problème de calcul, possible que d'ici quelque mois j'arriverais à faire quelque chose avec ça, mais ça me parait bien compliqué pour un simple calcul. Visual basic est nettement plus simple à comprendre, bien qu'il m'ait fallut plus de 2 ans de travail pour le logiciel que j'ai programmé et qui ne tourne malheureusement pas sur windows7 en 64 bits.

    Encore merci pour vos conseils et d'avoir pris le temps de me répondre.

  12. #12
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 492
    Points
    15 492
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Citation Envoyé par Boule2Bois Voir le message
    Malgré toutes vos suggestions, mon code ne fonctionne toujours pas, j'ai essayé de modifier le type de variable en double, extended, single, etc... J'ai toujours un message me disant ''Type incompatible'' c'est assez décourageant. A croire que c'est le type qui programme qui n'est pas compatible avec Delphi.
    Mais si, ça marche :

    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
     
    program Project1;
     
    {$APPTYPE CONSOLE}
     
    {$R *.res}
     
    uses
      System.SysUtils;
     
    const
      N4=3600; // secondes
      N5=100;  // mm en m
     
    var
      N1: integer; // Largeur  en mm
      N2: integer; // Hauteur en mm
      N3: integer; // Débit
      Resultat: single; // Vitesse en m/s
     
    begin
      N1:=StrToInt('30');
      N2:=StrToInt('20');
      N3:=StrToInt('15');
     
      Resultat := N3/N4/(N1/N5)/(N2/N5) ; // calcul du résultat
     
      writeLn(Resultat); // affichage du résultat
      readLn;
    end.
    En revanche, si je peux donner mon avis, je trouve que l'expression N3/N4/(N1/N5)/(N2/N5) n'est pas très claire. Mais c'est peut-être moi qui ne sais pas la lire.

  13. #13
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 876
    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 876
    Points : 11 365
    Points
    11 365
    Billets dans le blog
    6
    Par défaut
    Passer à Delphi avec des connaissances en VB n'a rien d'insurmontable.

    A une époque où je ne connaissais pas Delphi, mais avais un peu utilisé le Basic et le Pascal, j'ai acheté un livre sur VB6 pour apprendre et évaluer. Ce que j'y ai appris (sans avoir VB sur un PC) m'a ensuite servi à démarrer plus vite en D6.

    Je plussoie les suggestions de choisir des noms (de variables notamment) plus évocateurs, qui faciliteront la lecture et la correction du code. Le Pascal a naturellement une grande qualité de lisibilité dont il faut profiter au maximum.

  14. #14
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Citation Envoyé par Boule2Bois Voir le message
    Bonsoir,


    J'ai effectivement oublié un zéro, merci pour cette remarque. A vrai dire je me concentre principalement sur le problème de compilation du code, mais c'est toujours ça de moins à corriger encore merci.

    Malgré toutes vos suggestions, mon code ne fonction toujours pas, j'ai essayé de modifier le type de variable en double, extended, single, etc... J'ai toujours un message me disant ''Type incompatible'' c'est assez décourageant. A croire que c'est le type qui programme qui n'eat pas compatible avec Delphi.

    Je vais allé lire les tutos proposés par Fxg en attendant de pouvoir passer à la librairie pour un livre partant de mon niveau...

    Pour le livre de Paul Toth et Olivier Dahan, je pensais qu'il était possible d'apprendre la programmation, mais en le lisant, même à plusieurs reprises pour certain passage, je n'arrive à rien. A part ça joli bouquin qui doit être très utile lorsque les bases sont acquises.

    Je laisse de coté ce problème de calcul, possible que d'ici quelque mois j'arriverais à faire quelque chose avec ça, mais ça me parait bien compliqué pour un simple calcul. Visual basic est nettement plus simple à comprendre, bien qu'il m'ait fallut plus de 2 ans de travail pour le logiciel que j'ai programmé et qui ne tourne malheureusement pas sur windows7 en 64 bits.

    Encore merci pour vos conseils et d'avoir pris le temps de me répondre.
    une des grosses différences entre VB et Delphi, c'est que sous VB on n'est pas obligé de déclarer ses variables et leur type est flexible. Sous Delphi, tout ce que tu utilises doit être explicitement déclaré et il y a un typage fort qui fait qu'un Entier ne peux pas être égal à un Réel.

    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
     
    var
      a: Integer; // Entier
      b: Single; // Réel
      c: string; // chaîne 
    begin
      a := 1; // ok  
      b := a; // ok car on augmente la précision
      a := b; // non, il faut convertir par Round(b) ou Trunc(b)
      c := a; // non, ça n'a pas de sens en Pascal
      c := IntToStr(a); // oui
      c := FloatToStr(b); // oui
      a := c; //  non, là encore ça n'a pas de sens en Pascal
      a := StrToInt(c); // oui, et éventuellement ça déclenche une exception
      b := StrToInt(c); // oui, comme pour b := a
      b := StrToFloat(c); // oui
    end;
    les mêmes règles s'appliquent aux opérations
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    var
      a, b: Integer;
      c, d: Single;
      e, f: string;
    begin
      a := a + b; // ok
      a := c + d; // impossible
      e := a + f; // impossible
      e := e + 'a'; // ok
      f := IntToStr(a) + FloatToStr(c) + e; // ok
    end;
    on distinguera donc sans ambiguïté : 1 + 2 = 3 de '1' + '2' = '12', l'opération 1 + '2' est elle interdite.

  15. #15
    Membre averti

    Homme Profil pro
    ingénieur, retraité
    Inscrit en
    Février 2007
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur, retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 230
    Points : 332
    Points
    332
    Par défaut
    Bonjour,

    Pour comprendre l'expression il faut savoir que le DEBIT est en m3/h (enfin je l'espére) il le divise par 3600 pour avoir un débit en m3/s, puis il divise par une surface en m2( longueur/1000 x largeur/1000) pour obtenir la vitesse en
    m/s.
    PL

Discussions similaires

  1. Réponses: 19
    Dernier message: 24/07/2012, 16h51
  2. [formulaire] faire des calculs
    Par gyzmo5 dans le forum IHM
    Réponses: 7
    Dernier message: 08/02/2006, 13h43
  3. utiliser données texte pour faire des calculs
    Par sarah67 dans le forum Access
    Réponses: 20
    Dernier message: 06/02/2006, 14h09
  4. Faire des calculs automatiques en JavaScript
    Par yoyot dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 28/02/2005, 10h31
  5. Réponses: 8
    Dernier message: 18/09/2002, 03h20

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