Declare Function GetDateFormat Lib "kernel32.dll" Alias "GetDateFormatA" ( _
ByVal Locale As Long, _
ByVal dwFlags As Long, _
lpDate As SYSTEMTIME, _
ByVal lpFormat As String, _
ByVal lpDateStr As String, _
ByVal cchDate As Long) As Long
Проблема с форматом даты. Как определить формат даты на машине?
Выяснилось, что на ней в RegionalOptions в закладке Date установлен короткий формат даты как dd/mm/yyy с разделителем "/".
Проблема в следующем. У меня есть свой собственный контрол. На нём есть календарь (DateTimePicker). У него установлен формат отображения даты в виде "dd:mm:yyyy". Ему передаётся дата в виде выражения Format(<Дата>,"dd:mm:yyyy"), так как, если передавать по-другому, почему-то на некоторых машинах она отображается по-другому, чем вводит пользователей в заблуждение.
Так вот, при передаче даты в таком виде, программа на проблемной машине валилась с ошибкой Invalid procedure call or argument.
Тут такая дилема: на всех машинах, кроме этой, пользователи хотят видеть дату в формате "dd:mm:yyyy". На этой "попрёт" "dd/mm/yyyy" (так именно она отображается при передаче без конвертирования). К тому же на этой машине НЕЛЬЗЯ сменить формат даты, так как он критичен для программы стороннего разработчика.
Сейчас я ввёл условную компиляцию, при которой для этой машины компилируется отдельная версия моей проги, но хочется не париться дальше с этим, и как-то "на лету" определять тип даты, установленной на машине именно в указанной выше опции (не путать с датой в опции Date/Time - меня интересует именно Regional Options)?
Application.International(xlDecimalSeparator)
Я думаю, может здеся можно поискать ответ и на твой вопрос (може есть подходящая константа)...
...шота типа xlDateFormat..
Цитата:
Originally posted by XtreamAll
Как то Cutty Sark мне подсказал насчет системных разделителей (целой и дробной части):
Application.International(xlDecimalSeparator)
Я думаю, может здеся можно поискать ответ и на твой вопрос (може есть подходящая константа)...
...шота типа xlDateFormat..
Как то Cutty Sark мне подсказал насчет системных разделителей (целой и дробной части):
Application.International(xlDecimalSeparator)
Я думаю, может здеся можно поискать ответ и на твой вопрос (може есть подходящая константа)...
...шота типа xlDateFormat..
Чёй-то не могу найти ничего...:{
Цитата:
Originally posted by mhaturov
Чёй-то не могу найти ничего...:{
Чёй-то не могу найти ничего...:{
Application.International(...)
xlDateSeparator
xlDateOrder
xlMonthNameChars
xlMDY
xlMonthLeadingZero
но это все в Экселе. Как в ВБ - не знаю.
По-моему в Ёкселе нету своего формата даты (могу ошибаться) и он юзает системный...
Цитата:
Originally posted by XtreamAll
По-моему в Ёкселе нету своего формата даты (могу ошибаться) и он юзает системный...
По-моему в Ёкселе нету своего формата даты (могу ошибаться) и он юзает системный...
Дык мне системный нужен...:{ Я уже запарился "колдовать", делать горы разных версий екзешников и жертвовать универсальностью. Эта же проблема должна просто очень решаться как-то! Только как?...:x
Цитата:
Originally posted by mhaturov
Дык мне системный нужен...:{ Я уже запарился "колдовать", делать горы разных версий екзешников и жертвовать универсальностью. Эта же проблема должна просто очень решаться как-то! Только как?...:x
Дык мне системный нужен...:{ Я уже запарился "колдовать", делать горы разных версий екзешников и жертвовать универсальностью. Эта же проблема должна просто очень решаться как-то! Только как?...:x
А это:
Код:
не подойдет???
Цитата:
Originally posted by XtreamAll
А это:
не подойдет???
А это:
Код:
Declare Function GetDateFormat Lib "kernel32.dll" Alias "GetDateFormatA" ( _
ByVal Locale As Long, _
ByVal dwFlags As Long, _
lpDate As SYSTEMTIME, _
ByVal lpFormat As String, _
ByVal lpDateStr As String, _
ByVal cchDate As Long) As Long
ByVal Locale As Long, _
ByVal dwFlags As Long, _
lpDate As SYSTEMTIME, _
ByVal lpFormat As String, _
ByVal lpDateStr As String, _
ByVal cchDate As Long) As Long
не подойдет???
Спасибо огромное!
Сегодня попробую!:) :) :)
Цитата:
Originally posted by mhaturov
Спасибо огромное!
Сегодня попробую!:) :) :)
Спасибо огромное!
Сегодня попробую!:) :) :)
http://www.activevb.de/rubriken/apiviewer/index-apiviewereng.html
Цитата:
Originally posted by XtreamAll
http://www.activevb.de/rubriken/apiviewer/index-apiviewereng.html
ошибочка вышла;)
http://www.activevb.de/rubriken/apiviewer/index-apiviewereng.html
ошибочка вышла;)
Большое спасибо!
Цитата:
Originally posted by mhaturov
Большое спасибо!
Большое спасибо!
Незашто;)
...просто вспомнил, что ты как-то интересовался API Viewer-ом...
Код:
' в модуль
Option Explicit
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Public Const LOCALE_SYSTEM_DEFAULT = &H400
Public Const LOCALE_USER_DEFAULT = &H800
Public Const LOCALE_SSHORTDATE As Long = &H1F
Public Const LOCALE_STIMEFORMAT As Long = &H1003
Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long
Private Declare Function GetDateFormat Lib "kernel32" Alias "GetDateFormatA" (ByVal Locale As Long, ByVal dwFlags As Long, lpDate As SYSTEMTIME, ByVal lpFormat As String, ByVal lpDateStr As String, ByVal cchDate As Long) As Long
Public Sub DataLocal()
' 1 способ
Dim lBuffSize As String
Dim sBuffer As String
Dim lRet As Long
Dim sDateFormat As String
lBuffSize = 256
sBuffer = String$(lBuffSize, vbNullChar)
lRet = GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SSHORTDATE, sBuffer, lBuffSize)
If lRet > 0 Then
sDateFormat = Left$(sBuffer, lRet - 1)
MsgBox sDateFormat
End If
' 2 способ
Dim Buffer As String, ST As SYSTEMTIME
With ST
.wDay = 6
.wMonth = 8
.wYear = 2000
End With
Buffer = String(255, 0)
GetDateFormat LOCALE_SYSTEM_DEFAULT, 0, ST, vbNullString, Buffer, Len(Buffer)
Buffer = Left$(Buffer, InStr(1, Buffer, Chr$(0)) - 1)
MsgBox Buffer
End Sub
Option Explicit
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Public Const LOCALE_SYSTEM_DEFAULT = &H400
Public Const LOCALE_USER_DEFAULT = &H800
Public Const LOCALE_SSHORTDATE As Long = &H1F
Public Const LOCALE_STIMEFORMAT As Long = &H1003
Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long
Private Declare Function GetDateFormat Lib "kernel32" Alias "GetDateFormatA" (ByVal Locale As Long, ByVal dwFlags As Long, lpDate As SYSTEMTIME, ByVal lpFormat As String, ByVal lpDateStr As String, ByVal cchDate As Long) As Long
Public Sub DataLocal()
' 1 способ
Dim lBuffSize As String
Dim sBuffer As String
Dim lRet As Long
Dim sDateFormat As String
lBuffSize = 256
sBuffer = String$(lBuffSize, vbNullChar)
lRet = GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SSHORTDATE, sBuffer, lBuffSize)
If lRet > 0 Then
sDateFormat = Left$(sBuffer, lRet - 1)
MsgBox sDateFormat
End If
' 2 способ
Dim Buffer As String, ST As SYSTEMTIME
With ST
.wDay = 6
.wMonth = 8
.wYear = 2000
End With
Buffer = String(255, 0)
GetDateFormat LOCALE_SYSTEM_DEFAULT, 0, ST, vbNullString, Buffer, Len(Buffer)
Buffer = Left$(Buffer, InStr(1, Buffer, Chr$(0)) - 1)
MsgBox Buffer
End Sub
В первом способе получаем формат даты в виде "dd/mm/yyyy", а во втором свою дату форматируем под образец региональных установок.
Во втором способе, по параметру vbNullString он понимает что надо использовать локальные установки даты, но можно и свой задать, а также например, то что получили в первом способе (т.е. пер. sDateFormat)
XtreamAll ;)
Большое спасибо!:) :) :)