Tot999
-
Постов
9 -
Зарегистрирован
-
Посещение
Активность репутации
-
-
Tot999 отреагировална Brovin Yaroslav в Фоновое выполнение операции без "замораживания" отрисовки
Вся отрисовка выполняется в главном потоке приложения. Поэтому, если вы пытаетесь выполнить скачивание файла в основном потоке, то вся отрисовка приостановится до момента окончания вашей операции. Поэтому правило хорошего тона - это вынесение долгих операций (загрузка, ответ авторизации и тд) в отдельный поток.
Примерный код приведен ниже:
1. Создаем отдельный поток, в котором вы будите скачивать файл (я поставил для эмуляции скачивания просто паузу на 5 секунд):
type TMyTask = class (TThread) protected FOnTaskStarted: TThreadMethod; FOnTaskFinished: TThreadMethod; procedure DoStarted; procedure DoFinished; procedure Execute; override; public property OnTaskStarted: TThreadMethod read FOnTaskStarted write FOnTaskStarted; property OnTaskFinished: TThreadMethod read FOnTaskFinished write FOnTaskFinished; end; Реализация:
{ TMyTask } procedure TMyTask.DoFinished; begin if Assigned(OnTaskFinished) then OnTaskFinished; end; procedure TMyTask.DoStarted; begin if Assigned(OnTaskStarted) then OnTaskStarted; end; procedure TMyTask.Execute; begin Synchronize(DoStarted); try Sleep(5000); // Эмуляция выполнения 5 Секундной задачи finally Synchronize(DoFinished); end; end; Само использование такого потока будет следующим (в моем примере после выполнения операции, появится сообщение):
TForm3 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private FMyTask: TMyTask; public procedure DoTaskStarted; // Callback, вызываемый в начале старта операции procedure DoTaskFinished; // Callback, вызываемый в конце выполнения операции. Аналог OnTerminate procedure StartMyTask; // Запуск задачи end; procedure TForm3.Button1Click(Sender: TObject); begin StartMyTask; end; procedure TForm3.DoTaskStarted; begin end; procedure TForm3.DoTaskFinished; begin ShowMessage('Выполнение задачи окончено'); end; procedure TForm3.StartMyTask; begin if FMyTask <> nil then begin FMyTasl.OnTaskStarted := nil; FMyTasl.OnTaskFinished := nil; FMyTask.Free; end; FMyTask := TMyTask.Create(True); FMyTask.OnTaskStarted := DoTaskStarted; FMyTask.OnTaskFinished := DoTaskFinished; FMyTask.Start; end; При таком подходе главный поток не будет блокироваться и будет корректно отрисовываться и работать.
-
Tot999 отреагировална Brovin Yaroslav в Как правильно рисовать на канве?
Отключить нет. Форма сама определяет при помощи контролов, какие области формы нужно перерисовать. Поэтому, если нужно добиться такого эффекта, то лучше использовать опять же временный буфер. И в нем делать наложение своей картинки на старую.
-
Tot999 получил реакцию от Anatoliy в TPaintox+Tbitmap
Добрый день!
Решил покопаться в своей старой спрайтовой игрушке, чтобы освежить в памяти знания и состряпать что-нибудь новое. Возникли сомнения, нормально ли сделано графическое отображение, можно ли доработать.
Все спрайты в дизайнтайме распиханы по Timagelist-ам. На старте приложения я загружаю битмапы из имэджлистов в свои обджектлисты, подгоняя под нужный размер.
MeduzasBitmpAr : array [1..numofMeduzas] of TObjectList<Tbitmap>;
Дальше рисую по таймеру в основном окне игры Tpaintbox.OnPaint:
В принципе, даже на слабеньких телефончиках, всё вроде бодро. Но может, опытные товарищи чего подскажут, а то я 3ий день в собственном соку варюсь, ничего толкового.
-
Tot999 отреагировална Brovin Yaroslav в [Android/Windows] [XE7] Как запретить прокручивание?
Тогда, отключение:
ScrollBox.AniCalculations.TouchTracking := []; Включение:
ScrollBox.AniCalculations.TouchTracking := [ttVertical]; -
Tot999 отреагировална Andrey Efimov в [Android] Почему у меня не принимается стиль, загруженный в TStyleBook?
Укажите стиль в форме, свойство StyleBook.
-
Tot999 отреагировална Равиль Зарипов (ZuBy) в WebForm.Fmx
делал когда-то так, может что изменилось
uses {$IFDEF ANDROID}REST.Authenticator.OAuth.WebForm.FMX{$ELSE}REST.Authenticator.OAuth.WebForm.Win var WebView: Tfrm_OAuthWebForm; ... procedure TForm1.FormCreate(Sender: TObject); begin WebView := Tfrm_OAuthWebForm.Create(self); WebView.OnTitleChanged := self.OAuth2_GoogleTasks_BrowserTitleChanged; end; ... procedure TForm1.OAuth2_GoogleTasks_BrowserTitleChanged(const ATitle: string; var DoCloseWebView: boolean); begin if Pos('Success code', ATitle) > 0 then begin AuthCode := Copy(ATitle, 14, Length(ATitle)); if (AuthCode <> '') then begin Memo1.Lines.Add(AuthCode); DoCloseWebView := true; WebView.Release; end; end; end; ... WebView.ShowWithURL(LURL);