MDI应用程序,检查具有相同标题的子表单是否已打开

时间:2018-03-19 09:44:55

标签: delphi mdi

我有一个Delphi MDI应用程序,它有一个客户搜索子表单,只能打开一次(检查isAssigned),但是可以多次打开查看/编辑表单,以便最终用户可以一次打开多个客户( Tabbed),我想做的是能够阻止他们不止一次打开同一个客户记录,在客户表格打开时我将标题设置为客户帐户参考,如果该表格存在,我我希望.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;

1 个答案:

答案 0 :(得分:2)

尝试更像这样的东西:

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;