Советы по 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 — там всё есть.
Как корректно перехватить сигнал выгрузки операционной системы, если в моей программе нет окна?