Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Мастера DELPHI. Новости мира компонент, FAQ, статьи...


Информационный Канал Subscribe.Ru

Ежедневная рассылка сайта Мастера DELPHI

DELPHI.mastak.ru

Выпуск от 15.07.02 09:04

Обновился дайджест по FAQ. Скачать можно здесь
Вышел очередной дайджест форумов. Скачать можно здесь
Кое-что из нашей кладовки   |x|
Лучшее из нашего FAQ   |x|
Как определить работает ли уже данное приложение или это первая его копия?
Для Delphi 1. Каждый экземпляр программы имеет ссылку на свою предыдущую копию - hPrevInst: hWnd. Ее можно проверить перед созданием приложения и при необходимости отреагировать соответствующим образом. Если запущена только одна копия, то эта ссылка равна нулю.
Пример:


procedure TForm1.FormCreate(Sender: TObject);
begin
 {Проверяем есть ли указатель на предыдущую копию приложения}
 IF hPrevInst <> 0 THEN BEGIN
   {Если есть, то выдаем сообщение и выходим}
   MessageDlg('Программа уже запущена!', mtError, [mbOk], 0);
   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);
  Application.Run;
 end;
 CloseHandle(MemHnd);
end.


Часто при работе у пользователя может быть открыто 5-20 окон и сообщение о том, что программа уже запущено приводит к тому, что он вынужден полчаса искать ранее запущенную копию. Выход из положения - найдя копию программы активировать ее, для чего в последнем примере перед HALT необходимо добавить строку :
SetForegroundWindow(Wnd);
Например так:


program Project0;
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);
     Application.Run;
   end
 else
   begin
     Handle2 := GetWindow(Handle1,GW_OWNER);
      //Чтоб заметили :)
     ShowWindow(Handle2,SW_HIDE); ShowWindow(Handle2,SW_RESTORE);
     SetForegroundWindow(Handle1); // Активизируем
   end;
end.




Комментарий от "Vladimir" (damageinc@e-mail.ru)
Лучше  всего  использовать  именованные  мутексы.  Главное,  придумать
уникальное  имя  для  этого мутекса. Вот пример вполне работоспособной
программы:

program My1;
uses
 Forms, Windows, Dialogs, SysUtils,

var
g_hAppMutex: THandle;
Wnd : hWnd;
buff: array [0..127] of Char;
s:string;
i:integer;

function OneInstance: boolean;

begin
g_hAppMutex:=CreateMutex(nil,false,PChar('AnUniqueString'+IntToStr(GetDesktopWindow)));
Result:=(WaitForSingleObject(g_hAppMutex,0)<>WAIT_TIMEOUT);
end;

begin
 Application.Initialize;
 Application.Title := 'SmartDecoder';
 Application.HelpFile := 'Decoder.hlp';
 //создаём инстанс, если его ещё нету на текущем рабочем столе
 g_hAppMutex:=0;
 if OneInstance then
    begin
     Application.CreateForm(TMainFrm, MainFrm);
     Application.Run;
    end;
 if LongBool(g_hAppMutex) then //если уже есть
    begin
     ReleaseMutex(g_hA! ppMutex);
     CloseHandle(g_hAppMutex);
     if  ParamStr(1)=''  then  ShowMessage('Программа уже запущена на
     этом  рабочем столе. Нажмите кнопку "OK" для передачи управления
     уже запущенной копии программы.');
     Wnd:=GetWindow(GetTopWindow(0),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 Copy(StrPas(buff),1,12)='SmartDecoder' then
              if Wnd=GetWindowLong(Wnd,GWL_USERDATA) then
                 begin
                  ShowWindow(Wnd,SW_ShowNormal);
                  SetForegroundWindow(Wnd);
                  i:=1;
                  while ParamStr(i)<>'' do
                   begin
                    s:=ParamStr(i);
                    PostMessage(Wnd,WM_OPEN_FILE,GlobalAddAtom(PChar(s)),0);
                    inc(i);
                   end;
                  Application.Terminate;!
                  Exit;
                 end;
          end;
       Wnd:=GetWindow(Wnd,gw_hWndNext);
      end;
    end;
end.

Если  программа  уже  запущена, управление будет передано существующей
копии.

»»» Прислать свои комментарии

Обсуждается в конференциях   |x|
У нас большой выбор статей   |x|
Описание функций Windows API (zip)
Эта статья пpедставляет кpаткий спpавочник для пpогpаммистов, котоpым тpебуется конкpетная инфоpмация по той или иной возможности интеpфейса API. Функции и пpоцедуpы Windows пеpечисляются и описываются в алфавитном поpядке.
Для каждой пpоцедуpы или функции пpиводится следующая инфоpмация: заголовок пpоцедуpы или функции (в соответствии с описанием в модуле WinProcs), описание каждого паpаметpа, возвpащаемое значение и кpаткое описание выполняемого функцией действия.
Изза большого объема данный справочник доступен только в виде zip-архива 96kb
Новинки книжного рынка   |x|
Delphi 6 в подлиннике
Delphi 6 - новая версия популярной системы быстрой разработки приложений. В книге описываются инструментальные средства среды Delphi 6, приводятся основы языка программирования Object Pascal и рассматриваются компоненты, свойства, методы и события, необходимые для разработки широкого спектра программ. Особое внимание уделяется работе с базами данных. Показывается использование как локальных, так и удаленных баз данных, включая создание многоуровневых информационных систем и публикацию результатов запросов через Интернет. Благодаря большому количеству затронутых тем, подробному изложению и многочисленным примерам книга будет полезна как начинающим, так и опытным программистам.
Автор: Гофман В.
Другие сайты о DELPHI   |x|
APR Software
Используя формы Delphi, Вы можете расширить стандартные диалоги Windows. Нет необходимости работать с RC файлами или RES-редакторами.
Вся работа внутри IDE. Расширенная поддержка событий внутри ...

» Оценка сайта: 2
Опрос населения :)
Новый журнал для программистов "RSDN Magazine". Согласны ли вы его покупать ежемесячно?
»»» Да
»»» Нет
Журнал "RSDN Magazine"  |x|

Дорогие друзья! Мы рады представить вам новый совместный проект сайтов www.rsdn.ru, delphi.mastak.ru и www.optim.ru - профессиональный журнал для программистов RSDN Magazine.
Несомненно, ваше мнение о необходимости такого журнала, содержании рубрик и темах отдельных статей поможет сделать журнал более полезным и интересным. Высказать свое мнение, проголосовать или же подписаться вы можете на сайте. Без вашего участия, нам будет трудно сделать правильный журнал!
На сайте выложен анонс пилотного выпуска журнала, вступительное слово от редакции.

Для души

Хокку дня
Старый пруд.
Прыгнула в воду лягушка.
Всплеск в тишине.

Афоризмы
Женщина готова наряжаться из одной лишь любви к своей злейшей подруге (Моисей Сафир)

Фраза дня
Скажи мне кто я, и я скажу тебе кто ты.

Дурацкие законы (информация предоставлена сайтом kurilka.com)
Во Франции под угрозой штрафа запрещено фотографировать полицейских и даже полицейские машины.
В штате Нью Йорк (США) вам грозит штраф, если вы будете разговаривать в лифте, даже со знакомыми людьми.

И на закуску коротенький анекдот
Если вы никак не можете разыскать своих родственников - дайте объявление о наследстве.

Фотоприколы.
Начните день с хорошего настроения!
http://delphi.mastak.ru/cgi-bin/prikol.pl?id=1106


На этом позвольте откланяться и пожелать вам удачного дня.
Искренне ваш, Алексей (delphi@mastak.com)

Добро пожаловать на сайт -= Мастера DELPHI =- 


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное