Читать «Виртуальная библиотека Delphi» онлайн - страница 31

Unknown

    Halt;

  END;

  {Иначе - ничего не делаем (не мешаем созданию формы)}

end;

P.S. Для выхода необходимо использовать Halt, а не Close, как хотелось бы, так как форма еще не создана и закрывать нечего.

Есть и другой способ — по списку загруженных приложений

procedure TForm1.FormCreate(Sender: TObject);

VAR

Wnd : hWnd;

buff : ARRAY[0.. 127] OF Char;

Begin

Wnd := GetWindow(Handle, gw_HWndFirst);

WHILE Wnd <> 0 DO BEGIN

  IF (Wnd <> Application.Handle) AND (GetWindow(Wnd, gw_Owner) = 0)

  THEN BEGIN

   GetWindowText (Wnd, buff, sizeof (buff ));

   IF StrPas (buff) = Application.Title THEN

   BEGIN

    MessageDlg('Приложение уже загружено', mtWarning, [mbOk], 0);

    Halt;

   END;

  END;

  Wnd := GetWindow (Wnd, gw_hWndNext);

 END;

End;

Еще один интересный способ для Win32. Дело в том, что можно в памяти создавать временные файлы. При перезагрузке они теряются, а так существуют. Кстати, этот метод можно использовать и для обмена информацией между вашими приложениями.

Пример:

program Project1;

uses

  Windows, // Обязательно

  Forms,

  Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

Const

MemFileSize = 1024;

MemFileName = 'one_inst_demo_memfile';

Var

MemHnd : HWND;

begin

  { Попытаемся создать файл в памяти }

  MemHnd := CreateFileMapping(HWND($FFFFFFFF),

                              nil,

                              PAGE_READWRITE,

                              0,

                              MemFileSize,

                              MemFileName);

  { Если файл не существовал запускаем приложение }

  if GetLastError<>ERROR_ALREADY_EXISTS then

  begin

   Application.Initialize;

   Application.CreateForm(TForm1, Form1);

  end;

  CloseHandle(MemHnd);

end.

Часто при работе у пользователя может быть открыто 5–20 окон и сообщение о том, что программа уже запущено приводит к тому, что он вынужден полчаса искать ранее запущенную копию. Выход из положения — найдя копию программы активировать ее, для чего в последнем примере перед HALT необходимо добавить строку :

SetForegroundWindow(Wnd);

Например так:

uses

  Windows, // !!!

  Forms,

  Unit0 in 'Unit0.pas' {Form1};

var

  Handle1 : LongInt;

  Handle2 : LongInt;

{$R *.RES}

begin

  Application.Initialize;

  Handle1 := FindWindow('TForm1',nil);

  if handle1 = 0 then

    begin

      Application.CreateForm(TForm1, Form1);

    end

  else

    begin

      Handle2 := GetWindow(Handle1,GW_OWNER);