| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| EditBox с прикрепена към него променлива от тип COleDateTime http://mcu-bg.com/mcu_site/viewtopic.php?f=16&t=5775 |
Страница 1 от 1 |
| Автор: | todorov8001 [ Нед Май 11, 2008 5:33 pm ] |
| Заглавие: | EditBox с прикрепена към него променлива от тип COleDateTime |
MFC на VC++6.0 подържа директно COleDateTime като тип на променлива прикачена към текстово поле. Всичко е чудесно ако се използват само US форматите за дати и време. При мен проблема се явява когато уиндолса е с зададена регионална настройка България. При извеждани на записаната в променлива дата и време в контролата няма проблем. Изписва се в следния формат 11.05.2008г. 18:00:00. Обаче дори и тази стойност изобщо да не е редактирана в контролата при опита за обратен трансфер на данните от контролите към променливите излиза съобщение за некоректен формат на данните за тази контрола. След малко експериментиране установих че е заради г. ако го няма си приема данните. Трябва да реша този проблем. Най-простото решение да не ползвам COleDateTime за променливата а да си напиша аз код които да прави преобразуванията в и от стринг,а променливата да я задам като CString, но това със сигурност не е най-елегантното решение. Някой имали предложение за по елегантно решение. Ако някой се е сблъсквал с този проблем бих бил много благодарен да сподели опит по въпроса. Предварително благодаря на всички. |
|
| Автор: | TheWizard [ Нед Май 11, 2008 5:50 pm ] |
| Заглавие: | |
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; |
|
| Автор: | ike [ Нед Май 11, 2008 7:30 pm ] |
| Заглавие: | |
Някой от по-тъпите български програми са си решили проблема по много идеотски начин. Набиват в регистриро регионални настройки с които работи програмата. 90% от потребителите не забелязват и не обръщат внимание че вместо 11.05.2008г. 18:00:00 е 11.05.2008 18:00:00. .... а и работи ... |
|
| Автор: | todorov8001 [ Нед Май 11, 2008 7:49 pm ] |
| Заглавие: | |
Че ще стани така спор няма.Може би е сред най-простотите решения, но мисля че е доста далеч от елегантното. |
|
| Автор: | TheWizard [ Нед Май 11, 2008 9:40 pm ] |
| Заглавие: | |
@todorov8001 Това е по Win API-то, би трябва да е най-елегантното... Друг начин е да ограничиш писането на букви в Edit полето или да си намериш компонент "календар" |
|
| Автор: | todorov8001 [ Пон Май 12, 2008 6:47 pm ] |
| Заглавие: | |
За сега си реших проблема чрез модификация на функцията за обмен на данни между контролите и променливите. 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 } |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|