Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 25.08.2008, 19:25   #1
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию блокировка вызова 2-го экземпляра формы из dll

в моей программе я вызываю форму из dll Так вот, нажимаю на кнопку вызов - форма вызывается. нажимаю еще раз - еще раз вызывается. И так можно вызывать и вызывать одну и ту же форму причем не важно открыта она уже или нет. Получается куча форм.
Вопрос в том, как сделать так чтобы форма не вызывалась из dll, если она уже открыта. Чтобы просто этой самой форме (которая вызвана из dll) передавался фокус. Если закрыта - то вызываем форму из dll, если уже открыта, то передаем ей фокус и все.
ShowModal не предлагать.
Исходник прилагается

Mainn.dpr - проект основного приложения.
libr.dpr - проект библиотеки.
Unit1.pas - модуль с формой, которую загружаю в dll.
Вложения
Тип файла: rar dll - block.rar (11.5 Кб, 17 просмотров)
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 25.08.2008, 19:58   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Экспортировать еще одну функцию

Код:
function isFormShow : boolean; 
begin
   result := Form1 <> nil;
   if result then Form1.SetFocus;
end;
и проверять при создании формы

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
   if not isFormShow then  ShowForm(Application.Handle, Self.Handle);
end;
alexBlack вне форума Ответить с цитированием
Старый 25.08.2008, 22:35   #3
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

да работает, но только для одного раза Когда втрой раз вызываешь форму из dll, то генерируется ошибка.
Попробовал дополнить функцию, но все равно только для одного вызова формы из dll. Второй раз она уже не вызывается.
Код:
function isFormShow : boolean;
begin
   result := Form1 <> nil;
   if result then Form1.SetFocus;

   if not result then begin
     Form1:=TForm1.Create(Application);
     Form1.Show;
   end;
end;
Изо всей благодати
В руках крепко сжатых
Я донесу только капли

Последний раз редактировалось Roof; 25.08.2008 в 22:39.
Roof вне форума Ответить с цитированием
Старый 26.08.2008, 03:04   #4
Minimus
Пользователь
 
Аватар для Minimus
 
Регистрация: 03.08.2008
Сообщений: 43
По умолчанию

Уважаемый Roof: - если я правильно понял вопрос, то можно попробовать с помощью какого-нибудь признака существования формы, например так:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

   function ShowModalForm: Integer;
   procedure ShowForm;   
   procedure FreeForm;   
  
var
  Form1: TForm1;   
  IsFormExist:boolean = false; //признак существования формы   
  
implementation   
  
{$R *.dfm}
  
function ShowModalForm:Integer;   
begin   
 Result:=0;   
 if IsFormExist then exit; //если форма существует - ничего не делаем   
 Form1:= TForm1.Create(nil); //форме не нужен Owner!!!   
 IsFormExist:=true;   
 Result := Form1.ShowModal;
 Form1.Free;
 IsFormExist:=false; //обозначаем отсутствие существования формы   
end;   

procedure ShowForm;   //Нафиг ей не нужны никакие хандлы!   
begin   
 if IsFormExist then
 begin
  ShowWindow(Form1.Handle,SW_RESTORE);
  SetForegroundWindow(Form1.Handle);
  exit; //если форма существует - ничего не делаем
 end;
 Form1:=TForm1.Create(nil); //форме не нужен Owner!!!
 IsFormExist:=true;
 Form1.Show;
end;   
  
procedure FreeForm;   
begin   
 Form1.Free;
 IsFormExist:=false; //обозначаем отсутствие существования формы   
end;   
  
procedure TForm1.Button1Click(Sender: TObject);   
var
a: string;   
begin   
a:= 'Hello!';   
Label1.Caption:= a;
end;   
  
procedure TForm1.FormDestroy(Sender: TObject);   
begin   
  IsFormExist:=false;   
end;   
  
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Free; //при закрытии формы мы ее ДОЛЖНЫ принудительно разрушить!
end;   
  
end.
ЗЫ: не забудь изменить модуль Main.pas - т.к. изменилась функция ShowForm.
ЗЫ2:без обработки OnClose не произойдет событие OnDestroy, т.к. закрытие формы еще не означает ее разрушение.
бороться и искать
найти и перепрятать.

Последний раз редактировалось Minimus; 26.08.2008 в 16:47. Причина: Изменил ShowForm
Minimus вне форума Ответить с цитированием
Старый 26.08.2008, 08:27   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Roof Посмотреть сообщение
да работает, но только для одного раза Когда втрой раз вызываешь форму из dll, то генерируется ошибка.
Попробовал дополнить функцию, но все равно только для одного вызова формы из dll. Второй раз она уже не вызывается.
В Вашем коде:

Код:
procedure FreeForm;
begin
    Form1.Free;
    Form1 := nil; // !!!
end;
alexBlack вне форума Ответить с цитированием
Старый 26.08.2008, 11:05   #6
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,230
Сообщение

Ещё есть
Код:
FreeAndNil(Form1);
Alter вне форума Ответить с цитированием
Старый 27.08.2008, 01:03   #7
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

добавил в модуль формы из dll процедуру
Код:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeAndNil(Form1);
end;
Теперь все работает
2 Minimus - спасиб, разобрался в коде. Комментарии очень кстати
Всем спасибо за помощь. Вопрос решен
Изо всей благодати
В руках крепко сжатых
Я донесу только капли

Последний раз редактировалось Roof; 27.08.2008 в 01:05.
Roof вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить Код Экземпляра устройства! sashahttp Win Api 3 24.01.2009 09:55
Блокировка автозапуска Hottabych Общие вопросы Delphi 6 02.06.2008 18:48
Блокировка ввода Fantom Общие вопросы Delphi 3 12.05.2008 19:34
Блокировка файлов UnD)eaD)Snake Общие вопросы Delphi 8 09.10.2007 18:39


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS