Bonjour,
J'ai une application en VB 6.0 pour des postes en WINDOWS 98.
J'aurai besoin de lire les paramètres régionaux de WINDOWS et de pouvoir
éventuellement les changer.
Cela fonctionne avec WINDOWS XP en modifiant la base de registre mais je
n'arrive pas à le faire sous WINDOWS 98.
Quelqu'un aurait il une réponse à ce problème ?
Bonjour,
J'ai une application en VB 6.0 pour des postes en WINDOWS 98.
J'aurai besoin de lire les paramètres régionaux de WINDOWS et de pouvoir
éventuellement les changer.
Cela fonctionne avec WINDOWS XP en modifiant la base de registre mais je
n'arrive pas à le faire sous WINDOWS 98.
Quelqu'un aurait il une réponse à ce problème ?
Bonjour,
J'ai une application en VB 6.0 pour des postes en WINDOWS 98.
J'aurai besoin de lire les paramètres régionaux de WINDOWS et de pouvoir
éventuellement les changer.
Cela fonctionne avec WINDOWS XP en modifiant la base de registre mais je
n'arrive pas à le faire sous WINDOWS 98.
Quelqu'un aurait il une réponse à ce problème ?
Salut CBR!
Juste un avis, ce n'est pas une bonne idée de modifier l'environnement de
travail, ton logiciel devrait plutôt s'y adapter étant donnée que ton
logiciel n'est pas le seul à fonctionner sur un poste..
Voici comment les lire :
http://groups.google.com/groups?selm=uZEoG4QNDHA.2308%40TK2MSFTNGP11.phx.gbl
Pour les modifier, cela dépend de tes besoins.. explique nous un peu ce que
tu souhaiterais faire.
Salut CBR!
Juste un avis, ce n'est pas une bonne idée de modifier l'environnement de
travail, ton logiciel devrait plutôt s'y adapter étant donnée que ton
logiciel n'est pas le seul à fonctionner sur un poste..
Voici comment les lire :
http://groups.google.com/groups?selm=uZEoG4QNDHA.2308%40TK2MSFTNGP11.phx.gbl
Pour les modifier, cela dépend de tes besoins.. explique nous un peu ce que
tu souhaiterais faire.
Salut CBR!
Juste un avis, ce n'est pas une bonne idée de modifier l'environnement de
travail, ton logiciel devrait plutôt s'y adapter étant donnée que ton
logiciel n'est pas le seul à fonctionner sur un poste..
Voici comment les lire :
http://groups.google.com/groups?selm=uZEoG4QNDHA.2308%40TK2MSFTNGP11.phx.gbl
Pour les modifier, cela dépend de tes besoins.. explique nous un peu ce que
tu souhaiterais faire.
Sur les paramètres régionaux sous XP n'y a t'il pas moyen de récuperer
les paramètres régionaux avec une Api du genre (je ne suis pas sur de
la syntaxe) GetThreadLocale juste pour le thread en cours et de modifier
par SetThreadLocale uniquement le process en cours ? plutôt que d'aller
modifier la base de registre ?
Sur les paramètres régionaux sous XP n'y a t'il pas moyen de récuperer
les paramètres régionaux avec une Api du genre (je ne suis pas sur de
la syntaxe) GetThreadLocale juste pour le thread en cours et de modifier
par SetThreadLocale uniquement le process en cours ? plutôt que d'aller
modifier la base de registre ?
Sur les paramètres régionaux sous XP n'y a t'il pas moyen de récuperer
les paramètres régionaux avec une Api du genre (je ne suis pas sur de
la syntaxe) GetThreadLocale juste pour le thread en cours et de modifier
par SetThreadLocale uniquement le process en cours ? plutôt que d'aller
modifier la base de registre ?
Bonjour Christophe ! :O)
Content de te relire ;O)Sur les paramètres régionaux sous XP n'y a t'il pas moyen de récuperer
les paramètres régionaux avec une Api du genre (je ne suis pas sur de
la syntaxe) GetThreadLocale juste pour le thread en cours et de modifier
par SetThreadLocale uniquement le process en cours ? plutôt que d'aller
modifier la base de registre ?
Yep. Sauf que... :O)
GetThreadLocale() renvoit le "locale id" du thread courrant, comme par
exemple &HC0C qui signifie Français (Canada) sur mon système.
SetThreadLocale() permet de modifier le "locale id" employé par le thread
courant.
GetLocaleInfo() permet de récupérer de l'information d'un "locale id", comme
par exemple le nom et l'id de la langue, le séparateur de décimal, le format
de date long, etc.
SetLocaleInfo() permet de modifier l'information d'un "locale id".
Je pourrais, par exemple, employé SetThreadLocale() et lui passé &H1009, ce
qui modifirais le "locale id" employé par mon programme pour Anglais
(Canada). Ceci n'aura pas d'impact sur les autres processus/threads pendant
ou après l'exécution du programme.
Toutefois, si je *modifie* une information d'un "locale id", comme le format
de date long par exemple, alors tous les processus/threads qui emploient ce
"locale id" en seront affectés sur le champs (et non pas juste à leur
redémarrage) et ce même après l'exécution.
Voici un exemple. L'exemple plus de déclarations qu'il n'en a besoin.. c'est
à titre informatif que je les ai laissé.
'***
Option Explicit
Private Const LOCALE_FR_CA = &HC0C ' Français (Canada)
Private Const LOCALE_EN_CA = &H1009 ' Anglais (Canada)
Private Const SORT_DEFAULT = &H0 ' tri par défaut
Private Const LOCALE_USER_DEFAULT = &H400
Private Enum eLocaleSettings
lsILanguage = &H1 ' language id
lsSLanguage = &H2 ' localized Name of Language
lsSAbbrevLangName = &H3 ' Abbreviated Language Name
lsSNativeLangName = &H4 ' Native Name of Language
lsICountry = &H5 ' country code
lsSCountry = &H6 ' localized Name of Country
lsSAbbrevCtryName = &H7 ' abbreviated country Name
lsSNativeCtryName = &H8 ' Native Name of Country
lsIDefaultLanguage = &H9 ' default language id
lsIDefaultCountry = &HA ' default country code
lsIDefaultCodePage = &HB ' default code page
lsSList = &HC ' List item separator
lsSDecimal = &HE ' Decimal separator
lsIMeasure = &HD ' 0 = metric, 1 = US
lsSThousand = &HF ' thousand separator
lsSGrouping = &H10 ' digit Grouping
lsIDigits = &H11 ' number of fractional digits
lsILZero = &H12 ' leading zeros for decimal
lsSNativeDigits = &H13 ' Native ascii 0-9
lsSCurrency = &H14 ' local Monetary Symbol
lsSIntlSymbol = &H15 ' Intl Monetary Symbol
lsSMonDecimalSEP = &H16 ' Monetary Decimal separator
lsSMonGrouping = &H18 ' Monetary Grouping
lsSMonThousandSep = &H17 ' Monetary thousand separator
lsICurrDigits = &H19 ' # local monetary digits
lsIIntlCurrDigits = &H1A ' # intl monetary digits
lsICurrency = &H1B ' positive currency mode
lsINegCurr = &H1C ' negative currency mode
lsSTime = &H1E ' Time separator
lsSShortDate = &H1F ' short Date format string
lsSLongDate = &H20 ' long Date format string
lsIDate = &H21 ' short date format ordering
lsILDate = &H22 ' long date format ordering
lsITime = &H23 ' time format specifier
lsICentury = &H24 ' century format specifier
lsITLZero = &H25 ' leading zeros in time field
lsIDayLZero = &H26 ' leading zeros in day field
lsIMonlZero = &H27 ' leading zeros in month field
lsS1159 = &H28 ' AM designator
lsS2359 = &H29 ' PM designator
lsSDayName1 = &H2A ' Long Name for MonDay
lsSDayName2 = &H2B ' Long Name for TuesDay
lsSDayName3 = &H2C ' Long Name for WednesDay
lsSDayName4 = &H2D ' Long Name for ThursDay
lsSDayName5 = &H2E ' Long Name for FriDay
lsSDayName6 = &H2F ' Long Name for SaturDay
lsSDayName7 = &H30 ' Long Name for SunDay
lsSAbbrevDayName1 = &H31 ' abbreviated Name for MonDay
lsSAbbrevDayName2 = &H32 ' Abbreviated Name for TuesDay
lsSAbbrevDayName3 = &H33 ' Abbreviated Name for WednesDay
lsSAbbrevDayName4 = &H34 ' Abbreviated Name for ThursDay
lsSAbbrevDayName5 = &H35 ' Abbreviated Name for FriDay
lsSAbbrevDayName6 = &H36 ' Abbreviated Name for SaturDay
lsSAbbrevDayName7 = &H37 ' Abbreviated Name for SunDay
lsSMonthName1 = &H38 ' Long Name for January
lsSMonthName2 = &H39 ' Long Name for February
lsSMonthName3 = &H3A ' Long Name for March
lsSMonthName4 = &H3B ' Long Name for April
lsSMonthName5 = &H3C ' Long Name for May
lsSMonthName6 = &H3D ' Long Name for June
lsSMonthName7 = &H3E ' Long Name for July
lsSMonthName8 = &H3F ' Long Name for August
lsSMonthName9 = &H40 ' Long Name for September
lsSMonthName10 = &H41 ' Long Name for October
lsSMonthName11 = &H42 ' Long Name for November
lsSMonthName12 = &H43 ' Long Name for December
lsSAbbrevMonthName1 = &H44 ' Abbreviated Name for January
lsSAbbrevMonthName2 = &H45 ' Abbreviated Name for February
lsSAbbrevMonthName3 = &H46 ' Abbreviated Name for March
lsSAbbrevMonthName4 = &H47 ' Abbreviated Name for April
lsSAbbrevMonthName5 = &H48 ' Abbreviated Name for May
lsSAbbrevMonthName6 = &H49 ' Abbreviated Name for June
lsSAbbrevMonthName7 = &H4A ' Abbreviated Name for July
lsSAbbrevMonthName8 = &H4B ' Abbreviated Name for August
lsSAbbrevMonthName9 = &H4C ' Abbreviated Name for September
lsSAbbrevMonthName10 = &H4D ' Abbreviated Name for October
lsSAbbrevMonthName11 = &H4E ' Abbreviated Name for November
lsSAbbrevMonthName12 = &H4F ' Abbreviated Name for December
lsSPositiveSign = &H50 ' positive Sign
lsSNegativeSign = &H51 ' negative Sign
lsIPosSignPos = &H52 ' positive sign position
lsINegSignPos = &H53 ' negative sign position
lsIPosSymPrecedes = &H54 ' mon sym precedes pos amt
lsIPosSepBySpace = &H55 ' mon sym sep by space from pos amt
lsINegSymPrecedes = &H56 ' mon sym precedes neg amt
lsINegSepBYSPACE = &H57 ' mon sym sep by space from neg amt
lsSEngLanguage = &H1001 ' English Name of Language
lsSEngCountry = &H1002 ' English Name of Country
lsSTimeFormat = &H1003 ' Time format string
lsNoUserOverride = &H80000000 ' do not use user overrides
End Enum
Private Declare Function GetLocaleInfoA _
Lib "kernel32" ( _
ByVal locale As Long, _
ByVal LCType As Long, _
ByVal lpLCData As String, _
ByVal cchData As Long) As Long
Private Declare Function SetLocaleInfoA _
Lib "kernel32" ( _
ByVal locale As Long, _
ByVal LCType As Long, _
ByVal lpLCData As String) As Long
Private Declare Function GetThreadLocale _
Lib "kernel32" () As Long
Private Declare Function SetThreadLocale _
Lib "kernel32" ( _
ByVal locale As Long) As Long
Private Function GetLocaleInfo(ByRef ls As eLocaleSettings, Optional ByRef
nLCID As Long = LOCALE_USER_DEFAULT) As String
GetLocaleInfo = Space$(256)
GetLocaleInfo = Left$(GetLocaleInfo, GetLocaleInfoA(nLCID, ls,
GetLocaleInfo, 256) - 1)
End Function
Private Function SetLocaleInfo(ByRef ls As eLocaleSettings, ByRef sNewValue
As String, Optional ByRef nLCID As Long = LOCALE_USER_DEFAULT) As Long
SetLocaleInfo = SetLocaleInfoA(nLCID, ls, sNewValue)
End Function
Private Sub Main()
Call TestModifFormatDateLong
Call TestModifLocaleID
End Sub
Private Function TestModifLocaleID()
Dim nLCID As Long
Debug.Print "Modification du LCID courrant"
Debug.Print
nLCID = GetThreadLocale()
Debug.Print "LCID actuel : 0x" & Hex$(nLCID)
Debug.Print "Exemple : " & Format$(Now, "long date")
Debug.Print
' on modifie le LCID actuel
Call SetThreadLocale(LOCALE_EN_CA)
Debug.Print "LCID modifié : 0x" & Hex$(LOCALE_EN_CA)
Debug.Print "Exemple 1 : " & Format$(Now, "long date")
Debug.Print "Exemple 2 : " & Format$(Now,
GetLocaleInfo(eLocaleSettings.lsSLongDate, LOCALE_EN_CA))
Debug.Print
' Vous constaterez que dans l'exemple 1
' la fonction Format$() n'a
' pas changé de format de date même
' si le LCID à été changé.. en effet, il
' faudrait modifié le format de date du
' LCID du système (comme dans la fonction
' TestModifFormatDateLong()) afin d'obtenir
' une différence... ce qui n'est pas pratique.
' Ce fait affecte aussi les autres fonctions
' employant les configs systèmes telles que
' IsDate(), GetDateFormat()
' avant de quitter, on restaure le format de date long
' sinon la modification apporté persitera après l'exécuttion
Call SetThreadLocale(nLCID)
End Function
Private Function TestModifFormatDateLong()
Dim sFormatDateLong As String
Const MON_FORMAT_DATE_LONG As String = "dd MM yyyy"
Debug.Print "Modification du format de date long courrant"
Debug.Print
' avant de commencer, on récupère
' le format de date long actuel
sFormatDateLong = GetLocaleInfo(eLocaleSettings.lsSLongDate)
Debug.Print "Format actuel : " & sFormatDateLong
Debug.Print "Exemple : " & Format$(Now, "long date")
Debug.Print
' on modifie le format de date long actuel
Call SetLocaleInfo(eLocaleSettings.lsSLongDate, MON_FORMAT_DATE_LONG)
Debug.Print "Format modifié : " & MON_FORMAT_DATE_LONG
Debug.Print "Exemple : " & Format$(Now, "long date")
Debug.Print
' ici, si on ouvre le panneau de configuration
' et vérifie le format de date actuel du système, il sera modifié
' Si on ouvre un autre VB et que l'on exécute
' Debug.Print Format$(Now, "long date")
' et bien le format employé sera "dd MM yyyy"
' avant de quitter, on restaure le format de date long
' sinon la modification apporté persitera après l'exécuttion
Call SetLocaleInfo(eLocaleSettings.lsSLongDate, sFormatDateLong)
End Function
Private Function MAKELCID(ByRef wLanguageID As Integer, ByRef wSortID As
Integer) As Long
MAKELCID = (wSortID * &H10000) Or (wLanguageID And &HFFFF)
End Function
Public Function MAKELANGID(ByRef lgidPrimary As Long, ByRef lgidSub As Long)
As Long
MAKELANGID = (LLeftShift(lgidSub, 10) Or lgidPrimary)
End Function
Public Function LLeftShift(ByRef lNum As Long, ByVal lShift As Long) As Long
LLeftShift = lNum * (2 ^ lShift)
End Function
'***
Pour plus de détail sur l'utilisation de MAKELCID(), MAKELANGID() et les
paramètres possibles, consulter la MSDN :
http://msdn.microsoft.com/library/en-us/intl/nls_05kj.asp
Bonjour Christophe ! :O)
Content de te relire ;O)
Sur les paramètres régionaux sous XP n'y a t'il pas moyen de récuperer
les paramètres régionaux avec une Api du genre (je ne suis pas sur de
la syntaxe) GetThreadLocale juste pour le thread en cours et de modifier
par SetThreadLocale uniquement le process en cours ? plutôt que d'aller
modifier la base de registre ?
Yep. Sauf que... :O)
GetThreadLocale() renvoit le "locale id" du thread courrant, comme par
exemple &HC0C qui signifie Français (Canada) sur mon système.
SetThreadLocale() permet de modifier le "locale id" employé par le thread
courant.
GetLocaleInfo() permet de récupérer de l'information d'un "locale id", comme
par exemple le nom et l'id de la langue, le séparateur de décimal, le format
de date long, etc.
SetLocaleInfo() permet de modifier l'information d'un "locale id".
Je pourrais, par exemple, employé SetThreadLocale() et lui passé &H1009, ce
qui modifirais le "locale id" employé par mon programme pour Anglais
(Canada). Ceci n'aura pas d'impact sur les autres processus/threads pendant
ou après l'exécution du programme.
Toutefois, si je *modifie* une information d'un "locale id", comme le format
de date long par exemple, alors tous les processus/threads qui emploient ce
"locale id" en seront affectés sur le champs (et non pas juste à leur
redémarrage) et ce même après l'exécution.
Voici un exemple. L'exemple plus de déclarations qu'il n'en a besoin.. c'est
à titre informatif que je les ai laissé.
'***
Option Explicit
Private Const LOCALE_FR_CA = &HC0C ' Français (Canada)
Private Const LOCALE_EN_CA = &H1009 ' Anglais (Canada)
Private Const SORT_DEFAULT = &H0 ' tri par défaut
Private Const LOCALE_USER_DEFAULT = &H400
Private Enum eLocaleSettings
lsILanguage = &H1 ' language id
lsSLanguage = &H2 ' localized Name of Language
lsSAbbrevLangName = &H3 ' Abbreviated Language Name
lsSNativeLangName = &H4 ' Native Name of Language
lsICountry = &H5 ' country code
lsSCountry = &H6 ' localized Name of Country
lsSAbbrevCtryName = &H7 ' abbreviated country Name
lsSNativeCtryName = &H8 ' Native Name of Country
lsIDefaultLanguage = &H9 ' default language id
lsIDefaultCountry = &HA ' default country code
lsIDefaultCodePage = &HB ' default code page
lsSList = &HC ' List item separator
lsSDecimal = &HE ' Decimal separator
lsIMeasure = &HD ' 0 = metric, 1 = US
lsSThousand = &HF ' thousand separator
lsSGrouping = &H10 ' digit Grouping
lsIDigits = &H11 ' number of fractional digits
lsILZero = &H12 ' leading zeros for decimal
lsSNativeDigits = &H13 ' Native ascii 0-9
lsSCurrency = &H14 ' local Monetary Symbol
lsSIntlSymbol = &H15 ' Intl Monetary Symbol
lsSMonDecimalSEP = &H16 ' Monetary Decimal separator
lsSMonGrouping = &H18 ' Monetary Grouping
lsSMonThousandSep = &H17 ' Monetary thousand separator
lsICurrDigits = &H19 ' # local monetary digits
lsIIntlCurrDigits = &H1A ' # intl monetary digits
lsICurrency = &H1B ' positive currency mode
lsINegCurr = &H1C ' negative currency mode
lsSTime = &H1E ' Time separator
lsSShortDate = &H1F ' short Date format string
lsSLongDate = &H20 ' long Date format string
lsIDate = &H21 ' short date format ordering
lsILDate = &H22 ' long date format ordering
lsITime = &H23 ' time format specifier
lsICentury = &H24 ' century format specifier
lsITLZero = &H25 ' leading zeros in time field
lsIDayLZero = &H26 ' leading zeros in day field
lsIMonlZero = &H27 ' leading zeros in month field
lsS1159 = &H28 ' AM designator
lsS2359 = &H29 ' PM designator
lsSDayName1 = &H2A ' Long Name for MonDay
lsSDayName2 = &H2B ' Long Name for TuesDay
lsSDayName3 = &H2C ' Long Name for WednesDay
lsSDayName4 = &H2D ' Long Name for ThursDay
lsSDayName5 = &H2E ' Long Name for FriDay
lsSDayName6 = &H2F ' Long Name for SaturDay
lsSDayName7 = &H30 ' Long Name for SunDay
lsSAbbrevDayName1 = &H31 ' abbreviated Name for MonDay
lsSAbbrevDayName2 = &H32 ' Abbreviated Name for TuesDay
lsSAbbrevDayName3 = &H33 ' Abbreviated Name for WednesDay
lsSAbbrevDayName4 = &H34 ' Abbreviated Name for ThursDay
lsSAbbrevDayName5 = &H35 ' Abbreviated Name for FriDay
lsSAbbrevDayName6 = &H36 ' Abbreviated Name for SaturDay
lsSAbbrevDayName7 = &H37 ' Abbreviated Name for SunDay
lsSMonthName1 = &H38 ' Long Name for January
lsSMonthName2 = &H39 ' Long Name for February
lsSMonthName3 = &H3A ' Long Name for March
lsSMonthName4 = &H3B ' Long Name for April
lsSMonthName5 = &H3C ' Long Name for May
lsSMonthName6 = &H3D ' Long Name for June
lsSMonthName7 = &H3E ' Long Name for July
lsSMonthName8 = &H3F ' Long Name for August
lsSMonthName9 = &H40 ' Long Name for September
lsSMonthName10 = &H41 ' Long Name for October
lsSMonthName11 = &H42 ' Long Name for November
lsSMonthName12 = &H43 ' Long Name for December
lsSAbbrevMonthName1 = &H44 ' Abbreviated Name for January
lsSAbbrevMonthName2 = &H45 ' Abbreviated Name for February
lsSAbbrevMonthName3 = &H46 ' Abbreviated Name for March
lsSAbbrevMonthName4 = &H47 ' Abbreviated Name for April
lsSAbbrevMonthName5 = &H48 ' Abbreviated Name for May
lsSAbbrevMonthName6 = &H49 ' Abbreviated Name for June
lsSAbbrevMonthName7 = &H4A ' Abbreviated Name for July
lsSAbbrevMonthName8 = &H4B ' Abbreviated Name for August
lsSAbbrevMonthName9 = &H4C ' Abbreviated Name for September
lsSAbbrevMonthName10 = &H4D ' Abbreviated Name for October
lsSAbbrevMonthName11 = &H4E ' Abbreviated Name for November
lsSAbbrevMonthName12 = &H4F ' Abbreviated Name for December
lsSPositiveSign = &H50 ' positive Sign
lsSNegativeSign = &H51 ' negative Sign
lsIPosSignPos = &H52 ' positive sign position
lsINegSignPos = &H53 ' negative sign position
lsIPosSymPrecedes = &H54 ' mon sym precedes pos amt
lsIPosSepBySpace = &H55 ' mon sym sep by space from pos amt
lsINegSymPrecedes = &H56 ' mon sym precedes neg amt
lsINegSepBYSPACE = &H57 ' mon sym sep by space from neg amt
lsSEngLanguage = &H1001 ' English Name of Language
lsSEngCountry = &H1002 ' English Name of Country
lsSTimeFormat = &H1003 ' Time format string
lsNoUserOverride = &H80000000 ' do not use user overrides
End Enum
Private Declare Function GetLocaleInfoA _
Lib "kernel32" ( _
ByVal locale As Long, _
ByVal LCType As Long, _
ByVal lpLCData As String, _
ByVal cchData As Long) As Long
Private Declare Function SetLocaleInfoA _
Lib "kernel32" ( _
ByVal locale As Long, _
ByVal LCType As Long, _
ByVal lpLCData As String) As Long
Private Declare Function GetThreadLocale _
Lib "kernel32" () As Long
Private Declare Function SetThreadLocale _
Lib "kernel32" ( _
ByVal locale As Long) As Long
Private Function GetLocaleInfo(ByRef ls As eLocaleSettings, Optional ByRef
nLCID As Long = LOCALE_USER_DEFAULT) As String
GetLocaleInfo = Space$(256)
GetLocaleInfo = Left$(GetLocaleInfo, GetLocaleInfoA(nLCID, ls,
GetLocaleInfo, 256) - 1)
End Function
Private Function SetLocaleInfo(ByRef ls As eLocaleSettings, ByRef sNewValue
As String, Optional ByRef nLCID As Long = LOCALE_USER_DEFAULT) As Long
SetLocaleInfo = SetLocaleInfoA(nLCID, ls, sNewValue)
End Function
Private Sub Main()
Call TestModifFormatDateLong
Call TestModifLocaleID
End Sub
Private Function TestModifLocaleID()
Dim nLCID As Long
Debug.Print "Modification du LCID courrant"
Debug.Print
nLCID = GetThreadLocale()
Debug.Print "LCID actuel : 0x" & Hex$(nLCID)
Debug.Print "Exemple : " & Format$(Now, "long date")
Debug.Print
' on modifie le LCID actuel
Call SetThreadLocale(LOCALE_EN_CA)
Debug.Print "LCID modifié : 0x" & Hex$(LOCALE_EN_CA)
Debug.Print "Exemple 1 : " & Format$(Now, "long date")
Debug.Print "Exemple 2 : " & Format$(Now,
GetLocaleInfo(eLocaleSettings.lsSLongDate, LOCALE_EN_CA))
Debug.Print
' Vous constaterez que dans l'exemple 1
' la fonction Format$() n'a
' pas changé de format de date même
' si le LCID à été changé.. en effet, il
' faudrait modifié le format de date du
' LCID du système (comme dans la fonction
' TestModifFormatDateLong()) afin d'obtenir
' une différence... ce qui n'est pas pratique.
' Ce fait affecte aussi les autres fonctions
' employant les configs systèmes telles que
' IsDate(), GetDateFormat()
' avant de quitter, on restaure le format de date long
' sinon la modification apporté persitera après l'exécuttion
Call SetThreadLocale(nLCID)
End Function
Private Function TestModifFormatDateLong()
Dim sFormatDateLong As String
Const MON_FORMAT_DATE_LONG As String = "dd MM yyyy"
Debug.Print "Modification du format de date long courrant"
Debug.Print
' avant de commencer, on récupère
' le format de date long actuel
sFormatDateLong = GetLocaleInfo(eLocaleSettings.lsSLongDate)
Debug.Print "Format actuel : " & sFormatDateLong
Debug.Print "Exemple : " & Format$(Now, "long date")
Debug.Print
' on modifie le format de date long actuel
Call SetLocaleInfo(eLocaleSettings.lsSLongDate, MON_FORMAT_DATE_LONG)
Debug.Print "Format modifié : " & MON_FORMAT_DATE_LONG
Debug.Print "Exemple : " & Format$(Now, "long date")
Debug.Print
' ici, si on ouvre le panneau de configuration
' et vérifie le format de date actuel du système, il sera modifié
' Si on ouvre un autre VB et que l'on exécute
' Debug.Print Format$(Now, "long date")
' et bien le format employé sera "dd MM yyyy"
' avant de quitter, on restaure le format de date long
' sinon la modification apporté persitera après l'exécuttion
Call SetLocaleInfo(eLocaleSettings.lsSLongDate, sFormatDateLong)
End Function
Private Function MAKELCID(ByRef wLanguageID As Integer, ByRef wSortID As
Integer) As Long
MAKELCID = (wSortID * &H10000) Or (wLanguageID And &HFFFF)
End Function
Public Function MAKELANGID(ByRef lgidPrimary As Long, ByRef lgidSub As Long)
As Long
MAKELANGID = (LLeftShift(lgidSub, 10) Or lgidPrimary)
End Function
Public Function LLeftShift(ByRef lNum As Long, ByVal lShift As Long) As Long
LLeftShift = lNum * (2 ^ lShift)
End Function
'***
Pour plus de détail sur l'utilisation de MAKELCID(), MAKELANGID() et les
paramètres possibles, consulter la MSDN :
http://msdn.microsoft.com/library/en-us/intl/nls_05kj.asp
Bonjour Christophe ! :O)
Content de te relire ;O)Sur les paramètres régionaux sous XP n'y a t'il pas moyen de récuperer
les paramètres régionaux avec une Api du genre (je ne suis pas sur de
la syntaxe) GetThreadLocale juste pour le thread en cours et de modifier
par SetThreadLocale uniquement le process en cours ? plutôt que d'aller
modifier la base de registre ?
Yep. Sauf que... :O)
GetThreadLocale() renvoit le "locale id" du thread courrant, comme par
exemple &HC0C qui signifie Français (Canada) sur mon système.
SetThreadLocale() permet de modifier le "locale id" employé par le thread
courant.
GetLocaleInfo() permet de récupérer de l'information d'un "locale id", comme
par exemple le nom et l'id de la langue, le séparateur de décimal, le format
de date long, etc.
SetLocaleInfo() permet de modifier l'information d'un "locale id".
Je pourrais, par exemple, employé SetThreadLocale() et lui passé &H1009, ce
qui modifirais le "locale id" employé par mon programme pour Anglais
(Canada). Ceci n'aura pas d'impact sur les autres processus/threads pendant
ou après l'exécution du programme.
Toutefois, si je *modifie* une information d'un "locale id", comme le format
de date long par exemple, alors tous les processus/threads qui emploient ce
"locale id" en seront affectés sur le champs (et non pas juste à leur
redémarrage) et ce même après l'exécution.
Voici un exemple. L'exemple plus de déclarations qu'il n'en a besoin.. c'est
à titre informatif que je les ai laissé.
'***
Option Explicit
Private Const LOCALE_FR_CA = &HC0C ' Français (Canada)
Private Const LOCALE_EN_CA = &H1009 ' Anglais (Canada)
Private Const SORT_DEFAULT = &H0 ' tri par défaut
Private Const LOCALE_USER_DEFAULT = &H400
Private Enum eLocaleSettings
lsILanguage = &H1 ' language id
lsSLanguage = &H2 ' localized Name of Language
lsSAbbrevLangName = &H3 ' Abbreviated Language Name
lsSNativeLangName = &H4 ' Native Name of Language
lsICountry = &H5 ' country code
lsSCountry = &H6 ' localized Name of Country
lsSAbbrevCtryName = &H7 ' abbreviated country Name
lsSNativeCtryName = &H8 ' Native Name of Country
lsIDefaultLanguage = &H9 ' default language id
lsIDefaultCountry = &HA ' default country code
lsIDefaultCodePage = &HB ' default code page
lsSList = &HC ' List item separator
lsSDecimal = &HE ' Decimal separator
lsIMeasure = &HD ' 0 = metric, 1 = US
lsSThousand = &HF ' thousand separator
lsSGrouping = &H10 ' digit Grouping
lsIDigits = &H11 ' number of fractional digits
lsILZero = &H12 ' leading zeros for decimal
lsSNativeDigits = &H13 ' Native ascii 0-9
lsSCurrency = &H14 ' local Monetary Symbol
lsSIntlSymbol = &H15 ' Intl Monetary Symbol
lsSMonDecimalSEP = &H16 ' Monetary Decimal separator
lsSMonGrouping = &H18 ' Monetary Grouping
lsSMonThousandSep = &H17 ' Monetary thousand separator
lsICurrDigits = &H19 ' # local monetary digits
lsIIntlCurrDigits = &H1A ' # intl monetary digits
lsICurrency = &H1B ' positive currency mode
lsINegCurr = &H1C ' negative currency mode
lsSTime = &H1E ' Time separator
lsSShortDate = &H1F ' short Date format string
lsSLongDate = &H20 ' long Date format string
lsIDate = &H21 ' short date format ordering
lsILDate = &H22 ' long date format ordering
lsITime = &H23 ' time format specifier
lsICentury = &H24 ' century format specifier
lsITLZero = &H25 ' leading zeros in time field
lsIDayLZero = &H26 ' leading zeros in day field
lsIMonlZero = &H27 ' leading zeros in month field
lsS1159 = &H28 ' AM designator
lsS2359 = &H29 ' PM designator
lsSDayName1 = &H2A ' Long Name for MonDay
lsSDayName2 = &H2B ' Long Name for TuesDay
lsSDayName3 = &H2C ' Long Name for WednesDay
lsSDayName4 = &H2D ' Long Name for ThursDay
lsSDayName5 = &H2E ' Long Name for FriDay
lsSDayName6 = &H2F ' Long Name for SaturDay
lsSDayName7 = &H30 ' Long Name for SunDay
lsSAbbrevDayName1 = &H31 ' abbreviated Name for MonDay
lsSAbbrevDayName2 = &H32 ' Abbreviated Name for TuesDay
lsSAbbrevDayName3 = &H33 ' Abbreviated Name for WednesDay
lsSAbbrevDayName4 = &H34 ' Abbreviated Name for ThursDay
lsSAbbrevDayName5 = &H35 ' Abbreviated Name for FriDay
lsSAbbrevDayName6 = &H36 ' Abbreviated Name for SaturDay
lsSAbbrevDayName7 = &H37 ' Abbreviated Name for SunDay
lsSMonthName1 = &H38 ' Long Name for January
lsSMonthName2 = &H39 ' Long Name for February
lsSMonthName3 = &H3A ' Long Name for March
lsSMonthName4 = &H3B ' Long Name for April
lsSMonthName5 = &H3C ' Long Name for May
lsSMonthName6 = &H3D ' Long Name for June
lsSMonthName7 = &H3E ' Long Name for July
lsSMonthName8 = &H3F ' Long Name for August
lsSMonthName9 = &H40 ' Long Name for September
lsSMonthName10 = &H41 ' Long Name for October
lsSMonthName11 = &H42 ' Long Name for November
lsSMonthName12 = &H43 ' Long Name for December
lsSAbbrevMonthName1 = &H44 ' Abbreviated Name for January
lsSAbbrevMonthName2 = &H45 ' Abbreviated Name for February
lsSAbbrevMonthName3 = &H46 ' Abbreviated Name for March
lsSAbbrevMonthName4 = &H47 ' Abbreviated Name for April
lsSAbbrevMonthName5 = &H48 ' Abbreviated Name for May
lsSAbbrevMonthName6 = &H49 ' Abbreviated Name for June
lsSAbbrevMonthName7 = &H4A ' Abbreviated Name for July
lsSAbbrevMonthName8 = &H4B ' Abbreviated Name for August
lsSAbbrevMonthName9 = &H4C ' Abbreviated Name for September
lsSAbbrevMonthName10 = &H4D ' Abbreviated Name for October
lsSAbbrevMonthName11 = &H4E ' Abbreviated Name for November
lsSAbbrevMonthName12 = &H4F ' Abbreviated Name for December
lsSPositiveSign = &H50 ' positive Sign
lsSNegativeSign = &H51 ' negative Sign
lsIPosSignPos = &H52 ' positive sign position
lsINegSignPos = &H53 ' negative sign position
lsIPosSymPrecedes = &H54 ' mon sym precedes pos amt
lsIPosSepBySpace = &H55 ' mon sym sep by space from pos amt
lsINegSymPrecedes = &H56 ' mon sym precedes neg amt
lsINegSepBYSPACE = &H57 ' mon sym sep by space from neg amt
lsSEngLanguage = &H1001 ' English Name of Language
lsSEngCountry = &H1002 ' English Name of Country
lsSTimeFormat = &H1003 ' Time format string
lsNoUserOverride = &H80000000 ' do not use user overrides
End Enum
Private Declare Function GetLocaleInfoA _
Lib "kernel32" ( _
ByVal locale As Long, _
ByVal LCType As Long, _
ByVal lpLCData As String, _
ByVal cchData As Long) As Long
Private Declare Function SetLocaleInfoA _
Lib "kernel32" ( _
ByVal locale As Long, _
ByVal LCType As Long, _
ByVal lpLCData As String) As Long
Private Declare Function GetThreadLocale _
Lib "kernel32" () As Long
Private Declare Function SetThreadLocale _
Lib "kernel32" ( _
ByVal locale As Long) As Long
Private Function GetLocaleInfo(ByRef ls As eLocaleSettings, Optional ByRef
nLCID As Long = LOCALE_USER_DEFAULT) As String
GetLocaleInfo = Space$(256)
GetLocaleInfo = Left$(GetLocaleInfo, GetLocaleInfoA(nLCID, ls,
GetLocaleInfo, 256) - 1)
End Function
Private Function SetLocaleInfo(ByRef ls As eLocaleSettings, ByRef sNewValue
As String, Optional ByRef nLCID As Long = LOCALE_USER_DEFAULT) As Long
SetLocaleInfo = SetLocaleInfoA(nLCID, ls, sNewValue)
End Function
Private Sub Main()
Call TestModifFormatDateLong
Call TestModifLocaleID
End Sub
Private Function TestModifLocaleID()
Dim nLCID As Long
Debug.Print "Modification du LCID courrant"
Debug.Print
nLCID = GetThreadLocale()
Debug.Print "LCID actuel : 0x" & Hex$(nLCID)
Debug.Print "Exemple : " & Format$(Now, "long date")
Debug.Print
' on modifie le LCID actuel
Call SetThreadLocale(LOCALE_EN_CA)
Debug.Print "LCID modifié : 0x" & Hex$(LOCALE_EN_CA)
Debug.Print "Exemple 1 : " & Format$(Now, "long date")
Debug.Print "Exemple 2 : " & Format$(Now,
GetLocaleInfo(eLocaleSettings.lsSLongDate, LOCALE_EN_CA))
Debug.Print
' Vous constaterez que dans l'exemple 1
' la fonction Format$() n'a
' pas changé de format de date même
' si le LCID à été changé.. en effet, il
' faudrait modifié le format de date du
' LCID du système (comme dans la fonction
' TestModifFormatDateLong()) afin d'obtenir
' une différence... ce qui n'est pas pratique.
' Ce fait affecte aussi les autres fonctions
' employant les configs systèmes telles que
' IsDate(), GetDateFormat()
' avant de quitter, on restaure le format de date long
' sinon la modification apporté persitera après l'exécuttion
Call SetThreadLocale(nLCID)
End Function
Private Function TestModifFormatDateLong()
Dim sFormatDateLong As String
Const MON_FORMAT_DATE_LONG As String = "dd MM yyyy"
Debug.Print "Modification du format de date long courrant"
Debug.Print
' avant de commencer, on récupère
' le format de date long actuel
sFormatDateLong = GetLocaleInfo(eLocaleSettings.lsSLongDate)
Debug.Print "Format actuel : " & sFormatDateLong
Debug.Print "Exemple : " & Format$(Now, "long date")
Debug.Print
' on modifie le format de date long actuel
Call SetLocaleInfo(eLocaleSettings.lsSLongDate, MON_FORMAT_DATE_LONG)
Debug.Print "Format modifié : " & MON_FORMAT_DATE_LONG
Debug.Print "Exemple : " & Format$(Now, "long date")
Debug.Print
' ici, si on ouvre le panneau de configuration
' et vérifie le format de date actuel du système, il sera modifié
' Si on ouvre un autre VB et que l'on exécute
' Debug.Print Format$(Now, "long date")
' et bien le format employé sera "dd MM yyyy"
' avant de quitter, on restaure le format de date long
' sinon la modification apporté persitera après l'exécuttion
Call SetLocaleInfo(eLocaleSettings.lsSLongDate, sFormatDateLong)
End Function
Private Function MAKELCID(ByRef wLanguageID As Integer, ByRef wSortID As
Integer) As Long
MAKELCID = (wSortID * &H10000) Or (wLanguageID And &HFFFF)
End Function
Public Function MAKELANGID(ByRef lgidPrimary As Long, ByRef lgidSub As Long)
As Long
MAKELANGID = (LLeftShift(lgidSub, 10) Or lgidPrimary)
End Function
Public Function LLeftShift(ByRef lNum As Long, ByVal lShift As Long) As Long
LLeftShift = lNum * (2 ^ lShift)
End Function
'***
Pour plus de détail sur l'utilisation de MAKELCID(), MAKELANGID() et les
paramètres possibles, consulter la MSDN :
http://msdn.microsoft.com/library/en-us/intl/nls_05kj.asp