【问题标题】:MDI Application, check if a child form with the same caption is openMDI应用程序,检查是否打开了具有相同标题的子窗体
【发布时间】:2018-03-19 09:44:54
【问题描述】:

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

【问题讨论】:

  • 您必须提供暴露问题的最少代码,否则我们无法帮助您。
  • 添加了我目前使用的东西,它可能是一些愚蠢的东西,但我看不到
  • 使用 FormName 是个坏主意,不知道它可能是什么,而是使用类名。
  • 另外,当您需要中断来退出循环时,您的循环错误。为此使用while do或repeat until。不过,这与您的问题无关
  • MDIChildCount 在你的循环中应该是 MDIChildCount - 1。

标签: delphi mdi


【解决方案1】:

试试类似的方法:

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;

【讨论】:

  • 非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多