Вопрос по MFC: Как мне проконтролировать, какой день, месяц, год выбрал юзверь в элементе управления DateTimePicker. Желаетельно стобы эти значения были целого типа (int). Очень надеюсь на Ваш ответ. Заранее спасибо.
Доброе время суток, LONGOBARD! В этом компоненте есть такое свойство, как DateTime. unsigned short year; unsigned short month; unsigned short day; DateTimePicker->DateTime.DecodeDate(&year, &month, &day); В итоге у тебя в соответствующих переменных соответствующие данные.
Ответ отправлен: 17.07.2003, 10:23 Отправитель: Eugene Отвечает Avl2k
Приветствую Вас, LONGOBARD! 1. Если нужно получить дату после закрытия диалога, то добавляете с помощью ClassWizard'а в диалог переменную нужного типа (CTime или COleDateTime). Из этой переменной забираете нужные Вам значения c помощью соответствующих методов классов CTime/COleDateTime. 2. Если хотите работать с контролом напрямую, можете устанавливать/получать дату с помощью методов CDateTimeCtrl::SetTime/GetTime опять же через классы СTime/COleDateTime. 3. Если нужно отслеживать изменение даты до закрытия диалога, обработайте нотификацию DTN_DATETIMECHANGE: void CMyDlg::OnDateTimeChangeDateTimePicker1(NMHDR* pNMHDR, LRESULT* pResult) { NMDATETIMECHANGE* p = (NMDATETIMECHANGE*)pNMHDR; if(p->dwFlags == GDT_VALID) { CTime t( p->st ); AfxMessageBox( t.Format("%x") ); } else AfxMessageBox("zzz");
*pResult = 0; } С уважением, Avl2k. Ответ отправлен: 18.07.2003, 16:12 Отправитель: Avl2k
Вопрос № 941
как в С скопировать директорию с вложенными директориями. В RSDN этот вопрос рассмотрен лишь в общем. Что здесь неправильно? int CopyFile::Copy(LPCTSTR pszPath, LPCTSTR toPath) { // Преобразуем путь к строке с двойным нулевым //символом в конце
TCHAR buf[_MAX_PATH + 1]; _tcscpy(buf, pszPath); buf[_tcslen(buf)+1]=0; // Устанавливаем ппараметры SHFILEOPSTRUCT для операции копирования wFunc = FO_COPY; pFrom = buf; pTo = toPath; fFlags |= FOF_ALLOWUNDO; return SHFileOperation(this); // do it! } Где можно взять рабочий исходник?
Приветствую Вас, Lerich! У меня вот так все работает: int Copy(LPCTSTR fromPath, LPCTSTR toPath) { TCHAR fromBuf[_MAX_PATH + 1]; _tcscpy(fromBuf, fromPath); fromBuf[_tcslen(fromBuf)+1]=0; TCHAR toBuf[_MAX_PATH + 1]; _tcscpy(toBuf, toPath); toBuf[_tcslen(toBuf)+1]=0; SHFILEOPSTRUCT fops; memset( &fops, 0, sizeof( fops ) ); fops.wFunc = FO_COPY; fops.pFrom = fromBuf; fops.pTo = toBuf; fops.fFlags |= FOF_ALLOWUNDO; return SHFileOperation(&fops); // do it! } int main() { return Copy( "c:\php", "c:\temp\php"); } Обратите внимание, что строка пути назначения тоже должна заканчиваться двойным нулем. С уважением, Avl2k. Ответ отправлен: 17.07.2003, 12:26 Отправитель: Avl2k
Вопрос № 942
Здрасти все! У меня такой ламерский вопрос - как можно округлять числа, не применяя всякие printf, и пр. - то есть был dNum=0.12345, а стал 0.123? Искал в MSDN что-нибудь типа round, а нету... Заранее благодарен.
Доброе время суток, Ренат! На самом деле вопрос совсем не ламерский, т.к. стандартных средств округлить число, скажем до восьмого знака после запятой, нет вообще. Используются разнообразные алгоритмы типа как я написал в приложении Успехов
Приложение: Ответ отправлен: 17.07.2003, 10:13 Отправитель: Yuri Gordienko Отвечает Eugene
Доброе время суток, Ренат! А чем тебе не нравится floor и ceil? floor(0.12345 * 1000) / 1000 = 0.123 Ответ отправлен: 17.07.2003, 10:06 Отправитель: Eugene Отвечает Avl2k
Здравствуйте, Ренат! Можно, например, так double round( double val, unsigned int prec ) { unsigned int m = 1; while( prec-- ) m *= 10; double x = 0.5; if( val < 0 ) x = -x; modf( val * m + x, &x ); return x / m; } Однако округление на вещественных числах 1. не имеет особого смысла (имеет смысл только для вывода, что и делают функция printf и др.), поскольку в расчетах они все равно будут участвовать с полным количеством знаков; 2. часто будет глючить, поскольку многие десятичные дроби не представимы конечными двоичными числами, т.е. если мы ожидаем получить 0.125, то на самом деле что-то типа получим 0.124999999999993. С уважением, Avl2k. Ответ отправлен: 17.07.2003, 12:12 Отправитель: Avl2k Отвечает DiGiT[old]
Здравствуйте, Ренат! нет нельзя. А printf тоже не округляет. Но мона делать вроде этого: int(dNum*1000)/1000.0, то есть используя мат. выражения Ответ отправлен: 17.07.2003, 13:05 Отправитель: DiGiT[old]
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.