LibKing » Книги » comp-programming » Валентин Озеров - Советы по Delphi. Версия 1.0.6

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

Тут можно читать онлайн Валентин Озеров - Советы по Delphi. Версия 1.0.6 - бесплатно полную версию книги (целиком). Жанр: comp-programming. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте LibKing.Ru (ЛибКинг) или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
libking
  • Название:
    Советы по Delphi. Версия 1.0.6
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    5/5. Голосов: 81
  • Избранное:
    Добавить в избранное
  • Ваша оценка:

Валентин Озеров - Советы по Delphi. Версия 1.0.6 краткое содержание

Советы по Delphi. Версия 1.0.6 - описание и краткое содержание, автор Валентин Озеров, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Советы по Delphi. Версия 1.0.6 - читать онлайн бесплатно полную версию (весь текст целиком)

Советы по Delphi. Версия 1.0.6 - читать книгу онлайн бесплатно, автор Валентин Озеров
Тёмная тема

Шрифт:

Сбросить

Интервал:

Закладка:

Сделать

4. Каждое приложение должно снова подтвердить свою готовность завершить работу, поэтому операционная система ожидает ответа TRUE, резонно предполагая, что оставшиеся приложения с момента предыдущего сообщения закрыли свои сессии и готовы завершить работу. Теперь посмотрим, как на это реагирует Delphi-приложение: приложение возвращает значение TRUE и немедленно вызывает метод FormDestroy, игнорируя при этом метод FormClose. Налицо проблема.

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

Первое решение проблемы: приложение Delphi на сообщение WM_QUERYENDSESSION должно возвратить 0, не дав при этом Windows завершить свою работу. При этом бессмысленно пытаться воспользоваться методом FormCloseQuery, поскольку нет возможности определить виновника завершения работы приложения (это может являться как результатом сообщения WM_QUERYENDSESSION, так и просто действием пользователя при попытке закрыть приложение).

Другое решение состоит в том, чтобы при получении сообщения WM_QUERYENDSESSION самим выполнить необходимые действия, вызвав метод FormClose.

Пример:

unit Unit1;

interface

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

type TForm1 = class(TForm)

procedure FormClose(Sender: TObject; var Action: TCloseAction);

private

{--------------------------------------------------------}

{ Объявляем свой обработчик сообщения WM_QUERYENDSESSION }

{--------------------------------------------------------}

procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;

public

{ Public declarations }

end;

var Form1: TForm1;

implementation

{$R *.DFM}

{--------------------------------------------------------------}

{ Создаем процедуру обработки сообщения WM_QUERYENDSESSION. }

{ Приложение получит только это сообщение при попытке Windows }

{ завершить работу }

{--------------------------------------------------------------}

procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession);

begin

inherited; { сначала сообщание должен обработать наследуемый метод }

{--------------------------------------------------------------------}

{ в этой точке вы также можете сообщить Windows о неготовности }

{ приложения завершить работу… }

{ Message.Result:=0; }

{-------------------------------------------или----------------------}

{ вызов процедуры освобождения ресурсов, предусмотренной в FormClose }

{ MyCleanUpProcedure; }

{--------------------------------------------------------------------}

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

MyCleanUpProcedure;

end;

end.

Я не тестировал этот код, но могу предположить, что он должен работать. Сообщите, если это не так!

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

Каким образом запустить процесс завершения работы операционной системы (функция ExitWindows) из кода моей программы? Мне необходимо перезапустить операционную систему без перезапуска компьютера.

Ok, приводим обе функции для перезапуска операционной системы:

procedure TMainForm.RestartWindowsBtnClick(Sender: TObject);

begin

if not ExitWindows(EW_RestartWindows, 0) then ShowMessage('Приложение не может завершить работу');

end;

procedure TMainForm.RebootSystemBtnClick(Sender: TObject);

begin

if not ExitWindows(EW_RebootSystem, 0) then ShowMessage('Приложение не может завершить работу');

end;

Функция ExitWindows не была правильно задокументирована Microsoft'ом и не содержит описания возвращаемого значения. Более того, информация о этой функции практически не встречается в других источниках. Вот правильное определение этой функции:

function ExitWindows(dwReturnCode: Longint; Reserved: Word): Bool;

Режим энергосбережения (Power saver)

Управление монитором

Выключить монитор:

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

Включить монитор:

SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, –1);

Разное

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

Решение 1

Алгоритм, применяемый мною:

В блоке begin..end модуля .dpr:

begin

if HPrevInst <>0 then begin

ActivatePreviousInstance;

Halt;

end;

end;

Реализация в модуле:

unit PrevInst;

interface

uses WinProcs, WinTypes, SysUtils;

type

PHWnd = ^HWnd;

function EnumApps(Wnd: HWnd; TargetWindow: PHWnd): bool; export;

procedure ActivatePreviousInstance;

implementation

function EnumApps(Wnd: HWnd; TargetWindow: PHWnd): bool;

var

ClassName : array[0..30] of char;

begin

Result := true;

if GetWindowWord(Wnd, GWW_HINSTANCE) = HPrevInst then begin

GetClassName(Wnd, ClassName, 30);

if STRIComp(ClassName,'TApplication')=0 then begin

TargetWindow^:= Wnd;

Result := false;

end;

end;

end;

procedure ActivatePreviousInstance;

var

PrevInstWnd: HWnd;

begin

PrevInstWnd:= 0;

EnumWindows(@EnumApps,LongInt(@PrevInstWnd));

if PrevInstWnd <> 0 then if IsIconic(PrevInstWnd) then

ShowWindow(PrevInstWnd,SW_Restore)

else

BringWindowToTop(PrevInstWnd);

end;

end.

Решение 2

Предоставленное разработчиками Delphi 2 Пачекой (Pacheco) и Тайхайрой (Teixeira) и значительно переработанное.

unit multinst;

{Применение:

Необходимый код в исходном проекте

if InitInstance then begin

Application.Initialize;

Application.CreateForm(TFrmSelProject, FrmSelProject);

Application.Run;

end;

Это все понятно (я надеюсь)}

interface

uses Forms, Windows, Dialogs, SysUtils;

const

MI_NO_ERROR = 0;

MI_FAIL_SUBCLASS = 1;

MI_FAIL_CREATE_MUTEX = 2;

{ Проверка правильности запуска приложения с помощью описанных ниже функций. }

{ Количество флагов ошибок MI_* может быть более одного. }

function GetMIError: Integer;

Function InitInstance : Boolean;

implementation

const

UniqueAppStr : PChar; {Различное для каждого приложения}

var

MessageId: Integer;

WProc: TFNWndProc = Nil;

MutHandle: THandle = 0;

MIError: Integer = 0;

function GetMIError: Integer;

begin

Result:= MIError;

end;

function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint): Longint; StdCall;

begin

{ Если это – сообщение о регистрации… }

if Msg = MessageID then begin

{ если основная форма минимизирована, восстанавливаем ее }

{ передаем фокус приложению }

if IsIconic(Application.Handle) then begin

Application.MainForm.WindowState:= wsNormal;

ShowWindow(Application.Mainform.Handle, sw_restore);

end;

SetForegroundWindow(Application.MainForm.Handle);

end

{ В противном случае посылаем сообщение предыдущему окну }

else Result:= CallWindowProc(WProc, Handle, Msg, wParam, lParam);

end;

procedure SubClassApplication;

begin

{ Обязательная процедура. Необходима, чтобы обработчик }

{ Application.OnMessage был доступен для использования. }

WProc:= TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(@NewWndProc)));

{ Если происходит ошибка, устанавливаем подходящий флаг }

if WProc = Nil then MIError:= MIError or MI_FAIL_SUBCLASS;

Читать дальше
Тёмная тема

Шрифт:

Сбросить

Интервал:

Закладка:

Сделать


Валентин Озеров читать все книги автора по порядку

Валентин Озеров - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Советы по Delphi. Версия 1.0.6 отзывы


Отзывы читателей о книге Советы по Delphi. Версия 1.0.6, автор: Валентин Озеров. Читайте комментарии и мнения людей о произведении.


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

Напишите свой комментарий
Большинство книг на сайте опубликовано легально на правах партнёрской программы ЛитРес. Если Ваша книга была опубликована с нарушениями авторских прав, пожалуйста, направьте Вашу жалобу на PGEgaHJlZj0ibWFpbHRvOmFidXNlQGxpYmtpbmcucnUiIHJlbD0ibm9mb2xsb3ciPmFidXNlQGxpYmtpbmcucnU8L2E+ или заполните форму обратной связи.
img img img img img