Fake modal dialog using Show?

前端 未结 3 697
我寻月下人不归
我寻月下人不归 2020-12-17 04:19

My application have several modules, each in one tab on the mainform. When using a dialog it is convenient to call ShowModal because you know when the dialog is finished. Bu

3条回答
  •  無奈伤痛
    2020-12-17 04:57

    I have actually almost implemented local modal dialogs now. It is built around that when a TForms Enabled property is set To False the whole Form is locked from input. And my modules is just a descendant from TForm.

    My ViewManager class that decide what modules is current add/close modules etc got 2 new methods. LockCurrentView and UnLOckCurrentView.

    function TViewManager.LockCurrentView: TChildTemplate;
    begin
      Result := CurrentView;
      Result.Enabled := False;
      Result.VMDeactivate;         // DeActivate menus and toolbas for this module
    end;
    
    procedure TViewManager.UnLockCurrentView(aCallerForm: TChildTemplate);
    begin
      aCallerForm.VMActivate;           // Activate menus and toolbas for this module
      aCallerForm.Enabled := True;
    end;
    

    TAttracsForm is the baseclass of all dialogs. I Override FormClose and add a new method ShowLocalModal to call instead of ShowModal. I also have to add a TNotifyEvent OnAfterDestruction to be called when the dialog is closed.

    procedure TAttracsForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      if Assigned(fCallerForm) then      
      begin
        ClientMainForm.ViewManager.UnLockCurrentView(fCallerForm as TChildTemplate);
    
        if Assigned(OnAfterDestruction) then
          OnAfterDestruction(Self);
    
        Action := caFree;
      end;
    end;
    
    { Call to make a dialog modal per module.
      Limitation is that the creator of the module must be a TChildtemplate.
      Several modal dialogs cannot be stacked with this method.}
    procedure TAttracsForm.ShowLocalModal(aNotifyAfterClose: TNotifyEvent);
    begin
      fCallerForm := ClientMainForm.ViewManager.LockCurrentView;    // Lock current module and return it
      PopupParent := fCallerForm;
      OnAfterDestruction := aNotifyAfterClose;
      Show;
    end;
    

    Some test with simple dialogs looks promising. So the module just have to call ShowLocalModal(myMethod) which have a TNotifyEvent as parameter. This method is called when the dialog is closed.

提交回复
热议问题