Jump to content

Спросить перед закрытием вкладки TuniPageControl


x11

Recommended Posts

В событии закрытия вкладки TUniTabSheet есть параметр AllowClose.

И как его использовать правильно вместе с функцией MessageDlg(Msg, DlgType, Buttons, CallBack)?

Ведь приложение асинхронное?

Link to comment
Share on other sites

25 minutes ago, x11 said:

В событии закрытия вкладки TUniTabSheet есть параметр AllowClose.

И как его использовать правильно вместе с функцией MessageDlg(Msg, DlgType, Buttons, CallBack)?

Ведь приложение асинхронное?

Попробуйте:

procedure TMainForm.UniTabSheet2Close(Sender: TObject; var AllowClose: Boolean);
begin
  AllowClose := ((Sender as TUniTabSheet).CustomAttribs.Values['allowClose'] = 'true');
  if not AllowClose then
    MessageDlg('Are you sure you want to close this tab?', mtConfirmation, [mbYes, mbNo],
      procedure (AComponent: TComponent; ARes: Integer)
      begin
        if ARes = mrYes then
        begin
          (Sender as TUniTabSheet).CustomAttribs.Values['allowClose'] := 'true';
          (Sender as TUniTabSheet).Close;
        end;
      end
    );

end;

 

  • Thanks 1
Link to comment
Share on other sites

Hi,

One possible solution (with EnableSynchronousOperations=False) :

...  
private
  { Private declarations }
  AllowClose_UniTabSheet3: Boolean;
...



procedure TMainForm.UniTabSheet3BeforeFirstActivate(Sender: TObject; var
    AllowActivate: Boolean);
begin
  AllowClose_UniTabSheet3:=False;
end;



procedure TMainForm.UniTabSheet3Close(Sender: TObject; var AllowClose: Boolean);
begin
  AllowClose:=AllowClose_UniTabSheet3;
  if not AllowClose_UniTabSheet3 then
  begin
    MessageDlg('Close?', TMsgDlgType.mtInformation, mbYesNo,
      procedure(Sender: TComponent; Res: Integer)
      begin
        if Res=mrYes then
        begin
          AllowClose_UniTabSheet3:=true;
          UniTabSheet3.Close();
        end;
      end
    );
  end;
end;

Regards,

 

  • Thanks 1
Link to comment
Share on other sites

  • 1 year later...
On 11/5/2021 at 7:25 PM, estrify said:

Hi,

One possible solution (with EnableSynchronousOperations=False) :

...  
private
  { Private declarations }
  AllowClose_UniTabSheet3: Boolean;
...



procedure TMainForm.UniTabSheet3BeforeFirstActivate(Sender: TObject; var
    AllowActivate: Boolean);
begin
  AllowClose_UniTabSheet3:=False;
end;



procedure TMainForm.UniTabSheet3Close(Sender: TObject; var AllowClose: Boolean);
begin
  AllowClose:=AllowClose_UniTabSheet3;
  if not AllowClose_UniTabSheet3 then
  begin
    MessageDlg('Close?', TMsgDlgType.mtInformation, mbYesNo,
      procedure(Sender: TComponent; Res: Integer)
      begin
        if Res=mrYes then
        begin
          AllowClose_UniTabSheet3:=true;
          UniTabSheet3.Close();
        end;
      end
    );
  end;
end;

Regards,

 

Hello!

My code:

procedure TMainForm.UniTabSheet1(Sender: TObject; var AllowClose: Boolean);
begin
  AllowClose:=UniMainModule.AllowClose;

  if not UniMainModule.AllowClose then
  begin
    MessageDlg('Close?',TMsgDlgType.mtConfirmation, mbYesNo,
    procedure(Sender: TComponent; Res: Integer)
    var
      i: Integer;
    begin
      if Res = mrYes then
      begin
        UniMainModule.AllowClose:=True;

        i:=0;
        for i := 0 to (Sender as TUniTabSheet).ComponentCount - 1 do
        begin
          if (Sender as TUniTabSheet).Components[i] is TFDConnection then
             ((Sender as TUniTabSheet).Components[i] as TFDConnection).Connected:=False;

          if (Sender as TUniTabSheet).Components[i] is TFDQuery then
             ((Sender as TUniTabSheet).Components[i] as TFDQuery).Close;
        end;
       end;
      end
    );
    UniSession.AddJS('Ext.get("messagebox-1001_header-title-textEl").setText("Подтверждение действия")');
  end;
end;

and I get error:

image.png.62adea130377b70b4de574f923612008.png

In UniMainModule:

image.png.074d5b6bfe24d79ab9d1aa499a8d1df6.png

Link to comment
Share on other sites

8 minutes ago, Sherzod said:

In such a case, you should not use callback...

Даже если я не использую это свойство, то все равно выдается ошибка браузера.

Может с моим кодом что-то не то? Ведь ошибка связана с несоответствием классов каких-то, но я не вижу в коде явной ошибки...

Link to comment
Share on other sites

4 minutes ago, Sherzod said:

Обратите внимание на Sender as...

А что не так с ним?

Просто, событие закрытия вкладки присваивается к динамически создаваемым UniTabSheet.

Если закрываю вкладку без подтверждения, то все закрывается нормально, без ошибок.

Кстати, сейчас заметил, что если сначала вызывается эта ошибка от браузера, то если потом нажать повторно на закрытие вкладки, то она закрывается нормально, без ошибки уже.

Link to comment
Share on other sites

3 minutes ago, Sherzod said:

 

 

Ну, я вижу.

Я и спрашиваю, что не так с Sender as... 

Я неправильно написал его в коде? Мне же надо обратиться к закрываемой вкладке как-то...

Link to comment
Share on other sites

56 minutes ago, artem_niko said:

Даже если я не использую это свойство, то все равно выдается ошибка браузера.

 

1 hour ago, artem_niko said:
MessageDlg('Close?',TMsgDlgType.mtConfirmation, mbYesNo,
    procedure(Sender: TComponent; Res: Integer)

Вот и причина ошибки...

Link to comment
Share on other sites

3 minutes ago, Sherzod said:

 

Вот и причина ошибки...

Я заменил на это, но ничего не помогло:

    MessageDlg('Close?<br>',mtConfirmation, mbYesNo,
    procedure(Sender: TComponent; ARes: Integer)
    var
      i: Integer;
    begin
      case ARes of
        mrYes:
        begin
          UniMainModule.AllowClose:=True;

          i:=0;
          for i := 0 to (Sender as TUniTabSheet).ComponentCount - 1 do
          begin
            if (Sender as TUniTabSheet).Components[i] is TFDConnection then
               ((Sender as TUniTabSheet).Components[i] as TFDConnection).Connected:=False;

            if (Sender as TUniTabSheet).Components[i] is TFDQuery then
               ((Sender as TUniTabSheet).Components[i] as TFDQuery).Close;
          end;
        end;
      end;
    end
    );
    UniSession.AddJS('Ext.get("messagebox-1001_header-title-textEl").setText("Подтверждение действия")');
  end;

 

Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...