Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

До динамического создания формы узнать, существует ли она

Delphi , Программа и Интерфейс , Формы

До динамического создания формы узнать, существует ли она

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
  Q: How to know whether a form already exist before I dynamically create it ? 

  A: See the Forms and FormCount property of TScreen. You can iterate 
     through the forms, and test to see if your form is there. 
}

 function IsFormOpen(const FormName : string): Boolean;
 var
   i: Integer;
 begin
   Result := False;
   for i := Screen.FormCount - 1 DownTo 0 do
     if (Screen.Forms[i].Name = FormName) then
     begin
       Result := True;
       Break;
     end;
 end;

 // Example: Showing a TForm. 
// First check, if the Form (here Form2) is open. If not, create it. 

procedure TForm1.Button1Click(Sender: TObject);
 begin
   if not IsFormOpen('Form2') then
     Form2 := TForm2.Create(Self);

   Form2.Show
 end;

 { For MDI Children }

 function IsMDIChildOpen(const AFormName: TForm; const AMDIChildName : string): Boolean;
 var
   i: Integer;
 begin
   Result := False;
   for i := Pred(AFormName.MDIChildCount) DownTo 0 do
     if (AFormName.MDIChildren[i].Name = AMDIChildName) then
     begin
       Result := True;
       Break;
     end;
 end;

 // Example: Showing a MDI Child. 
// First check, if the MDI Child is open. If not, create it. 

procedure TForm1.Button2Click(Sender: TObject);
 begin
    if not IsMDIChildOpen(Form1, 'MyMDIChild') then
     MyMDIChild := TMyMDIChild.Create(Self);

   MyMDIChild.Show;
   MyMDIChild.BringToFront;
 end;

Программный код, который вы предоставили, является решением на языке Delphi Pascal и предназначено для определения существования формы перед динамическим ее созданием.

Функция IsFormOpen(const FormName: string): Boolean

Эта функция принимает имя формы в параметре и проверяет, существует ли эта форма. Она делает это, перебирая все формы на экране (используя Screen.Forms) и проверяет, если имя каждой формы соответствует заданному FormName. Если она находит совпадение, то устанавливает переменную Result в True и выходит из цикла.

Функция IsMDIChildOpen(AFormName: TForm; const AMDIChildName: string): Boolean

Эта функция аналогична IsFormOpen, но предназначена для использования с MDI-формами (Multiple Document Interface). Она принимает MDI-форму и имя дочерней формы в параметрах, и проверяет, существует ли дочерняя форма, перебирая все дочерние MDI-формы заданной MDI-формы.

Пример использования

В примере кода есть два кнопки на форме (TForm1). Когда кнопка 1 нажата, она проверяет, существует ли форма Form2 с помощью функции IsFormOpen. Если не существует, то создает новый экземпляр формы Form2. Затем она отображает форму Form2.

Когда кнопка 2 нажата, она проверяет, существует ли MDI-дочерняя форма (MyMDIChild) с помощью функции IsMDIChildOpen. Если не существует, то создает новый экземпляр формы MyMDIChild, отображает ее и приносит к переднему плану.

Альтернативное решение

Вместо ручного перебора всех форм или MDI-дочерних форм можно использовать словарь или множество для хранения существующих форм или MDI-дочерних форм. Это сделает ваш код более эффективным и проще в обслуживании.

Например, вы можете создать словарь, который maps имена форм на соответствующие экземпляры:

var
  FormInstances: TDictionary<string, TForm>;

Функция IsFormOpen может выглядеть следующим образом:

function IsFormOpen(const FormName: string): Boolean;
begin
  if not (FormInstances.ContainsKey(FormName)) then
    Result := False
  else
    Result := True;
end;

Процедура Button1Click может выглядеть следующим образом:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not IsFormOpen('Form2') then
    Form2 := TForm2.Create(Self);

  Form2.Show;
end;

Таким образом, вам нужно только проверять словарь один раз для каждого имени формы, а не перебирать все формы.

До динамического создания формы необходимо проверить, существует ли она на экране, используя свойства Forms и FormCount объекта TScreen.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Формы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-07-07 00:24:43/0.0035147666931152/0