Микроконтролери и електроника
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/