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

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


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

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

DELPHI.mastak.ru

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

Обновился дайджест по FAQ. Скачать можно здесь
Вышел очередной дайджест форумов. Скачать можно здесь
Новые компоненты   |x|
  • Nuca Outlook Plugin (98Kb) (29.09.02 09:34)
    Этот плагин показывает, как загрузить форму и поместить ее в панель, подобной Outlook'у.
    Если в своих приложениях вы используете плагины, то вам необходимо использовать Nuca Plugin Framework.
    С исходными текстами
    Источник: www.delphipages.com   Автор: Alexnaldo Santos http://www.geocities.com/nucainterface
    -= · VCL · Samples · =- [Перевел: Сергей Зинин]

  • idRunner v.2.3 (66Kb) (29.09.02 09:13)
    Расширение к Indy (версия 8 и 9) для Borland Delphi 5, 6 и 7.
    IdISAPIRunner компонент позволяет выполнять ISAPI модули, использующие Indy TidHTTPServer.
    TidCGIRunner компонент позволяет выполнять CGI-скрипты, используя idHTTPServer. TidISAPIRunner2 компонент Кена Вилкокса подобен TidISAPIRunner компоненту с небольшими отличиями:
    1 - Все ISAPI расширения загружаются единовременно
    2 - Они остаются загруженными до тех пор, пока компонент не будет разрушен
    3 - Добавлен метод unload, позволяющий выгрузить ISAPI без выгрузки сервера. Для работы требуется Indy.
    С исходными текстами

    Источник: www.delphipages.com   Автор: Serhiy Perevoznyk http://sourceforge.net/projects/psvlib/
    -= · VCL · Samples · =- [Перевел: Сергей Зинин]

  • Для уменьшения объема писем здесь публикуется не весь список новых компонент, потому заглядывайте и на сайт!
Лучшее из нашего 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,
    &n! bsp;                        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.R! un;
    end;
 if LongBool(g_hAppMutex) then //если уже есть
    begin
     ReleaseMutex(g_hAppMutex);
     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);
  &! nbsp;                 inc(i);
                   end;
                  Application.Terminate;
                  Exit;
                 end;
          end;
       Wnd:=GetWindow(Wnd,gw_hWndNext);
      end;
    end;
end.

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

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

Обсуждается в конференциях   |x|
У нас большой выбор статей   |x|
Невизуальные классы в Delphi
В этом обзоре мне хотелось бы осветить несколько классов Delphi, которым обычно в книгах и других обучающих материалах уделяется (если уделяется) весьма скромное внимание. Это так называемые невизуальные классы, не порожденные непосредственно от TComponent и не имеющие владельца. Следовательно, начинающий разработчик в палитре компонентов их не видит, в книжках о них не пишут, а help’ы ему читать неохота или он просто не знает английского...
Новинки книжного рынка   |x|
Shareware : профессиональная разработка и продвижение программ
Рассматриваются особенности создания условно-бесплатных программ, приводятся рекомендации по разработке интерфейса и оформлению документации, обсуждаются теоретические и практические вопросы проектирования, рекламы, маркетинга и технической поддержки создаваемого программного продукта. Книга содержит примеры удачной разработки и реализации программ из мировой и российской практики. Множество иллюстраций дает возможность более наглядно представить объем и качество работы, необходимой для создания программ на профессиональном уровне.
Автор: Жарков С.
Другие сайты о DELPHI   |x|
AnSo Delphi page
Регулярные выражения (regular expressions) для дельфи с полными и бесплатными исходниками.
На сайте есть описание (на русском), примеры (в т.ч. как извлекать информацию из html-страниц).
Работа ...

» Оценка сайта: 2
Опрос населения :)
Как вы нашли наш сайт?
»»» Поисковая система
»»» Рассылка
»»» Ссылка с другого сайта
»»» Через каталог сайтов
»»» Друг посоветовал
»»» Случайно
Журнал "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=952


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

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


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

В избранное