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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...