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

Создание многооконного MDI-приложения в Delphi: защита от одновременного открытия форм клиентов

Delphi , Программа и Интерфейс , MDI приложения

Оригинальный заголовок:

Управление многооконными формами в MDI-приложении на Delphi: предотвращение одновременного открытия форм клиентов

Описание проблемы:

Разработчик столкнулся с задачей создания многооконного MDI-приложения на Delphi, где форма поиска клиентов может открываться только один раз, в то время как форма просмотра и редактирования может открываться многократно для одновременной работы с несколькими клиентами. Задача заключается в том, чтобы предотвратить открытие одной и той же записи клиента более одного раза. При открытии формы просмотра клиента необходимо установить заголовок формы в соответствии с референсом клиента и, если форма с таким же заголовком уже существует, привести её в передний план, в противном случае создать новую форму.

Подход к решению:

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

Пример кода:

procedure TfrmCustomerSearch.ViewCustomerExecute(Sender: TObject);
begin
  Screen.Cursor := crAppStart;
  try
    frmCustomerView := TfrmCustomerView(FindMDIChildOpen(frmMainMenu, TfrmCustomerView, pfrmCaption));
    if frmCustomerView = nil then
      frmCustomerView := TfrmCustomerView.CreateForm(nil, dmCustomerSearchfrm.FDQCustSearchreference.Value, cxGrid1DBTableView1.DataController.FocusedRecordIndex);
    frmCustomerView.BringToFront;
  finally
    Screen.Cursor := crDefault;
  end;
end;

function TfrmCustomerSearch.FindMDIChildOpen(const AParentForm: TForm; const AMDIChildClass: TClass; const AMDICaption : string): TForm;
var
  i: Integer;
  Child: TForm;
begin
  Result := nil;
  for i := AParentForm.MDIChildCount - 1 downto 0 do
  begin
    Child := AParentForm.MDIChildren[i];
    if Child is AMDIChildClass and
       (Child.Caption = AMDICaption) then
    begin
      Result := Child;
      Exit;
    end;
  end;
end;

Обсуждение и комментарии к коду:

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

Также стоит обратить внимание на использование оператора is вместо InheritsFrom, что позволяет более корректно проверить, является ли текущий объект экземпляром указанного класса. Это исправление было предложено в подтвержденном ответе.

Заключение:

Применение описанного подхода позволит разработчику успешно решить поставленную задачу и обеспечить корректную работу многооконного MDI-приложения в Delphi.

Создано по материалам из источника по ссылке.

Задача заключается в разработке многооконного MDI-приложения на Delphi, где форма для поиска клиентов открывается один раз, а форма просмотра и редактирования клиентов может открываться многократно для одновременной работы, с предусмотренной функцией пре


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

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




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


:: Главная :: MDI приложения ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-03-15 07:53:29/0.0063149929046631/0