Win API
Які функції Windows API дозволяють отримати змінні DOS?
ФункціяGetEnvironmentVariableповертає значення змінних середовища опитуваного процесу. Величина також повертається у вигляді рядка із завершальним нулем.
Зміна системного часу з Delphi
Як я можу змінити системний час Windows 95 із програми, написаної на Delphi 2.0?
Ось правильне рішення:
// Функція (розділ Public) SetPCSystemTime змінює системну дату та час.
// Параметр(и) : tDati Нова дата та час
// Значення, що повертаються: True - успішне завершення
function SetPCSystemTime(tDati: TDateTime): Boolean;
wYear:= StrToInt(FormatDateTime('yyyy', tSetDati));
wMonth:= StrToInt(FormatDateTime('mm', tSetDati));
wMinute:= StrToInt(FormatDateTime('nn', tSetDati));
wSecond:= StrToInt(FormatDateTime('ss', tSetDati));
Завершення роботи Windows
Події, що відбуваються в програмах Delphi під час завершення роботи Windows
Я провів невелике дослідження, і ось що я з'ясував:
При закритті програми (використовуючи системне меню або викликаючи метод закриття форми), виникають такі події:
1. FormCloseQuery – дія за умовчанням, встановлює змінну CanClose у значення TRUE та продовжує закриття форми.
Якщо програма активна і ви намагаєтеся завершити роботу Windows (Shut Down), відбуваються такі події (з дотриманням послідовності):
Ми бачимо, що метод FormClose у цьому випадку не викликається.
Тепер відтворимо всю послідовність подій, що відбувається під час спроби завершити роботу Windows:
1. Windows надсилає повідомлення WM_QUERYENDSESSION усім додаткам і чекає на відповідь.
2.Кожна програма отримує повідомлення і повертає одну з величин: не рівну нулю - програма готова завершити свою роботу, 0 - програма не може завершити свою роботу.
3. Якщо один із програм повертає 0, Windows не завершує свою роботу, а знову розсилає всім вікнам повідомлення, цього разу WM_ENDSESSION.
4. Кожен додаток повинен знову підтвердити свою готовність завершити роботу, тому операційна система чекає відповіді TRUE, резонно припускаючи, що додатки, що залишилися, з моменту попереднього повідомлення закрили свої сесії і готові завершити роботу. Тепер подивимося, як на це реагує Delphi-додаток: програма повертає значення TRUE і негайно викликає метод FormDestroy, ігноруючи при цьому метод FormClose. Наявна проблема.
5. Завершення роботи Windows.
Перше вирішення проблеми: Delphi на повідомлення WM_QUERYENDSESSION повинен повернути 0, не давши при цьому Windows завершити свою роботу. При цьому безглуздо намагатися скористатися методом FormCloseQuery, оскільки немає можливості визначити винуватця завершення роботи програми (це може бути результатом повідомлення WM_QUERYENDSESSION, так і просто дією користувача при спробі закрити програму).
Інше рішення полягає в тому, щоб при отриманні повідомлення WM_QUERYENDSESSION самим виконати необхідні дії, викликавши метод FormClose.
uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;