Search code examples
delphimdi

MDI Application, check if a child form with the same caption is open


I have a Delphi MDI application that has a customer search child form which can only be opened once (checking isAssigned), however the view / edit form can be opened multiple times so that the end user can open multiple customers at once (Tabbed), what I'd like to do is be able to stop them from opening the same customer record more than once, on the open of the customer form I set the caption to the customers account reference and if that form exists I would like to .BringToFront, if not I'll create it.

What would be the best way to achieve this please, as I'm scratching my head!

Thanks in advance.

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;

Solution

  • Try something more like this instead:

    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;