KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Валентин Озеров, "Советы по Delphi. Версия 1.4.3 от 1.1.2001" бесплатно, без регистрации.
Перейти на страницу:

 CheckDigit := Copy(ISBN, Length(ISBN), 1);

 {Получаем остальную часть, ISBN минус контрольная цифра и дефис}

 Number := Copy(ISBN, 1, Length(ISBN) - 2);

 {Длина разницы ISBN должны быть 11 и контрольная цифра между 0 и 9, или X}

 if (Length(Number) = 11) and (Pos(CheckDigit, '0123456789X') > 0) then begin

{Получаем числовое значение контрольной цифры}

  if (CheckDigit = 'X') then 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 — там всё есть.

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

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

Используй GetMessage(), в качестве HWND окна пиши NULL (на Паскале — 0). Если в очереди сообщений следующее — WM_QUIT, то эта функция фозвращает FALSE. Если ты пишешь программу для Win32, то запихни это в отдельный поток, организующий выход из программы.

Постепенное умирание

The_Sprite пишет:

Вопрос: А как реализовать в одном компоненте такие функции как выключение компьютера, перезагрузка, завершение сеанса работы пользователя, Eject CD, выключение питания монитора и т.д.? Ответ: предлагаем посмотреть следующий пример…

Совместимость: все версии Delphi

Пример:

procedure TForm1.Button1Click(Sender: TObject);

begin

 PowerControl1.Action:=actCDEject;// Или...

 actLogOFF, actShutDown...

 PowerControl1.Execute;

end

Component Code:

unit

 PowerControl;

interface


uses WinTypes, WinProcs, Messages, SysUtils, Classes, Controls,Forms, Graphics,MMSystem;

type

TAction =(actLogOFF,actShutDown,actReBoot,actForce,actPowerOFF,

 actForceIfHung,actMonitorOFF,actMonitorON,actCDEject,actCDUnEject);


type TPowerControl = class(TComponent)

private

 FAction : TAction;

 procedure SetAction(Value : TAction); protected

public

 function Execute :Boolean;

published

 property Action :TAction read FAction write SetAction;

end;


procedure Register;


implementation


procedure Register;

begin

 RegisterComponents('K2',[TPowerControl]);

end;


procedure TPowerControl.SetAction(Value : TAction);

begin

 FAction := Value;

end;


function TPowerControl.Execute : Boolean;

begin

 with (Owner as TForm) do case FAction of

  actLogOff: ExitWindowsEx(EWX_LOGOFF, 1);

  actShutDown: ExitWindowsEx(EWX_SHUTDOWN, 1);

  actReBoot:ExitWindowsEx(EWX_REBOOT, 1);

  actForce:ExitWindowsEx(EWX_FORCE, 1);

  actPowerOff:ExitWindowsEx(EWX_POWEROFF, 1);

  actForceIfHung:ExitWindowsEx(EWX_FORCEIFHUNG, 1);

  actMonitorOFF:SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0);

  actMonitorON: SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1);

  actCDEject: mciSendstring('SET CDAUDIO DOOR OPEN WAIT', nil, 0, Handle);

  actCDUnEject: mciSendstring('SET CDAUDIO DOOR CLOSED WAIT', nil, 0, Handle);

 end; {Case}

 Result := True;

end;


end.

Разное

Как не допустить запуск второй копии программы VIII

Игорь Пролис рекомендует следующий код:

{*******************************************************}

{                                                       }

{                     HTMLCoolEdit                      }

{                                                       }

{           Copyright (c) 1999-2000 PROFOX              }

{                                                       }

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*