x11 Posted November 5, 2021 Share Posted November 5, 2021 В событии закрытия вкладки TUniTabSheet есть параметр AllowClose. И как его использовать правильно вместе с функцией MessageDlg(Msg, DlgType, Buttons, CallBack)? Ведь приложение асинхронное? 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 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 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: 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... 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... Даже если я не использую это свойство, то все равно выдается ошибка браузера. Может с моим кодом что-то не то? Ведь ошибка связана с несоответствием классов каких-то, но я не вижу в коде явной ошибки... Link to comment Share on other sites More sharing options...
Sherzod Posted January 19, 2023 Share Posted January 19, 2023 Обратите внимание на Sender as... 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. Если закрываю вкладку без подтверждения, то все закрывается нормально, без ошибок. Кстати, сейчас заметил, что если сначала вызывается эта ошибка от браузера, то если потом нажать повторно на закрытие вкладки, то она закрывается нормально, без ошибки уже. 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: 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... Я неправильно написал его в коде? Мне же надо обратиться к закрываемой вкладке как-то... 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) Вот и причина ошибки... 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; 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? 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? 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 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 Блин, гениально и просто... Спасибо! Link to comment Share on other sites More sharing options...
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now