StrToDate(Edit1.Text);

   EXCEPT

    Edit1.SetFocus;

    MessageBeep(0);

    raise Exception.Create('"'+Edit1.Text + '" – некорректная дата');

   END {try};

   Edit1.Text:= DateToStr(StrToDate(Edit1.Text));

 END{if};

END;

<p>Win API</p><p>Переменные среды</p><p>Получение переменных DOS</p>

Какие функции Windows API позволяют получить переменные DOS?

Функция GetEnvironmentStrings возвращает адрес памяти со средой текущего процесса. Все переменные возвращаются в виде строк, оканчивающихся нулем. Набор строк терминируется двумя нулями.

Функция GetEnvironmentVariable возвращает значения переменных среды опрашиваемого процесса. Величина также возвращается в виде строки с завершающим нулем.

<p>Изменение системного времени из Delphi</p>

Как я могу сменить системное время 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;

<p>Завершение работы Windows</p><p>События, происходящие в приложениях Delphi при завершении работы Windows</p>

Я провел небольшое исследование, и вот что я выяснил:

При закрытии приложения (используя системное меню или вызывая метод закрытия формы), возникают следующие события:

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.

Перейти на страницу:

Похожие книги