Советы по Delphi. Версия 1.4.3 от 1.1.2001 - страница 8

стр.

>CheckSum := 10

>  else Val(CheckDigit, CheckSum, Err);

>  {Извлекаем в цикле все цифры из кода ISBN, применяя алгоритм декодирования}

>  Cnt := 1;

for i := 1 to 12 do begin

>{Действуем, если только текущий символ находится между "0" и "9", исключая дефисы}

>   if (Pos(Number[i], '0123456789') > 0) then begin

>Val(Number[i], CheckValue, Err);

>    {Алгоритм для каждого символа кода ISBN, Cnt - n-й обрабатываемый символ}

>    CheckSum := CheckSum + CheckValue * (11 - Cnt);

>    Inc(Cnt);

>   end;

end;

>  {Проверяем делимость без остатка полученного значения на 11}

if (CheckSum MOD 11 = 0) then IsISBN := True

else IsISBN := False;

> end

> else IsISBN := False;

>end;

Это примитивный пример, сильно упрощенный для лучшего понимания алгоритма декодирования кода ISBN. В реальной жизни (приложении) имеется немало мелочей, которые необходимо учесть для нормальной работы. Для примера, описанная выше функция требует от кандидата ISBN строку паскалевского типа с дефисами, разделяющими четыре части кода. В качестве дополнительной функциональности можно проверять кандидата ISBNs на наличие дефисов. Другой полезной вещью могла бы быть проверка на наличие трех дефисов на нужных позициях, а не простая проверка на наличие необходимых одиннадцати символов-цифр.

API

Переменные среды

Как раскрыть строки с подстановками вида '%SystemRoot%\IOSUBSYS\'?

Nomadic советует:

Используй вызов

>ExpandEnvironmentStrings(LPCTSTR lpSrc, LPTSTR lpDst, DWORD nSize);

Изменение системного времени из Delphi II

Delphi 1

Можно. Попробуйте следующий код:

>Procedure settime(hour, min, sec, hundreths : byte); assembler;

>asm

> mov  ch, hour

> mov  cl, min

> mov  dh, sec

> mov  dl, hundreths

> mov  ah, $2d

> int  $21

>end;

>Procedure setdate(year : word; month, day : byte); assembler;

>asm

> mov  cx, year

> mov  dh, month

> mov  dl, day

> mov  ah, $2b

> int  $21

>end;

Завершение работы Windows

Определение завершения работы Windows

НОМЕР ДОКУМЕНТА: TI3133

ПРОДУКТ: Delphi

Версия: 1.0

ОС: Windows

Дата: 1 октября, 1996

Тема: Определение завершения работы Windows

Существует ли возможность определения завершения работы Windows для нормального завершения работы работающего приложения Delphi?

Самым простым решением является создание обработчика события главной формы OnCloseQuery. Данное событие возникает как результат сообщения WM_QUERYENDSESSION, которое посылается всем работающим приложениям Windows в момент инициализации процесса окончания работы Windows. Логическая переменная CanClose, передаваемая обработчику как var-параметр, может позволить программе (и Windows) завершить свою работу, если имеет значение True, значение же False не позволит программе завершить свою работу.

Следующий код демонстрирует как можно воспользоваться данным событием.

Демонстрационный код

>procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

>begin

> {Спрашиваем пользователя, если инициировано завершение работы.}

if MessageDlg('Вы уверены?', mtConfirmation, mbYesNoCancel, 0) = mrYes then CanClose := true    {Разрешаем завершение работы.}

else CanClose := false; {Не разрешаем завершение работы.}

>end;

Как консольное приложение может узнать, что Винды завершаются?

Nomadic рекомендует следующий код:

Все процессы получают сигналы CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT и CTRL_SHUTDOWN_EVENT. А делается это (грубо говоря :) так:

>BOOL Ctrl_Handler(DWORD Ctrl) {

> if ((Ctrl == CTRL_SHUTDOWN_EVENT) || (Ctrl == CTRL_LOGOFF_EVENT)) {

>  // Вау! Юзер обламывает!

> } else {

>  // Тут что-от другое можно творить. А можно и не творить :-)

> }

> return TRUE;

>}


>function Ctrl_Handler(Ctrl: Longint): LongBool;

>begin

> if Ctrl in [CTRL_SHUTDOWN_EVENT, CTRL_LOGOFF_EVENT] then begin

>// Вау, вау

> end

> else begin

>// Am I creator?

end;

> Result := true;

>end;

А где-то в программе:

>SetConsoleCtrlHandler(Ctrl_Handler, TRUE);

Таких обработчиков можно навесить кучу. Если при обработке какого-то из сообщений обработчик возвращает FALSE, то вызывается следующий обработчик. Можно настроить таких этажерок, что ого-го :-)))

Короче, смотри описание SetConsoleCtrlHandler — там всё есть.

Как корректно перехватить сигнал выгрузки операционной системы, если в моей программе нет окна?