Отговори на тема  [ 6 мнения ] 
EditBox с прикрепена към него променлива от тип COleDateTime 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Юли 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 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
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 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
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Юли 24, 2005 3:35 pm
Мнения: 62
Местоположение: Стара Загора
Мнение 
Че ще стани така спор няма.Може би е сред най-простотите решения, но мисля че е доста далеч от елегантното. :)


Нед Май 11, 2008 7:49 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение 
@todorov8001

Това е по Win API-то, би трябва да е най-елегантното...
Друг начин е да ограничиш писането на букви в Edit полето
или да си намериш компонент "календар"

_________________
main[-1u]={1};


Нед Май 11, 2008 9:40 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Юли 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
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 6 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 0 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни