|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:23 am
|
Страница 1 от 1
|
[ 6 мнения ] |
|
EditBox с прикрепена към него променлива от тип COleDateTime
| Автор |
Съобщение |
|
todorov8001
Ранг: Минаващ
Регистриран на: Нед Юли 24, 2005 3:35 pm Мнения: 62 Местоположение: Стара Загора
|
 EditBox с прикрепена към него променлива от тип COleDateTime
MFC на VC++6.0 подържа директно COleDateTime като тип на променлива прикачена към текстово поле. Всичко е чудесно ако се използват само US форматите за дати и време. При мен проблема се явява когато уиндолса е с зададена регионална настройка България.
При извеждани на записаната в променлива дата и време в контролата няма проблем. Изписва се в следния формат 11.05.2008г. 18:00:00. Обаче дори и тази стойност изобщо да не е редактирана в контролата при опита за обратен трансфер на данните от контролите към променливите излиза съобщение за некоректен формат на данните за тази контрола. След малко експериментиране установих че е заради г. ако го няма си приема данните. Трябва да реша този проблем. Най-простото решение да не ползвам COleDateTime за променливата а да си напиша аз код които да прави преобразуванията в и от стринг,а променливата да я задам като CString, но това със сигурност не е най-елегантното решение. Някой имали предложение за по елегантно решение. Ако някой се е сблъсквал с този проблем бих бил много благодарен да сподели опит по въпроса.
Предварително благодаря на всички.
|
| Нед Май 11, 2008 5:33 pm |
|
 |
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 27, 2005 12:48 pm Мнения: 6094
|
Borland имат локални регионални настройки за самото ЕХЕ
би трябвало и MFC да има - просто синтаксиса е различен...
за Window търси в гоогле LOCALE_SLONGDATE, LOCALE_SSHORTDATE.......
в делфито са тези
var CurrencyString: string;
var CurrencyFormat: Byte;
var NegCurrFormat: Byte;
var ThousandSeparator: Char;
var DecimalSeparator: Char;
var CurrencyDecimals: Byte;
var DateSeparator: Char;
var ShortDateFormat: string;
var LongDateFormat: string;
var TimeSeparator: Char;
var TimeAMString: string;
var TimePMString: string;
var ShortTimeFormat: string;
var LongTimeFormat: string;
var ShortMonthNames: array[1..12] of string;
var LongMonthNames: array[1..12] of string;
var ShortDayNames: array[1..7] of string;
var LongDayNames: array[1..7] of string;
var SysLocale: TSysLocale;
var EraNames: array[1..7] of string;
var EraYearOffsets: array[1..7] of Integer;
var TwoDigitYearCenturyWindow: Word = 50;
var ListSeparator: Char;
_________________ main[-1u]={1};
|
| Нед Май 11, 2008 5:50 pm |
|
 |
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 9:59 pm Мнения: 6019 Местоположение: София
|
Някой от по-тъпите български програми са си решили проблема по много идеотски начин. Набиват в регистриро регионални настройки с които работи програмата. 90% от потребителите не забелязват и не обръщат внимание
че вместо 11.05.2008г. 18:00:00 е 11.05.2008 18:00:00. .... а и работи ...
_________________ Warriors of the Night, ASSEMBLER!!!
|
| Нед Май 11, 2008 7:30 pm |
|
 |
|
todorov8001
Ранг: Минаващ
Регистриран на: Нед Юли 24, 2005 3:35 pm Мнения: 62 Местоположение: Стара Загора
|
Че ще стани така спор няма.Може би е сред най-простотите решения, но мисля че е доста далеч от елегантното. 
|
| Нед Май 11, 2008 7:49 pm |
|
 |
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 27, 2005 12:48 pm Мнения: 6094
|
@todorov8001
Това е по Win API-то, би трябва да е най-елегантното...
Друг начин е да ограничиш писането на букви в Edit полето
или да си намериш компонент "календар"
_________________ main[-1u]={1};
|
| Нед Май 11, 2008 9:40 pm |
|
 |
|
todorov8001
Ранг: Минаващ
Регистриран на: Нед Юли 24, 2005 3:35 pm Мнения: 62 Местоположение: Стара Загора
|
За сега си реших проблема чрез модификация на функцията за обмен на данни между контролите и променливите.
void CDialogL::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
HWND hWndCtrl = pDX->PrepareEditCtrl(IDC_EDITDATA);
if (pDX->m_bSaveAndValidate)
{
int nLen = ::GetWindowTextLength(hWndCtrl);
CString strTemp;
::GetWindowText(hWndCtrl, strTemp.GetBufferSetLength(nLen), nLen+1);
strTemp.ReleaseBuffer();
int i=strTemp.Find("г.",0);
if(i<0)i=strTemp.Find("Г.",0);
if(i>=0)
{
strTemp.Delete(i,2);
::SetWindowText(hWndCtrl,strTemp);
}
}
//{{AFX_DATA_MAP(CDialogL)
DDX_Text(pDX, IDC_EDITDATA, m_cData);
//}}AFX_DATA_MAP
}
|
| Пон Май 12, 2008 6:47 pm |
|
|
|
Страница 1 от 1
|
[ 6 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 0 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|