StrToDate(Edit1.Text);
EXCEPT
Edit1.SetFocus;
MessageBeep(0);
raise Exception.Create('"'+Edit1.Text + '" – некорректная дата');
END {try};
Edit1.Text:= DateToStr(StrToDate(Edit1.Text));
END{if};
END;
Win API
Переменные среды
Получение переменных DOS
Какие функции Windows API позволяют получить переменные DOS?
Функция GetEnvironmentStrings возвращает адрес памяти со средой текущего процесса. Все переменные возвращаются в виде строк, оканчивающихся нулем. Набор строк терминируется двумя нулями.
Функция GetEnvironmentVariable возвращает значения переменных среды опрашиваемого процесса. Величина также возвращается в виде строки с завершающим нулем.
Изменение системного времени из Delphi
Как я могу сменить системное время Windows 95 из программы, написанной на Delphi 2.0?
Вот правильное решение:
//*************************************************************************
// Функция (раздел Public) SetPCSystemTime изменяет системную дату и время.
// Параметр(ы) : tDati Новая дата и время
// Возвращаемые значения: True – успешное завершение
// False – метод не сработал
//*************************************************************************
function SetPCSystemTime(tDati: TDateTime): Boolean;
var
tSetDati: TDateTime;
vDatiBias: Variant;
tTZI: TTimeZoneInformation;
tST: TSystemTime;
begin
GetTimeZoneInformation(tTZI);
vDatiBias := tTZI.Bias / 1440;
tSetDati := tDati + vDatiBias;
with tST do begin
wYear:= StrToInt(FormatDateTime('yyyy', tSetDati));
wMonth:= StrToInt(FormatDateTime('mm', tSetDati));
wDay:= StrToInt(FormatDateTime('dd', tSetDati));
wHour:= StrToInt(FormatDateTime('hh', tSetDati));
wMinute:= StrToInt(FormatDateTime('nn', tSetDati));
wSecond:= StrToInt(FormatDateTime('ss', tSetDati));
wMilliseconds:= 0;
end;
SetPCSystemTime:= SetSystemTime(tST);
end;
Завершение работы Windows
События, происходящие в приложениях Delphi при завершении работы Windows
Я провел небольшое исследование, и вот что я выяснил:
При закрытии приложения (используя системное меню или вызывая метод закрытия формы), возникают следующие события:
1. FormCloseQuery – действие по умолчанию, устанавливает переменную CanClose в значание TRUE и продолжает закрытие формы.
2. FormClose
3. FormDestroy
Если приложение активно и вы пытаетесь завершить работу Windows (Shut Down), происходят следующие события (с соблюдением последовательности):
1. FormCloseQuery
2. FormDestroy
Мы видим, что метод FormClose в этом случае не вызывается.
Теперь воспроизведем всю последовательность событий, происходящую при попытке завершить работу Windows:
1. Windows посылает сообщение WM_QUERYENDSESSION всем приложениям и ожидает ответ.
2. Каждое приложение получает сообщение и возвращает одну из величин: не равную нулю – приложение готово завершить свою работу, 0 – приложение не может завершить свою работу.
3. Если одно из приложений возвращает 0, Windows не завершает свою работу, а снова рассылает всем окнам сообщение, на этот раз WM_ENDSESSION.
4. Каждое приложение должно снова подтвердить свою готовность завершить работу, поэтому операционная система ожидает ответа TRUE, резонно предполагая, что оставшиеся приложения с момента предыдущего сообщения закрыли свои сессии и готовы завершить работу. Теперь посмотрим, как на это реагирует Delphi-приложение: приложение возвращает значение TRUE и немедленно вызывает метод FormDestroy, игнорируя при этом метод FormClose. Налицо проблема.
5. Завершение работы Windows.