Ciao,
anni fa mi era successa la stessa cosa, col l'istruzione "TryStrToFloat", poi ho scoperto che la stessa istruzione era stata ridefinita con un parametro in più: "Const FormatSettings: TFormatSettings".
Da allora, chiamo questa col parametro in più, passandogli come ultimo parametro una mia variabile "FormatSettings" contenente i valori che voglio io.
Solitamente invece del componente TEdit uso TFloatSpinEdit così posso leggere o assegnare il valore tramite la proprietà Value e bypasso il problema.
Virgola e punto vengono convertiti nel carattere di sistema automaticamente dopo la digitazione.
DefaultFormatSettings.DecimalSeparator
DefaultFormatSettings.DefaultFormatSettings
2) controllare la documentazione dei singoli oggetti che generano numeri in formato stringa per verificare che non ci siano problematiche.
Ovviamente la varibile di cui sopra DOVRA' ESSERE USATA in tutte le funzioni di conversione. Non ci sono alternative.
Per la scrittura nei vari "posti", anche li ci sono poche soluzioni se non prevedere delle tipologie di conversione a priori.
Altro consiglio: non esporre mai un numero float in stringa a meno che non sia impossibile altrimenti. E' fondamentale ciò.
Ok con TFloatSpinEdit si può prendere il value e fare i calcoli giusti però essendo un componente che rappresenta un numero "reale" sotto forma di stringa per essere visibile, se cambia (da solo) il decimalseparator lui mi farà vedere il numero con un altro decimal separator.
Infatti anch'io penso, a questo punto, che non ci siano alternative, però se il problema si manifesta, con lo stesso programma, solo su alcune macchine, allora vuol dire che una problematica c'è ed è propria di quelle macchine.La problematica è legata ai settaggi del sistema operativo o a qualche componente che filtra i dati (può essere anche qualche funzione del SO stessa).
Fai attenzione, ciò che non è definito può sempre generare situazioni non previste. Se non imposti l'uso del "TFormatSetting" nelle funzioni di conversione che interessano le stringhe vuol dire che ti và bene quello che ti arriva:Un momento, forse mi sbaglierò ma io la vedo in questo modo:
l'esempio stupido è con i separatori di data e ora ... a seconda della "formazione" del PC questi possono essere (anzi sono) diversi, anche se tutti sono settati con la lingua Italiana ... Win XP, Win 7, Win 8, Win 10, Win 11 ... aggiornamenti ....
Potresti valutare anche un "TMaskEdit": gli dici tu direttamente come vuoi che venga scritto quel valoreSi, "TMaskEdit" lo uso per le date, per i numeri uso altri sistemi, ma qui il problema non è solo quello che inserisce l'utente, per esempio mentre il programma preleva i dati da db e li sta visualizzando ad un certo punto gli cambia (da solo) il separatore decimale di default e li visualizza con la virgola, i dati dell'utente invece rimangono col punto, insomma una bella confusione
Ricordo che ero giunto alla conclusione che gli Os Windows installati con setup inglese avevano questo problema, mentre quelli installati con setup italiano no.Questo potrebbe essere una cosa da approfondire.
Un momento, forse mi sbaglierò ma io la vedo in questo modo:Non conosco quella definizione (ossia "defaultsettings"), e bisogna vedere come è implementata nel codice FPC (o Lazarus). Essendo un parametro di default mi aspetto che possa comunque in qualche modo variare una volta modificata in risposta al cambiamento di ambiente o ad altre cause. Non mi fido a priori delle "cose" automatiche che non conosco.
Non è che mi va bene quello che arriva, io uso l'istruzione defaultsettings.decimalseparator:='.' e mi aspetto che dentro il programma il punto sia il separatore decimale, a prescindere da cosa ci sia fuori.
E infatti così funziona perfettamente nel 90% delle installazioni.
Function TryStrToFloat(Const S : String; Out Value: Extended): Boolean;
begin
Result:=TryStrToFloat(S,Value,DefaultFormatSettings);
end;
Function TryStrToFloat(Const S : String; Out Value: Extended; Const FormatSettings: TFormatSettings): Boolean;
Begin
Result := TextToFloat(PChar(pointer(S)), Value,FormatSettings);
End;
Per quanto riguarda il componente TFloatSpindEdit, nel pacchetto LazControls c'è un'alternativa chiamata TFloatSpindEditEx che ha più opzioni, tipo la possibilità di usare il formato scientifico, un diverso separatore decimale, nascondere i pulsanti ect...
Una cosa che non mi piace di questa tipologia di componenti è che mostrano anche gli zeri non significativi dopo la virgola.
A titolo informativo, ho risolto con poche righe di codice creado un nuovo componente derivato dalla classe TFloatSpindEditEx con una funzione ValueToStr modificata che elimina gli zeri superflui.