x11 Posted November 5, 2021 Share Posted November 5, 2021 В событии закрытия вкладки TUniTabSheet есть параметр AllowClose. И как его использовать правильно вместе с функцией MessageDlg(Msg, DlgType, Buttons, CallBack)? Ведь приложение асинхронное? Quote Link to comment Share on other sites More sharing options...
Sherzod Posted November 5, 2021 Share Posted November 5, 2021 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; 1 Quote Link to comment Share on other sites More sharing options...
estrify Posted November 5, 2021 Share Posted November 5, 2021 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, 1 Quote Link to comment Share on other sites More sharing options...
artem_niko Posted January 19, 2023 Share Posted January 19, 2023 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: In UniMainModule: Quote Link to comment Share on other sites More sharing options...
Sherzod Posted January 19, 2023 Share Posted January 19, 2023 29 minutes ago, artem_niko said: In UniMainModule: In such a case, you should not use callback... Quote Link to comment Share on other sites More sharing options...
artem_niko Posted January 19, 2023 Share Posted January 19, 2023 8 minutes ago, Sherzod said: In such a case, you should not use callback... Даже если я не использую это свойство, то все равно выдается ошибка браузера. Может с моим кодом что-то не то? Ведь ошибка связана с несоответствием классов каких-то, но я не вижу в коде явной ошибки... Quote Link to comment Share on other sites More sharing options...
Sherzod Posted January 19, 2023 Share Posted January 19, 2023 Обратите внимание на Sender as... Quote Link to comment Share on other sites More sharing options...
artem_niko Posted January 19, 2023 Share Posted January 19, 2023 4 minutes ago, Sherzod said: Обратите внимание на Sender as... А что не так с ним? Просто, событие закрытия вкладки присваивается к динамически создаваемым UniTabSheet. Если закрываю вкладку без подтверждения, то все закрывается нормально, без ошибок. Кстати, сейчас заметил, что если сначала вызывается эта ошибка от браузера, то если потом нажать повторно на закрытие вкладки, то она закрывается нормально, без ошибки уже. Quote Link to comment Share on other sites More sharing options...
Sherzod Posted January 19, 2023 Share Posted January 19, 2023 2 minutes ago, artem_niko said: А что не так с ним? 1 hour ago, artem_niko said: and I get error: Quote Link to comment Share on other sites More sharing options...
artem_niko Posted January 19, 2023 Share Posted January 19, 2023 3 minutes ago, Sherzod said: Ну, я вижу. Я и спрашиваю, что не так с Sender as... Я неправильно написал его в коде? Мне же надо обратиться к закрываемой вкладке как-то... Quote Link to comment Share on other sites More sharing options...
Sherzod Posted January 19, 2023 Share Posted January 19, 2023 56 minutes ago, artem_niko said: Даже если я не использую это свойство, то все равно выдается ошибка браузера. 1 hour ago, artem_niko said: MessageDlg('Close?',TMsgDlgType.mtConfirmation, mbYesNo, procedure(Sender: TComponent; Res: Integer) Вот и причина ошибки... Quote Link to comment Share on other sites More sharing options...
artem_niko Posted January 19, 2023 Share Posted January 19, 2023 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; Quote Link to comment Share on other sites More sharing options...
Sherzod Posted January 19, 2023 Share Posted January 19, 2023 7 minutes ago, artem_niko said: procedure(Sender: TComponent; ARes Конечно не поможет, видите ещё один Sender? Quote Link to comment Share on other sites More sharing options...
artem_niko Posted January 19, 2023 Share Posted January 19, 2023 1 minute ago, Sherzod said: Конечно не поможет, видите ещё один Sender? Ааа, понял, конфликт Sender'ов... Но, а как без него использовать MessageDlg? Quote Link to comment Share on other sites More sharing options...
Sherzod Posted January 19, 2023 Share Posted January 19, 2023 39 minutes ago, Sherzod said: procedure(Sender: TComponent; ARes procedure(ASender: TComponent; ARes 1 Quote Link to comment Share on other sites More sharing options...
artem_niko Posted January 19, 2023 Share Posted January 19, 2023 1 minute ago, Sherzod said: procedure(ASender: TComponent; ARes Блин, гениально и просто... Спасибо! Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.