delphi - MDI 应用程序,检查是否打开具有相同标题的子窗体

标签 delphi mdi

我有一个 Delphi MDI 应用程序,它有一个客户搜索子表单,只能打开一次(检查 isAssigned),但是 View /编辑表单可以打开多次,以便最终用户可以一次打开多个客户(选项卡式),我想做的是能够阻止他们多次打开相同的客户记录,在打开客户表单时,我将标题设置为客户帐户引用,如果该表单存在,我希望到 .BringToFront,如果没有,我将创建它。

实现这一目标的最佳方法是什么,因为我正在摸不着头脑!

提前致谢。

procedure TfrmCustomerSearch.ViewCustomerExecute(Sender: TObject);
begin
  screen.cursor := crappstart;

  if not IsMDIChildOpen(frmMainMenu, 'frmCustomerView', pfrmCaption) then
    frmCustomerView := TfrmCustomerView.createform(nil,dmCustomerSearchfrm.FDQCustSearchreference.Value,cxGrid1DBTableView1.DataController.FocusedRecordIndex)
  else
    frmCustomerView.BringToFront;

  screen.cursor := crdefault;
end;

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

    end;
end;

最佳答案

尝试更多类似这样的事情:

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: TFormClass; const AMDICaption : string): TForm;
var
  i: Integer;
  Child: TForm;
begin
  Result := nil;
  for i := Pred(AParentForm.MDIChildCount) DownTo 0 do
  begin
    Child := AParentForm.MDIChildren[i];
    if Child.InheritsFrom(AMDIChildClass) and
       (Child.Caption = AMDICaption) then
    begin
      Result := Child;
      Exit;
    end;
  end;
end;

关于delphi - MDI 应用程序,检查是否打开具有相同标题的子窗体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49359873/

相关文章:

multithreading - TThread 的后代,从主线程访问属性

delphi - 标记单词的所有实例(Delphi、RichText)

mysql - Zeoslib : How to tell when query execution is complete?

delphi - 如何在Delphi中计算每个单词的长度?

winforms - Winforms MDI 客户区的大小/位置

windows - 如何获得包含我的应用程序创建的所有线程的列表

c# - 如何检测彼此靠近的两个窗口

c++ - 位图作为 MDI mainfrm 的背景

wpf - 在 WinForms MDI 应用程序中托管 WPF 用户控件时如何避免视觉伪影?

delphi - 表单如何向其所有者发送消息?