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 :

Erreur "n'est pas une valeur en virgule flottante correcte"


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2021
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services de proximité

    Informations forums :
    Inscription : Décembre 2021
    Messages : 164
    Points : 187
    Points
    187
    Par défaut Erreur "n'est pas une valeur en virgule flottante correcte"
    Bonjour,

    Cela fait quelques temps que j'ai ce problème et j'aimerais bien enfin le comprendre!

    J'ai un logiciel qui me permet d'extraire des points GPS (données récupérées sur le site de l'ARCEP) pour me créer un fichier Excel exploitable, et éventuellement créer une carte sur MyMaps.

    Ce qui est bizarre c'est que l'erreur apparait seulement quand le programme n'est pas lancé en mode administrateur .
    Nom : logiciel.jpg
Affichages : 480
Taille : 34,1 Ko
    Nom : erreur.jpg
Affichages : 477
Taille : 16,5 Ko
    La capture vient de l'écran d'un utilisateur, et si je lance l'application en tant qu'administrateur depuis la même session ça 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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    procedure TGESTION.BtCreationLotClick(Sender: TObject);
    var
       XlApp,XlBook,
       XlSheet                : Variant;
     
       Ligne                  : Integer;
     
       Long1,Long2,
       Lat1,Lat2              : Extended;
     
    begin
      Screen.Cursor := CrHourGlass;
      If (Edit1.Text <> '') And (Edit2.Text <> '') Then
      With Query1 Do
      Begin
        Long1 := StrToFloat(Trim(Copy(Edit1.Text,Pos(',',Edit1.Text)+1,Length(Edit1.Text))));
        Long2 := StrToFloat(Trim(Copy(Edit2.Text,Pos(',',Edit2.Text)+1,Length(Edit2.Text))));
        Lat1  := StrToFloat(Copy(Edit1.Text,0,Pos(',',Edit1.Text)-1));
        Lat2  := StrToFloat(Copy(Edit2.Text,0,Pos(',',Edit2.Text)-1));
        Close;
        SQL.Clear;
        SQL.Add('SELECT CAST(CONCAT(trim(TRAILING ''0'' FROM latitude),'','',trim(trailing ''0'' from longitude))as char(100)) as gps, ');
        SQL.Add('num_voie,S,concat(type_voie,'' '',nom_voie) as voie,code_postal,ville,categ_imb from prise ');
        SQL.Add('where latitude between :latmin and :latmax and longitude between :longmin and :longmax');
        If CBDeployeVille.Checked = True Then
                SQL.Add(' and imb_etat = "deploye"');
        If Lat1-Lat2 < 0 Then
        Begin
          ParamByName('latmin').AsFloat := Lat1;
          ParamByName('latmax').AsFloat := Lat2;
        End
        Else
        Begin
          ParamByName('latmin').AsFloat := Lat2;
          ParamByName('latmax').AsFloat := Lat1;
        End;
     
        If Long1-Long2 < 0 Then
        Begin
          ParamByName('longmin').AsFloat := Long1;
          ParamByName('longmax').AsFloat := Long2;
        End
        Else
        Begin
          ParamByName('longmin').AsFloat := Long2;
          ParamByName('longmax').AsFloat := Long1;
        End;
        Open;
        If FindFirst Then
        Begin
          Ligne := 2;
          XlApp := CreateOleObject('Excel.Application');
          Xlbook := XlApp.Workbooks.Add();
          XlSheet := XlBook.worksheets[1];
          XlApp.Visible := True;
          XlSheet.Cells[1,1].Value := 'GPS';
          XlSheet.Cells[1,2].Value := 'N°';
          XlSheet.Cells[1,3].Value := 'S';
          XlSheet.Cells[1,4].Value := 'VOIE';
          XlSheet.Cells[1,5].Value := 'CP';
          XlSheet.Cells[1,6].Value := 'VILLE';
          XlSheet.Cells[1,7].Value := 'PRISES';
          While Not Eof Do
          Begin
            XlSheet.Cells[Ligne,1].Value := FieldByName('GPS').AsString;
            XlSheet.Cells[Ligne,2].Value := FieldByName('num_voie').AsString;
            XlSheet.Cells[Ligne,3].Value := FieldByName('S').AsString;
            XlSheet.Cells[Ligne,4].Value := FieldByName('voie').AsString;
            XlSheet.Cells[Ligne,5].Value := FieldByName('code_postal').AsString;
            XlSheet.Cells[Ligne,6].Value := FieldByName('ville').AsString;
            XlSheet.Cells[Ligne,7].Value := FieldByName('categ_imb').AsString;
            Ligne := Ligne + 1;
            Next;
          End;
        End;
      End;
      Screen.Cursor := CrDefault;
    end;
    En farfouillant sur google j'ai pu lire que ça pouvait venir des paramètres régionaux de la session qui peut accepter soit les virgules soit les points? Ca me semble bizarre

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 812
    Points : 13 527
    Points
    13 527
    Par défaut
    Citation Envoyé par PetitBoutDeCode Voir le message
    si je lance l'application en tant qu'administrateur depuis la même session ça fonctionne...
    Il y a une petite nuance : si l'utilisateur courant est administrateur, la demande d'élévation va uniquement agir sur son jeton (ses droits) et les réglages seront toujours les mêmes. Mais si cet utilisateur a un compte standard, la demande d'élévation entraîne une commutation de session vers celle de l'administrateur pour lequel d'autres réglages peuvent être appliqués.

    Les données distantes utilisent le point comme séparateur décimal. Pour assurer la compatibilité tu devrais renseigner le deuxième paramètre FormatSettings en forçant le point. Ainsi tu t'affranchirais des différences de réglages.

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2021
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services de proximité

    Informations forums :
    Inscription : Décembre 2021
    Messages : 164
    Points : 187
    Points
    187
    Par défaut
    Pour assurer la compatibilité tu devrais renseigner le deuxième paramètre FormatSettings en forçant le point.
    Effectivement ça m'a résolu le problème!

    J'ai changé ces quelques lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Long1 := StrToFloat(Trim(Copy(Edit1.Text,Pos(',',Edit1.Text)+1,Length(Edit1.Text))));
        Long2 := StrToFloat(Trim(Copy(Edit2.Text,Pos(',',Edit2.Text)+1,Length(Edit2.Text))));
        Lat1  := StrToFloat(Copy(Edit1.Text,0,Pos(',',Edit1.Text)-1));
        Lat2  := StrToFloat(Copy(Edit2.Text,0,Pos(',',Edit2.Text)-1));
    Vers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Long1 := StrToFloat(Trim(StringReplace(Copy(Edit2.Text,Pos(',',Edit1.Text)+1,Length(Edit2.Text)),'.',FormatSettings.DecimalSeparator,[])));
        Long2 := StrToFloat(Trim(StringReplace(Copy(Edit2.Text,Pos(',',Edit2.Text)+1,Length(Edit2.Text)),'.',FormatSettings.DecimalSeparator,[])));
        Lat1  := StrToFloat(StringReplace(Copy(Edit1.Text,0,Pos(',',Edit1.Text)-1),'.',FormatSettings.DecimalSeparator,[]));
        Lat2  := StrToFloat(StringReplace(Copy(Edit2.Text,0,Pos(',',Edit2.Text)-1),'.',FormatSettings.DecimalSeparator,[]));
    Bon je l'admet, une ou deux variables en plus ne seraient pas de trop pour améliorer la lisibilité, mais ça fonctionne !

    Merci pour la réponse rapide

  4. #4
    Membre actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Points : 292
    Points
    292
    Par défaut
    Tu peux changer le séparateur décimale une fois pour toutes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     FormatSettings.DecimalSeparator:='.';

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 665
    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 665
    Points : 25 459
    Points
    25 459
    Par défaut
    Changer le FormatSettings global, périlleux !
    Cela pourrait nuire à tous les autres conversions du programme.


    Cela peut se faire nativement et temporairement car StrToFloat accepte un TFormatSettings modifié pour gérer des options spécifiques ou éviter des problèmes de collision entre threads.

    je pense que l'approche correcte évoquée n'a pas été prise en compte :
    Citation Envoyé par Andnotor Voir le message
    Les données distantes utilisent le point comme séparateur décimal. Pour assurer la compatibilité tu devrais renseigner le deuxième paramètre FormatSettings en forçant le point. Ainsi tu t'affranchirais des différences de réglages.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var
      GPSFS: TFormatSettings;
    begin
      GPSFS := TFormatSettings.Create(); // c'est un record c'est Init et non un Create en réalité, pas besoin de libérer
      GPSFS.DecimalSeparator := '.';
     
      Long1 := StrToFloat(Trim(Copy(Edit1.Text,Pos(',',Edit1.Text)+1,Length(Edit1.Text))), GPSFS);
      Long2 := StrToFloat(Trim(Copy(Edit2.Text,Pos(',',Edit2.Text)+1,Length(Edit2.Text))), GPSFS);
      Lat1  := StrToFloat(Copy(Edit1.Text,0,Pos(',',Edit1.Text)-1), GPSFS);
      Lat2  := StrToFloat(Copy(Edit2.Text,0,Pos(',',Edit2.Text)-1), GPSFS);

    FindFirst ? un simple First suffit ... même le Open fait déjà le First ...
    Tout ce code mélanger entre de la DB et du Excel dans un gestionnaire OnClick ... ça manque un peu d'isolation du modèle avec la présentation.

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2021
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services de proximité

    Informations forums :
    Inscription : Décembre 2021
    Messages : 164
    Points : 187
    Points
    187
    Par défaut
    Je n'irais pas jusqu'à dire que je ne l'ai pas prise en compte, mais avec l'exemple de code je comprend beaucoup mieux la réponse maintenant

    C'est pas la première fois que l'on me fait la remarque sur le FindFirst, mais je le trouve pratique pour savoir si je dois ou non continuer l'exécution du code

    Et pour la présentation je plaide coupable, je n'ai même pas renommé mes TEdit, mais pour ma défense l'application ne contient que 2 boutons et 3 Edit...

    Merci pour les conseils!

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 665
    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 665
    Points : 25 459
    Points
    25 459
    Par défaut
    If not IsEmpty Then est plus explicite dans ce cas c'est équivalent à if not BOF and not EOF then c'est à dire on n'est ni Début ni à la fois à Fin, ce qui n'est ce cas que pour un ensemble vide.

    https://docwiki.embarcadero.com/Libr...ataSet.IsEmpty

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/11/2011, 17h28
  2. '' n'est pas une valeur en virgule flottante correcte
    Par laala.hamid dans le forum Bases de données
    Réponses: 8
    Dernier message: 22/08/2011, 11h06
  3. radiobutton erreur n'est pas une valeur entière correcte
    Par pierrot67 dans le forum Bases de données
    Réponses: 3
    Dernier message: 12/03/2006, 21h27
  4. 50.00 n'est pas un nombre en virgule flottante correct
    Par Merfolk dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/01/2006, 00h44
  5. erreur '' n'est pas une valeur entière correcte
    Par ffxlenoir dans le forum Langage
    Réponses: 5
    Dernier message: 02/12/2005, 13h57

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