Gerson Rogerio Lao Опубликовано 4 января, 2018 Поделиться Опубликовано 4 января, 2018 Это не работает. Диалоговое окно не отображается. fgActivityDialog1.Message := 'Teste'; fgActivityDialog1.Show; sleep(3000); fgActivityDialog1.Hide; Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 4 января, 2018 Поделиться Опубликовано 4 января, 2018 (изменено) В своем коде вы останавливаете работу приложения, не давая отрисовать Диалог. Попробуйте вот так: procedure TForm1.Button1Click(Sender: TObject); begin fgActivityDialog1.Message := 'Teste'; fgActivityDialog1.Show; Timer.Interval:=3000; Timer.Enabled:=True; end; procedure TForm1.TimerTimer(Sender: TObject); begin Timer.Enabled:=False; fgActivityDialog1.Hide; end; Изменено 4 января, 2018 пользователем Евгений Корепов Gerson Rogerio Lao 1 Цитата Ссылка на комментарий
0 Gerson Rogerio Lao Опубликовано 4 января, 2018 Автор Поделиться Опубликовано 4 января, 2018 Спасибо за ответ. Но я должен настаивать, потому что у меня есть приложение, написанное в 10.1, с использованием компонента FGX. Я создал два видео, один в depli 10.1 Seatle, другой и 10.2.2 Tokyo. Чтобы показать, что происходит. В delphi 10.1 окно сообщения появляется в 10.2.2, поле не отображается. Заранее спасибо. Delphi_10_1.rar Delphi_10_2_2.rar Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 4 января, 2018 Поделиться Опубликовано 4 января, 2018 В Токио изменена логика работы приложения на Андроид - пользовательский интерфейс выполняется в основном потоке приложения, возможно проблема из за этого. Вот похожая тема Gerson Rogerio Lao и Brovin Yaroslav 1 1 Цитата Ссылка на комментарий
0 Gerson Rogerio Lao Опубликовано 4 января, 2018 Автор Поделиться Опубликовано 4 января, 2018 Спасибо за вашу помощь, и я уже посмотрел на тему, которую вы отправили. Но у меня около 25 форм и более 35 000 строк, используя как fgActivityDialog, так и fgprogreesdialog. И некоторые большие изменения сильно задерживают мой проект. К сожалению, варианты, которые я тестировал, не работали. Благодарю вас. Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 5 января, 2018 Поделиться Опубликовано 5 января, 2018 (изменено) Тогда в вашем случае проще доработать сам компонент fgActivityDialog. Я добавил метод fgActivityDialog.ShowWithAutoClose(3000) : procedure TForm1.Button1Click(Sender: TObject); begin fgActivityDialog.Message := 'Teste'; fgActivityDialog.ShowWithAutoClose(3000); end; Вот измененный исходный код unit FGX.ProgressDialog : Скрытый текст {********************************************************************* * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Autor: Brovin Y.D. * E-mail: y.brovin@gmail.com * ********************************************************************} unit FGX.ProgressDialog; interface uses System.Classes, FGX.ProgressDialog.Types, FGX.Consts, FMX.Types; type /// <summary> /// Generic Abstract base class provide base functionality for creation and using progress/activity dialog. /// Each dialog has Message and Title and holds instance of wrapper native dialog. /// </summary> TfgCustomDialog<T: TfgNativeDialog> = class abstract(TComponent) public const DefaultCancellable = False; DefaultTheme = TfgDialogTheme.Auto; DefaultThemeID = TfgNativeDialog.UndefinedThemeID; private FNativeDialog: T; FTitle: string; FMessage: string; FCancellable: Boolean; FTheme: TfgDialogTheme; FThemeID: Integer; FOnShow: TNotifyEvent; FOnHide: TNotifyEvent; FOnCancel: TNotifyEvent; FAutoCloseTimer : TTimer; procedure OnAutoCloseTimerTimer(Sender: TObject); procedure SetCancellabel(const Value: Boolean); procedure SetMessage(const Value: string); procedure SetTitle(const Value: string); procedure SetTheme(const Value: TfgDialogTheme); procedure SetThemeID(const Value: Integer); procedure SetOnCancel(const Value: TNotifyEvent); procedure SetOnHide(const Value: TNotifyEvent); procedure SetOnShow(const Value: TNotifyEvent); protected /// <summary> /// Returning a instance of wrapper native dialog. You should override this method for using custom native dialog. /// </summary> function CreateNativeDialog: T; virtual; abstract; /// <summary> /// Way for perform additional initialization before showing dialog /// </summary> procedure DoInitDialog; virtual; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; /// <summary> /// Return Does current platform has implementation of native dialog or not /// </summary> function Supported: Boolean; procedure Show; virtual; procedure ShowWithAutoClose(AAutoCloseTimer : Integer); procedure Hide; virtual; function IsShown: Boolean; property NativeDialog: T read FNativeDialog; public property Cancellable: Boolean read FCancellable write SetCancellabel default DefaultCancellable; property Message: string read FMessage write SetMessage; property Title: string read FTitle write SetTitle; property Theme: TfgDialogTheme read FTheme write SetTheme default DefaultTheme; property ThemeID: Integer read FThemeID write SetThemeID default DefaultThemeID; property OnCancel: TNotifyEvent read FOnCancel write SetOnCancel; property OnShow: TNotifyEvent read FOnShow write SetOnShow; property OnHide: TNotifyEvent read FOnHide write SetOnHide; end; { TfgActivityDialog } TfgCustomActivityDialog = class(TfgCustomDialog<TfgNativeActivityDialog>) protected function CreateNativeDialog: TfgNativeActivityDialog; override; end; /// <summary> /// Native Modal dialog with activity indicator, title and message /// </summary> [ComponentPlatformsAttribute(fgMobilePlatforms)] TfgActivityDialog = class(TfgCustomActivityDialog) published property Cancellable; property Message; property Title; property Theme; property ThemeID; property OnCancel; property OnShow; property OnHide; end; { TfgProgressDialog } TfgCustomProgressDialog = class(TfgCustomDialog<TfgNativeProgressDialog>) public const DefaultKind = TfgProgressDialogKind.Determinated; DefaultMax = 100; private FKind: TfgProgressDialogKind; FProgress: Single; FMax: Single; procedure SetKind(const Value: TfgProgressDialogKind); procedure SetMax(const Value: Single); procedure SetProgress(const Value: Single); protected { inherited } function CreateNativeDialog: TfgNativeProgressDialog; override; procedure DoInitDialog; override; public constructor Create(AOwner: TComponent); override; procedure ResetProgress; public property Kind: TfgProgressDialogKind read FKind write SetKind default DefaultKind; property Max: Single read FMax write SetMax; /// <summary> /// Current progress value of dialog in range [0..100]. When dialog is displayed, progress will set with animation /// </summary> property Progress: Single read FProgress write SetProgress; end; /// <summary> /// <para> /// Native Modal dialog with progress bar, title and message /// </para> /// <note type="note"> /// <list type="table"> /// <item> /// <term>iOS</term> /// <description>Doesn't support <see cref="TfgProgressDialog.Kind">Kind</see> property and /// <see cref="TfgProgressDialog.Kind">OnCancel</see></description> /// </item> /// <item> /// <term>Android</term> /// <description>All property is supported</description> /// </item> /// </list> /// </note> /// </summary> [ComponentPlatformsAttribute(fgMobilePlatforms)] TfgProgressDialog = class(TfgCustomProgressDialog) published property Cancellable; property Kind; property Message; property Max; property Progress; property Title; property Theme; property ThemeID; property OnCancel; property OnShow; property OnHide; end; implementation uses System.Math, System.SysUtils, {FMX.Types,} FMX.Platform, FGX.Helpers, FGX.Asserts {$IFDEF IOS} , FGX.ProgressDialog.iOS {$ENDIF} {$IFDEF ANDROID} , FGX.ProgressDialog.Android {$ENDIF} ; { TfgCustomProgressDialog } constructor TfgCustomDialog<T>.Create(AOwner: TComponent); begin inherited Create(AOwner); FTheme := DefaultTheme; FThemeID := DefaultThemeID; FCancellable := DefaultCancellable; FNativeDialog := CreateNativeDialog; end; destructor TfgCustomDialog<T>.Destroy; begin if Assigned(FAutoCloseTimer) then begin FAutoCloseTimer.Enabled:=False; FAutoCloseTimer.OnTimer:=Nil; FAutoCloseTimer.Free; end; FreeAndNil(FNativeDialog); inherited Destroy; end; procedure TfgCustomDialog<T>.DoInitDialog; begin TfgAssert.IsNotNil(FNativeDialog); FNativeDialog.Cancellable := Cancellable; FNativeDialog.Message := Message; FNativeDialog.Title := Title; FNativeDialog.Theme := Theme; FNativeDialog.ThemeID := ThemeID; FNativeDialog.OnCancel := OnCancel; FNativeDialog.OnShow := OnShow; FNativeDialog.OnHide := OnHide; end; procedure TfgCustomDialog<T>.Hide; begin if Supported then FNativeDialog.Hide; end; function TfgCustomDialog<T>.IsShown: Boolean; begin if Supported then Result := NativeDialog.IsShown else Result := False; end; procedure TfgCustomDialog<T>.SetCancellabel(const Value: Boolean); begin if Cancellable <> Value then begin FCancellable := Value; if Supported then FNativeDialog.Cancellable := Cancellable; end; end; procedure TfgCustomDialog<T>.SetMessage(const Value: string); begin if Message <> Value then begin FMessage := Value; if Supported then FNativeDialog.Message := Message; end; end; procedure TfgCustomDialog<T>.SetOnCancel(const Value: TNotifyEvent); begin FOnCancel := Value; if Supported then FNativeDialog.OnCancel := FOnCancel; end; procedure TfgCustomDialog<T>.SetOnHide(const Value: TNotifyEvent); begin FOnHide := Value; if Supported then FNativeDialog.OnHide := FOnHide; end; procedure TfgCustomDialog<T>.SetOnShow(const Value: TNotifyEvent); begin FOnShow := Value; if Supported then FNativeDialog.OnShow := FOnShow; end; procedure TfgCustomDialog<T>.SetTheme(const Value: TfgDialogTheme); begin if Theme <> Value then begin FTheme := Value; if Supported then FNativeDialog.Theme := Theme; end; end; procedure TfgCustomDialog<T>.SetThemeID(const Value: Integer); begin if ThemeID <> Value then begin FThemeID := Value; if Supported then FNativeDialog.ThemeID := ThemeID; end; end; procedure TfgCustomDialog<T>.SetTitle(const Value: string); begin if Title <> Value then begin FTitle := Value; if Supported then FNativeDialog.Title := Title; end; end; procedure TfgCustomDialog<T>.Show; begin if Supported then begin DoInitDialog; FNativeDialog.Show; end; end; procedure TfgCustomDialog<T>.ShowWithAutoClose(AAutoCloseTimer : Integer); begin if Supported then begin DoInitDialog; FAutoCloseTimer:=TTimer.Create(Self); FAutoCloseTimer.Interval:=AAutoCloseTimer; FAutoCloseTimer.OnTimer:=OnAutoCloseTimerTimer; FAutoCloseTimer.Enabled:=True; FNativeDialog.Show; end; end; procedure TfgCustomDialog<T>.OnAutoCloseTimerTimer(Sender: TObject); begin FAutoCloseTimer.Enabled:=False; Hide; end; function TfgCustomDialog<T>.Supported: Boolean; begin Result := FNativeDialog <> nil; end; { TfgCustomActivityDialog } function TfgCustomActivityDialog.CreateNativeDialog: TfgNativeActivityDialog; var ProgressService: IFGXProgressDialogService; begin if TPlatformServices.Current.SupportsPlatformService(IFGXProgressDialogService, ProgressService) then Result := ProgressService.CreateNativeActivityDialog(Self) else Result := nil; end; { TfgCustomProgressDialog } constructor TfgCustomProgressDialog.Create(AOwner: TComponent); begin inherited Create(AOwner); FKind := DefaultKind; FMax := DefaultMax; end; function TfgCustomProgressDialog.CreateNativeDialog: TfgNativeProgressDialog; var ProgressService: IFGXProgressDialogService; begin if TPlatformServices.Current.SupportsPlatformService(IFGXProgressDialogService, ProgressService) then Result := ProgressService.CreateNativeProgressDialog(Self) else Result := nil; end; procedure TfgCustomProgressDialog.DoInitDialog; begin inherited DoInitDialog; FNativeDialog.Kind := Kind; FNativeDialog.Progress := Progress; FNativeDialog.Max := Max; end; procedure TfgCustomProgressDialog.SetKind(const Value: TfgProgressDialogKind); begin if Kind <> Value then begin FKind := Value; if Supported then NativeDialog.Kind := Kind; end; end; procedure TfgCustomProgressDialog.SetMax(const Value: Single); begin TfgAssert.StrickMoreThan(Value, 0, 'Max Value cannot be less than 0'); if not SameValue(Max, Value, Single.Epsilon) then begin FMax := Value; if Supported then NativeDialog.Max := Max; Progress := EnsureRange(Progress, 0, Max); end; end; procedure TfgCustomProgressDialog.SetProgress(const Value: Single); begin TfgAssert.InRange(Value, 0, Max, 'Progress value must be in range [0..Max]'); if not SameValue(Progress, Value, Single.Epsilon) then begin FProgress := EnsureRange(Value, 0, Max); if Supported then NativeDialog.Progress := Progress; end; end; procedure TfgCustomProgressDialog.ResetProgress; begin FProgress := 0; if Supported then NativeDialog.ResetProgress; end; initialization RegisterFmxClasses([TfgCustomActivityDialog, TfgActivityDialog, TfgCustomProgressDialog, TfgProgressDialog]); {$IF Defined(ANDROID) OR Defined(IOS)} RegisterService; {$ENDIF} finalization {$IF Defined(ANDROID) OR Defined(IOS)} UnregisterService; {$ENDIF} end. Добавлен метод procedure ShowWithAutoClose(AAutoCloseTimer : Integer); и TTimer Прошу прощение у Ярослава, за топорное вмешательство в его код :-) Изменено 8 января, 2018 пользователем Andrey Efimov Код спрятан под спойлер Gerson Rogerio Lao 1 Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 5 января, 2018 Поделиться Опубликовано 5 января, 2018 (изменено) Подумал и сделал более изящно - изменил метод Show. procedure TForm1.Button1Click(Sender: TObject); begin fgActivityDialog.Message := 'Teste'; fgActivityDialog.Show(3000); end; procedure TForm1.Button1Click(Sender: TObject); begin fgActivityDialog.Message := 'Teste'; fgActivityDialog.Cancellable:=True; fgActivityDialog.Show; end; Вот код : Скрытый текст {********************************************************************* * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Autor: Brovin Y.D. * E-mail: y.brovin@gmail.com * ********************************************************************} unit FGX.ProgressDialog; interface uses System.Classes, FGX.ProgressDialog.Types, FGX.Consts, FMX.Types; type /// <summary> /// Generic Abstract base class provide base functionality for creation and using progress/activity dialog. /// Each dialog has Message and Title and holds instance of wrapper native dialog. /// </summary> TfgCustomDialog<T: TfgNativeDialog> = class abstract(TComponent) public const DefaultCancellable = False; DefaultTheme = TfgDialogTheme.Auto; DefaultThemeID = TfgNativeDialog.UndefinedThemeID; private FNativeDialog: T; FTitle: string; FMessage: string; FCancellable: Boolean; FTheme: TfgDialogTheme; FThemeID: Integer; FOnShow: TNotifyEvent; FOnHide: TNotifyEvent; FOnCancel: TNotifyEvent; FAutoCloseTimer : TTimer; procedure OnAutoCloseTimerTimer(Sender: TObject); procedure SetCancellabel(const Value: Boolean); procedure SetMessage(const Value: string); procedure SetTitle(const Value: string); procedure SetTheme(const Value: TfgDialogTheme); procedure SetThemeID(const Value: Integer); procedure SetOnCancel(const Value: TNotifyEvent); procedure SetOnHide(const Value: TNotifyEvent); procedure SetOnShow(const Value: TNotifyEvent); protected /// <summary> /// Returning a instance of wrapper native dialog. You should override this method for using custom native dialog. /// </summary> function CreateNativeDialog: T; virtual; abstract; /// <summary> /// Way for perform additional initialization before showing dialog /// </summary> procedure DoInitDialog; virtual; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; /// <summary> /// Return Does current platform has implementation of native dialog or not /// </summary> function Supported: Boolean; // procedure Show; virtual; procedure Show(AAutoCloseTimer : Integer = -1); virtual; // procedure ShowWithAutoClose(AAutoCloseTimer : Integer); procedure Hide; virtual; function IsShown: Boolean; property NativeDialog: T read FNativeDialog; public property Cancellable: Boolean read FCancellable write SetCancellabel default DefaultCancellable; property Message: string read FMessage write SetMessage; property Title: string read FTitle write SetTitle; property Theme: TfgDialogTheme read FTheme write SetTheme default DefaultTheme; property ThemeID: Integer read FThemeID write SetThemeID default DefaultThemeID; property OnCancel: TNotifyEvent read FOnCancel write SetOnCancel; property OnShow: TNotifyEvent read FOnShow write SetOnShow; property OnHide: TNotifyEvent read FOnHide write SetOnHide; end; { TfgActivityDialog } TfgCustomActivityDialog = class(TfgCustomDialog<TfgNativeActivityDialog>) protected function CreateNativeDialog: TfgNativeActivityDialog; override; end; /// <summary> /// Native Modal dialog with activity indicator, title and message /// </summary> [ComponentPlatformsAttribute(fgMobilePlatforms)] TfgActivityDialog = class(TfgCustomActivityDialog) published property Cancellable; property Message; property Title; property Theme; property ThemeID; property OnCancel; property OnShow; property OnHide; end; { TfgProgressDialog } TfgCustomProgressDialog = class(TfgCustomDialog<TfgNativeProgressDialog>) public const DefaultKind = TfgProgressDialogKind.Determinated; DefaultMax = 100; private FKind: TfgProgressDialogKind; FProgress: Single; FMax: Single; procedure SetKind(const Value: TfgProgressDialogKind); procedure SetMax(const Value: Single); procedure SetProgress(const Value: Single); protected { inherited } function CreateNativeDialog: TfgNativeProgressDialog; override; procedure DoInitDialog; override; public constructor Create(AOwner: TComponent); override; procedure ResetProgress; public property Kind: TfgProgressDialogKind read FKind write SetKind default DefaultKind; property Max: Single read FMax write SetMax; /// <summary> /// Current progress value of dialog in range [0..100]. When dialog is displayed, progress will set with animation /// </summary> property Progress: Single read FProgress write SetProgress; end; /// <summary> /// <para> /// Native Modal dialog with progress bar, title and message /// </para> /// <note type="note"> /// <list type="table"> /// <item> /// <term>iOS</term> /// <description>Doesn't support <see cref="TfgProgressDialog.Kind">Kind</see> property and /// <see cref="TfgProgressDialog.Kind">OnCancel</see></description> /// </item> /// <item> /// <term>Android</term> /// <description>All property is supported</description> /// </item> /// </list> /// </note> /// </summary> [ComponentPlatformsAttribute(fgMobilePlatforms)] TfgProgressDialog = class(TfgCustomProgressDialog) published property Cancellable; property Kind; property Message; property Max; property Progress; property Title; property Theme; property ThemeID; property OnCancel; property OnShow; property OnHide; end; implementation uses System.Math, System.SysUtils, {FMX.Types,} FMX.Platform, FGX.Helpers, FGX.Asserts {$IFDEF IOS} , FGX.ProgressDialog.iOS {$ENDIF} {$IFDEF ANDROID} , FGX.ProgressDialog.Android {$ENDIF} ; { TfgCustomProgressDialog } constructor TfgCustomDialog<T>.Create(AOwner: TComponent); begin inherited Create(AOwner); FTheme := DefaultTheme; FThemeID := DefaultThemeID; FCancellable := DefaultCancellable; FNativeDialog := CreateNativeDialog; end; destructor TfgCustomDialog<T>.Destroy; begin if Assigned(FAutoCloseTimer) then begin FAutoCloseTimer.Enabled:=False; FAutoCloseTimer.OnTimer:=Nil; FAutoCloseTimer.Free; end; FreeAndNil(FNativeDialog); inherited Destroy; end; procedure TfgCustomDialog<T>.DoInitDialog; begin TfgAssert.IsNotNil(FNativeDialog); FNativeDialog.Cancellable := Cancellable; FNativeDialog.Message := Message; FNativeDialog.Title := Title; FNativeDialog.Theme := Theme; FNativeDialog.ThemeID := ThemeID; FNativeDialog.OnCancel := OnCancel; FNativeDialog.OnShow := OnShow; FNativeDialog.OnHide := OnHide; end; procedure TfgCustomDialog<T>.Hide; begin if Supported then FNativeDialog.Hide; end; function TfgCustomDialog<T>.IsShown: Boolean; begin if Supported then Result := NativeDialog.IsShown else Result := False; end; procedure TfgCustomDialog<T>.SetCancellabel(const Value: Boolean); begin if Cancellable <> Value then begin FCancellable := Value; if Supported then FNativeDialog.Cancellable := Cancellable; end; end; procedure TfgCustomDialog<T>.SetMessage(const Value: string); begin if Message <> Value then begin FMessage := Value; if Supported then FNativeDialog.Message := Message; end; end; procedure TfgCustomDialog<T>.SetOnCancel(const Value: TNotifyEvent); begin FOnCancel := Value; if Supported then FNativeDialog.OnCancel := FOnCancel; end; procedure TfgCustomDialog<T>.SetOnHide(const Value: TNotifyEvent); begin FOnHide := Value; if Supported then FNativeDialog.OnHide := FOnHide; end; procedure TfgCustomDialog<T>.SetOnShow(const Value: TNotifyEvent); begin FOnShow := Value; if Supported then FNativeDialog.OnShow := FOnShow; end; procedure TfgCustomDialog<T>.SetTheme(const Value: TfgDialogTheme); begin if Theme <> Value then begin FTheme := Value; if Supported then FNativeDialog.Theme := Theme; end; end; procedure TfgCustomDialog<T>.SetThemeID(const Value: Integer); begin if ThemeID <> Value then begin FThemeID := Value; if Supported then FNativeDialog.ThemeID := ThemeID; end; end; procedure TfgCustomDialog<T>.SetTitle(const Value: string); begin if Title <> Value then begin FTitle := Value; if Supported then FNativeDialog.Title := Title; end; end; procedure TfgCustomDialog<T>.Show(AAutoCloseTimer : Integer = -1); begin if Supported then begin DoInitDialog; if AAutoCloseTimer <> -1 then begin FAutoCloseTimer:=TTimer.Create(Self); FAutoCloseTimer.Interval:=AAutoCloseTimer; FAutoCloseTimer.OnTimer:=OnAutoCloseTimerTimer; FAutoCloseTimer.Enabled:=True; end; FNativeDialog.Show; end; end; { procedure TfgCustomDialog<T>.ShowWithAutoClose(AAutoCloseTimer : Integer); begin if Supported then begin DoInitDialog; FAutoCloseTimer:=TTimer.Create(Self); FAutoCloseTimer.Interval:=AAutoCloseTimer; FAutoCloseTimer.OnTimer:=OnAutoCloseTimerTimer; FAutoCloseTimer.Enabled:=True; FNativeDialog.Show; end; end; } procedure TfgCustomDialog<T>.OnAutoCloseTimerTimer(Sender: TObject); begin FAutoCloseTimer.Enabled:=False; Hide; end; function TfgCustomDialog<T>.Supported: Boolean; begin Result := FNativeDialog <> nil; end; { TfgCustomActivityDialog } function TfgCustomActivityDialog.CreateNativeDialog: TfgNativeActivityDialog; var ProgressService: IFGXProgressDialogService; begin if TPlatformServices.Current.SupportsPlatformService(IFGXProgressDialogService, ProgressService) then Result := ProgressService.CreateNativeActivityDialog(Self) else Result := nil; end; { TfgCustomProgressDialog } constructor TfgCustomProgressDialog.Create(AOwner: TComponent); begin inherited Create(AOwner); FKind := DefaultKind; FMax := DefaultMax; end; function TfgCustomProgressDialog.CreateNativeDialog: TfgNativeProgressDialog; var ProgressService: IFGXProgressDialogService; begin if TPlatformServices.Current.SupportsPlatformService(IFGXProgressDialogService, ProgressService) then Result := ProgressService.CreateNativeProgressDialog(Self) else Result := nil; end; procedure TfgCustomProgressDialog.DoInitDialog; begin inherited DoInitDialog; FNativeDialog.Kind := Kind; FNativeDialog.Progress := Progress; FNativeDialog.Max := Max; end; procedure TfgCustomProgressDialog.SetKind(const Value: TfgProgressDialogKind); begin if Kind <> Value then begin FKind := Value; if Supported then NativeDialog.Kind := Kind; end; end; procedure TfgCustomProgressDialog.SetMax(const Value: Single); begin TfgAssert.StrickMoreThan(Value, 0, 'Max Value cannot be less than 0'); if not SameValue(Max, Value, Single.Epsilon) then begin FMax := Value; if Supported then NativeDialog.Max := Max; Progress := EnsureRange(Progress, 0, Max); end; end; procedure TfgCustomProgressDialog.SetProgress(const Value: Single); begin TfgAssert.InRange(Value, 0, Max, 'Progress value must be in range [0..Max]'); if not SameValue(Progress, Value, Single.Epsilon) then begin FProgress := EnsureRange(Value, 0, Max); if Supported then NativeDialog.Progress := Progress; end; end; procedure TfgCustomProgressDialog.ResetProgress; begin FProgress := 0; if Supported then NativeDialog.ResetProgress; end; initialization RegisterFmxClasses([TfgCustomActivityDialog, TfgActivityDialog, TfgCustomProgressDialog, TfgProgressDialog]); {$IF Defined(ANDROID) OR Defined(IOS)} RegisterService; {$ENDIF} finalization {$IF Defined(ANDROID) OR Defined(IOS)} UnregisterService; {$ENDIF} end. Изменено 8 января, 2018 пользователем Andrey Efimov Код спрятан под спойлер #WAMACO и Gerson Rogerio Lao 1 1 Цитата Ссылка на комментарий
0 Gerson Rogerio Lao Опубликовано 8 января, 2018 Автор Поделиться Опубликовано 8 января, 2018 Еще раз спасибо за вашу помощь. Но в этом случае я использую это почти в каждом приложении, до регистрации данных и подпрограмм denvio на сервер. и я не всегда буду знать время ответа. следует пример: fgActivityDialog1.Message: = 'Проверка подключения к Интернету.'; fgActivityDialog1.Show; try CM.DSRestConnection1.Host: = 'my.server.com'; // Пример CM.DSRestConnection1.TestConnection (); Result: = 'S'; except Result: = 'N'; End; fgActivityDialog1.hide; Это простой пример, в котором я мог бы играть в потоке. Но в ходе приложения у меня есть большие процедуры, в которых приложение переходит из одного источника в другой, делая использование потоков полезным. В этих случаях я не знаю, как долго сервер будет реагировать. Но если у вас есть триггерное время (10 000), и у вас есть способ имитировать его в конце процедуры, это будет жизнеспособно. Благодарю вас. Цитата Ссылка на комментарий
0 krapotkin Опубликовано 8 января, 2018 Поделиться Опубликовано 8 января, 2018 В любом случае, вам придется вносить изменения в программу, т.к. 10.2 имеет новый подход к потокам в приложении. Вы можете либо изменить свой код, либо код fgActivityDialog. В вашем случае можно попробовать так: fgActivityDialog1.Message: = 'Проверка подключения к Интернету.'; fgActivityDialog1.Show; TTask.Run(procedure var result :string; begin try CM.DSRestConnection1.Host: = 'my.server.com'; // Пример CM.DSRestConnection1.TestConnection (); Result: = 'S'; except Result: = 'N'; End; tthread.synchronize(NIL, procedure begin F_Result := result; fgActivityDialog1.hide; end); end); F_Result - это поле формы Евгений Корепов, Brovin Yaroslav и Gerson Rogerio Lao 2 1 Цитата Ссылка на комментарий
0 Gerson Rogerio Lao Опубликовано 8 января, 2018 Автор Поделиться Опубликовано 8 января, 2018 ок. Я проверю ваше назначение. Если я смогу реализовать в своих подпрограммах, я начну переход. Но это меня очень беспокоило. Ну, чтобы работать сегодня так, как это делается для Android, я использую delphi 10.1, а для iphone я использую delphi 10.2.1. И я постараюсь оставить все в последней версии. Но однажды, Большое вам спасибо за ваше время и помощь. Цитата Ссылка на комментарий
Вопрос
Gerson Rogerio Lao
Это не работает. Диалоговое окно не отображается.
fgActivityDialog1.Message := 'Teste';
fgActivityDialog1.Show;
sleep(3000);
fgActivityDialog1.Hide;
Ссылка на комментарий
9 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.