Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] XP Sp2 Finlandese...

Semplifico per esigenze di brevità...(non fate commentacci...)
Qualcuno saprebbe dirmi come faccia la seguente serie di istruzioni:
CDbl(Format$("2.8","0,0"))
a dare come risultato: 39296
sull' OS in oggetto?
(Il separatore decimale, nei regional settings, è la virgola) 
Grazie in anticipo

<Raimbaut de Vaqueiras> ha scritto

non ne ho idea. ma il debug di vb
? CDbl(Format$("2.8","0,0"))
da'
28
(esattamente come senza cdbl)
che cosi', come prima impressione, non mi sembra un granche'
invece
? CDbl(Format$("2,8","0.0"))
 2,8
? CDbl(Format$("2,8","0,0"))
 3
ciao, a.



..e questi sono esattamente gli stessi valori che l'OS di test mi
restituisce, al variare delle impostazioni regionali. Ma quel numero,
da dove viene fuori? 
In realtà tutto nasce dal fatto che il tizio non riesce ad installare
un mio programma perchè la seguente routine 
di validazione in InnoSetup, a giudicare dal messaggio, gli
restituisce 0 (ancora più strano), nonostante abbia installato MDAC
2.8:
//CODE
//------------------------------------------------------------------------------
function GetMDACVersion(): Double;
// Ritorna 0 se non installato; 
//------------------------------------------------------------------------------
var
  adocon: Variant;
begin
    try
      adocon := CreateOleObject('ADODB.Connection');
      Result := adocon.Version;
    except
      Result := 0;
    end;
end;
//------------------------------------------------------------------------------
function InitializeSetup(): boolean;
var
  MdacVersion :Double;
begin
  MdacVersion := GetMDACVersion;  // recupera la versione di MDAC
	//Controlla se JET è installato.
  if not IsJETInstalled then
      begin
	       MsgBox( 'Microsoft JET 4.0 is not installed. Cannot
continue. Please download and install the latest JET version at:
http://msdn.microsoft.com/data/downloads/updates/default.aspx
'
        , mbInformation, MB_OK );
	       Result := False;
      end
  //Controlla se MDAC è installato.
  else If MdacVersion = 0  Then
      begin
	       MsgBox( 'MDAC is not installed. Cannot continue. Please
download and install the latest MDAC version at:
http://msdn.microsoft.com/data/downloads/updates/default.aspx
'
        , mbInformation, MB_OK );
	       Result := False;
	     end
	else If MdacVersion < 2.1 Then
	   begin
          MsgBox( 'Your MDAC version is too old. Cannot continue.
Please download and install at least MDAC version 2.1 at:
http://msdn.microsoft.com/data/downloads/updates/default.aspx
  '
          ,  mbInformation, MB_OK );
          //(' + IntToStr(MdacVersion) + ')
          Result := false;
      end
  else
        Result := True;
end;
//END CODE
Ora, poichè anche nella Main del programma ho una funzione che
effettua il medesimo controllo, gli ho mandato un programmino di test
che mi restituisce lo strano numero di cui sopra...
Io credo che come minimo abbia un problema nei settaggi, oppure
che abbia l'OS bacato...
Non c'è stato nessun altro caso del genere che mi sia stato segnalato,
segno che probabilmente non ho fatto cappellate...
Se a qualcuno gli si accende una lampadina....
Ciao

 effettua il medesimo controllo
scusa se sono troppo fuso per ragionamenti piu' fini, e se giro intorno alla 
domanda, mi limito a provare come si puo' far andare il tuo programma:
1. non puoi ricavare e confrontare una stringa col numero di versione, senza 
conversioni strane? in
HKEY_CLASSES_ROOT\CLSID\{54AF9350-1923-11D3-9CA4-00C04F72C514}\InstalledVersion
trovo un reg_sz 2,81,1117,0
2. mdac 2.8 serve? ho appena provato a installarlo su un xp sp2 (+vb6sp6), e 
win ha risposto picche, che li' c'era gia' di meglio.
ciao, a.

win ha risposto picche, che li' c'era gia' di meglio.
...
Di conseguenza, in questo caso, probabilmente Inno trova un errore e
restituisce 0. Ho subito pensato che questo dipenda da qualche errore
di conversione legato alle impostazioni internazionali.
Mi son fatto mandare la schermata con le sue impostazioni e, benchè in
finlandese, sembra comunque che non vi sia nulla di strano. (Tra
l'altro, anche per loro il separatore decimale di default è la
virgola). Poi ho compilato poche righe, che ricalcano sostanzialmente
le routines di validazione di MDAC che precedentemente eseguivo
al lancio del programma:
'//CODE
Option Explicit
Private Sub Form_Load()
Dim AdoVersion    As Double
Dim sMessage      As String
Dim DecSep        As String
Dim objADO        As Object
On Error GoTo ErrH
DecSep = GetDecimalSeparator
Set objADO = CreateObject("ADODB.Connection")
sMessage = sMessage & "ConnAdoVersion: " & objADO.Version & vbCrLf
sMessage = sMessage & "Decimal Separator: " & DecSep & vbCrLf
sMessage = sMessage & "Format: " & Format$(objADO.Version, "0" & _
DecSep & "0") & vbCrLf
AdoVersion = CDbl(Format$(objADO.Version, "0" & DecSep & "0"))
sMessage = sMessage & "StrAdoVersion: " & CStr(AdoVersion) & vbCrLf
ExitHere:
   MsgBox sMessage, vbInformation, "MDAC CHECK"
   Set objADO = Nothing
   End
ErrH:
   sMessage = sMessage & "Error: " & Err.Number & " - " &  _
Err.Description & vbCrLf
   Resume Next
End Sub
Private Function GetDecimalSeparator() As String
   GetDecimalSeparator = Replace$(CStr(1.1), "1", "")
End Function
'//END CODE
E questo è quello che ottengo su computer del tizio:
---------------------------
MDAC CHECK
---------------------------
ConnAdoVersion: 2.8
Decimal Separator: ,
Format: 39 296
StrAdoVersion: 39296
---------------------------
OK   
---------------------------
Non sono sicuro che esistano correlazioni fra le due cose, e mi muovo
un po' a tentoni. Certo che due stranezze fanno un indizio...
Se riuscissi a capire COME viene fuori quel numero, forse potrei
trovare l'origine comune delle due stranezze (e magari rimediare
a qualcosa che non avevo considerato).
Non so se sono riuscito ad essere più chiaro, a quest'ora sono anch'io
un po' fuso...
Ciao


Semplicemente VB interpreta "2.8" come una DATA (2 agosto 2007) e la converte in
double. Controlla il separatore relativo.
Comunque è concettualmente sbagliato utilizzare format$ con stringa di formato
numerica ("0,0") passando però un argomento stringa ("2.8"), visto che così VB
effettua PRIMA una conversione implicita di tale stringa utilizzando le funzioni
*localizzate*, dall'esito quindi dipendente dalla lingua dell'OS.
(a parte che la virgola nella stringa di formato indica il separatore delle
migliaia)
Il modo giusto di procedere è questo:
Dim dblValue As Double
    dblValue = Val("2.8")    ' Val() NON è localizzata, ossia riconosce solo il
. come separatore dei decimali
    Debug.Print Format(dblValue, "0.0") ' nella stringa di formato il separatore
dei decimali è *sempre* il . indipendentemente dai regional settings
-- 
Bye
Raf
-----------------------------------------------------
Funk: cooler than the other side of the pillow.
--------------------------------------------------------------------------------
La mia Cartella di Posta in Arrivo è protetta con SPAMfighter
692 messaggi contenenti spam sono stati bloccati con successo.
Scarica gratuitamente SPAMfighter!

dei decimali è *sempre* il . indipendentemente dai regional settings
Questo è senz'altro giusto, e ne farò tesoro...
Ciao

 conversione a double).
Il codice della routine di validazione di InnoSetup non è VBScript, ma
PascalScript.
      adocon := CreateOleObject('ADODB.Connection');
      Result := adocon.Version;
adocon.Version è senz'altro di tipo BSTR (Basic String), ma il result della
funzione è Double.
Secondo me succede questo:
- la versione è sempre espressa come "Major.minor" con il punto.
- l'interprete di Pascal Script opera una conversione implicita localizzata, che
non interpreta correttamente quella stringa.
Se è così ci sono 2 strade:
a) trovare l'analogo di Val() in Pascal Script (che personalmente non conosco).
b) oppure, far sì che la funzione GetMDACVersion ritorni una stringa ed operare
i confronti tenendo presente questo fatto.
Ad esempio estraendo Major e Minor version dalla stringa.


Raf
Bye

 qualche *congiunzione astrale* particolare sul suo OS.
che in aaaa-mm-gg win abbia sfrondato un po' di "a" finlandesi? :)



Quale delle due? :)
http://img264.imageshack.us/img264/3915/customizeregionalsettinnl6.jpg