Alex7wrt
-
Постов
508 -
Зарегистрирован
-
Посещение
-
Победитель дней
31
Активность репутации
-
Alex7wrt получил реакцию от Vitaldj в Отображение значка дочерней формы на панели задач, Windows
Нашел решение в другой теме.
http://fire-monkey.ru/topic/504-neskolko-okon-prilozheniia-v-paneli-zadach/
-
Alex7wrt отреагировална Равиль Зарипов (ZuBy) в Несколько мониторов, Windows
Как то так
Left := screen.Displays[1].BoundsRect.Left; -
Alex7wrt отреагировална Brovin Yaroslav в Как сделать вывод текста в верхнем/нижнем регистре для отображения математической степени или индекса?
Добрый день,
Пока, к сожалению, нету поддержки стиля верхнего и нижнего регистров для текста. Поэтому вместо жонглирования TText, я бы сделал свой компонент. В нем достаточно будет только определить метод Paint для отрисовки текста. Дальше просто:
TTextLayout используем для измерения размеров текста. Потом согласно расчетам, просто выводим в нужные позиции текст. Для вдохновения можно сделать по образу и подобию TText.
Расчет размеров текста:
ATextLayout.BeginUpdate; try ATextLayout.Text := Text; ATextLayout.WordWrap := False; ATextLayout.MaxSize := TSizeF.Create(1000, 1000); finally ATextLayout.EndUpdate; end; Result := ATextLayout.TextRect.Size; Вывод текста:
либо так:
AContext.Canvas.FillText(Bounds, Text, False, 1, [], TTextAlign.Leading); Либо через TTextLayout:
ATextLayout.Render; Вам остается только добавить логику по вычислению позиции верхнего или нижнего регистра относительно основного текста.
-
Alex7wrt отреагировална Brovin Yaroslav в [Android] Не получается увеличить высоту TProgressBar
По умолчанию, каждая платформа определяет свои правила оформления пользовательского интерфейса, согласно Руководству пользовательского интерфейса Андроида TProgressBar не может быть по высоте другого размера. Поэтому стиль андроид платформы в Firemonkey запрещает изменять высоту некоторых контролов, в том числе TProgressBar. Аналогичная ситуация в Eclipse для андроида. Там также нельзя менять для этого компонента его высоту.
Фиксация размера происходит путем сохранения в стиле свойств FixedHeight и FixedWidth (не доступного в дизайнере). Если эти свойства больше 0, значит контрол будет иметь фиксированный размер.
Решение
Если вы вдруг захотели нарушить стандарты, рекомендованные Google по оформлению UI, вы можете сделать следующее:
1. Открыть BitmapStyleDesigner (находится в папке bin студии bin\BitmapStyleDesigner.exe)
2. В выпадающем списке первой кнопки на панели инструментов Создать новый стиль (светлый или темный) для платформы андроид. Редактор автоматически создаст вам стандартный стиль для андроида.
3. Сохранить стиль для Firemonkey. В диалоге сохранения выбрать тип файла "FireMonkey Style (*.style)"
4. Открыть сохраненный файл стиля в текстовом редакторе и найти в нем стиль TProgressBar - "progressbarstyle".
5. Удалить из стиля строчку:
FixedHeight = 10 6. Сохранить стиль и загрузить файл стиля в TStyleBook.
Теперь для TProgressBar можно менять высоту. Однако, учтите, что стили для Андроид и iOS растровые. Это значит, что при растровое исходное изображение прогресс бара рассчитано на высоту в 10 пикселей и при увеличении высоты, вы потеряете качество отрисовки прогресс бара (смотрите рисунок выше).
-
Alex7wrt получил реакцию от Brovin Yaroslav в [TEdit] [Android] Можно ли изменить высоту TEdit?
Большое спасибо!
-
Alex7wrt отреагировална Brovin Yaroslav в [TEdit] [Android] Можно ли изменить высоту TEdit?
Добрый вечер,
Посмотрите тему: Почему для некоторых контролов нельзя поменять высоту или ширину?
-
Alex7wrt отреагировална krapotkin в Заполнение текстом контрола, TText
до полной нечитаемости текста
задача может быть решена путем метода половинного деления
смотрите тему про подстройку размера TLabel
только в вашем случае после измерения надо будет не размер контрола менять, а делить кегль пополам и смотреть, больше надо или меньше
У алгоритма неплохая сходимость, но быстрым его не назовешь...
-
Alex7wrt отреагировална 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; При таком подходе главный поток не будет блокироваться и будет корректно отрисовываться и работать.
-
Alex7wrt отреагировална Brovin Yaroslav в Получаем разрешение экрана устройства, логические и физические размеры экрана в FireMonkey
Введение
Появление экранов повышенной плотность физических точек, привело с одной стороны к проблеме адаптации графического интерфейса под разные разрешения экранов при их одинаковых физических размерах, с другой к увеличению четкости и качества картинки.
Например, если раньше на iPhone 3 при размере экрана 3,5 дюйма позволял отобразить 320х480 точек, то на устройстве iPhone 4 при таком же физическом размере экрана, экран мог уже отображать 640х960 точек. Это хорошо видно на увеличенном изображении обычного экрана и ретина экрана на рисунке ниже (слева - не ретина, справа - ретина (2х)). Справа количество физических точек ровно в четыре раза больше, чем слева:
Для разработчика это могло означать, что интерфейс привязанный к разрешению 320х480 на Retina экране будет занимать только четверть экрана. Естественно, что использование разрешения экрана в физических координатах не удобно с этой точки зрения. Именно по этому появились логические координаты, которые гарантируют, что тот же пользовательский интерфейс для iPhone 3, будет иметь такие же размеры (физические) и на экране с ретиной.
FireMonkey работает в логических координатах. Это означает, что на iPhone 3 - 4 мы работаем с логическим разрешением 320x480 точек. Однако, при отображении интерфейса на iPhone 4 c (с двойной плотностью пикселей по сравнению с iPhone 3), интерфейс автоматически масштабируется на физическое разрешение 640х960 с коэффициентом масштабирования равным 2.
Практика
Теперь посмотрим, как получить всю эту информацию. Вся информация об экране (логический размер и коэффициент масштабирования) находится в сервисе IFMXScreenService.
Чтобы получить физическое разрешение экрана, нужно логический размер умножить на коэффициент масштабирования.
Код ниже показывает, как получить доступ к этому сервису и извлечь требуемые параметры:
var ScreenService: IFMXScreenService; LogicScreenSize: TPoint; ScreenScale: Single; begin // Запрашиваем сервис экрана, для получения информации о размере и текущем коэффициенте масштабирования if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then begin LogicScreenSize := ScreenService.GetScreenSize.Round; ScreenScale := ScreenService.GetScreenScale; LabelLogicScreenSize.Text := Format('Логический размер: %d, %d', [LogicScreenSize.X, LogicScreenSize.Y]); LabelPhysicScreenSize.Text := Format('Физический размер: %f, %f', [LogicScreenSize.X * ScreenScale, LogicScreenSize.Y * ScreenScale]); LabelScreenScale.Text := Format('Коэффициент масштабирования: %f',[ScreenService.GetScreenScale]); end; end; Результат кода приведен на снимке экранов ниже для iPad устройств с ретиной экраном и без:
-
Alex7wrt отреагировална Andrey Efimov в Некорректное определение разрешения экрана
Мне кажется, было бы полезнее дать ссылку на небольшую заметку Ярослава, в конце концов, пользуйтесь поиском, заметка лежит рядом с этой темой....
Получаем разрешение экрана устройства, логические и физические размеры экрана в FireMonkey
-
Alex7wrt отреагировална Равиль Зарипов (ZuBy) в Некорректное определение разрешения экрана
вот тут наглядно показано
-
Alex7wrt отреагировална master webs в Изменить положение контролов при повороте экрана
самый простой вариант
procedure TForm1.FormResize(Sender: TObject);
begin
// Orientation
if (Height > Width) then
Label7.Text := 'Orientation: Portrait'
else if (Height < Width) then
Label7.Text := 'Orientation: Landscape';
end;
источник http://delphifmandroid.blogspot.com/2014/01/blog-post.html
-
Alex7wrt отреагировална Ginne в Как сделать зеркально отраженный текст?
Отражение можно получить простой манипуляцией Scale(X,Y), вот пример использования:
-
Alex7wrt отреагировална Tera в Семисегментный индикатор
Компоненты TSevSeg - семисегментный индикатор и TSeparator - разделитель.
Переписал компоненты с VCL. Может, кому пригодится. Пример использования:
Для разового использования можно просто подключить к проекту как модуль.
SevenSegment.zip
-
Alex7wrt отреагировална Евгений Корепов в Сообщения чата в виде сообщений в iphone.
Для одного проекта писал такое пару месяцев назад, пользуйтесь.Под windows, при клике на сообщение, оно превращается в readonly TMemo - дабы можно было скопировать нужное из сообщения. При наличии URL в сообщении, сбоку появляется кнопка открыть - лучше ничего для открытия ссылок не придумал. Надо бы сделать диалог выбора для открытия одной из нескольких ссылок, но руки пока не доходят. Пощупать чат вживую можно в приложении https://play.google.com/store/apps/details?id=ru.flintnet.InternetAgent , для активации и загрузки примера чата отсканируйте приложением qr-код с страницы http://internetagent.flintnet.ru/
unit ChatBox; interface uses System.SysUtils, System.Classes, FMX.Types, FMX.Controls, FMX.Layouts,System.Types, FMX.StdCtrls,FMX.Edit,FMX.Memo,FMX.TextLayout,System.UITypes,FMX.Graphics,FMX.Objects, FMX.Effects,FMX.Styles.Objects; type TMessagePos = (msgLeft,msgRight); TEventText = procedure(PURL: String) of object; TChatBox = class(TVertScrollBox) private FTextLyout : TTextLayout; FLastMessageId : Integer; FMsgWidthPercentage : Integer; FOnURLButtonClick : TEventText; FCalloutLength : Single; FCalloutXRadius : Single; FCalloutYRadius : Single; FMessageFontSize : Single; FMemo : TMemo; procedure ButtonClick(Sender: TObject); procedure MyMsgContainerOnClick(Sender: TObject); procedure MyMsgContainerOnExit(Sender: TObject); function FCreateMsgBlock(AOwner: TComponent; PMessageId : Integer; PDate, PAutor, PMessage : String; PMessagePos : TMessagePos) : TLayout; function CalculateTextItemHeight(Sender: TObject) : Single; procedure LayoutResize(Sender: TObject); function ExtractURL(pString : String) : String; procedure Memo1ApplyStyleLookup(Sender: TObject); public property LastMessageId : Integer read FLastMessageId; property MsgWidthPercentage : Integer read FMsgWidthPercentage write FMsgWidthPercentage default 80; constructor Create(AOwner: TComponent); override; destructor Destroy; override; Procedure AddMessage(pMessageId : Integer; PDate, PAutor, PMessage : String; PMessagePos : TMessagePos); procedure ClearChildren(AChatBox: TChatBox); procedure ScrollBottomSmoothly; procedure ScrollBottom; published property OnURLButtonClick : TEventText read FonURLButtonClick write FonURLButtonClick; property CalloutLength : Single read FCalloutLength write FCalloutLength; property CalloutXRadius : Single read FCalloutXRadius write FCalloutXRadius; property CalloutYRadius : Single read FCalloutYRadius write FCalloutYRadius; property MessageFontSize : Single read FMessageFontSize write FMessageFontSize; end; TOpenChatBox = class(TChatBox); Procedure Register; implementation procedure Register; begin RegisterComponents('EKorepov', [TChatBox]); end; constructor TChatBox.Create(AOwner: TComponent); begin inherited create(Aowner); FLastMessageId:=-1; FTextLyout := TTextLayoutManager.DefaultTextLayout.Create; FMemo:=TMemo.Create(Aowner); FMemo.TextSettings.WordWrap:=True; FMemo.ReadOnly:=True; FMemo.Align:=TAlignLayout.Client; FMemo.OnExit:=MyMsgContainerOnExit; FMemo.OnApplyStyleLookup:=Memo1ApplyStyleLookup; FMemo.StyledSettings:=FMemo.StyledSettings-[TStyledSetting.Size]; With Self as TVertScrollBox do begin AniCalculations.Animation := True; AniCalculations.BoundsAnimation := True; AniCalculations.TouchTracking := [ttVertical]; end; end; destructor TChatBox.Destroy; begin FreeAndNil(FMemo); FreeAndNil(FTextLyout); inherited Destroy; end; procedure TChatBox.ScrollBottomSmoothly; begin AniCalculations.MouseWheel(0, ContentBounds.Height+5); end; procedure TChatBox.ScrollBottom; begin ScrollBy(0, -ContentBounds.Height); end; procedure TChatBox.ButtonClick(Sender: TObject); Var URL : String; begin URL:=TButton(Sender).HelpKeyword; if Assigned(FonURLButtonClick) then FonURLButtonClick(URL); end; procedure TChatBox.Memo1ApplyStyleLookup(Sender: TObject); begin end; procedure TChatBox.MyMsgContainerOnClick(Sender: TObject); begin FMemo.TextSettings:=TLabel(Sender).TextSettings; FMemo.Lines.Text:=TLabel(Sender).Text; TLabel(Sender).AddObject(FMemo); end; procedure TChatBox.MyMsgContainerOnExit(Sender: TObject); begin if (Sender is TMemo) then if Assigned(TMemo(Sender).Parent) then if (TMemo(Sender).Parent is TLabel) then TLabel(TMemo(Sender).Parent).RemoveObject(TMemo(Sender)); end; procedure TChatBox.ClearChildren(AChatBox: TChatBox); begin Assert(AChatBox <> nil); TOpenChatBox(AChatBox).Content.DeleteChildren; AChatBox.Repaint; end; function TChatBox.CalculateTextItemHeight(Sender: TObject) : Single; var Item: TLabel; begin Result:=0; if (Sender is TLabel) then begin Item := TLabel(Sender); FTextLyout.BeginUpdate; try FTextLyout.Text := Item.Text; FTextLyout.MaxSize := TPointF.Create(Item.Width-Item.Margins.Left-Item.Margins.Right-10, 1000); FTextLyout.Font := Item.Font; FTextLyout.WordWrap:= Item.WordWrap; FTextLyout.HorizontalAlign:= Item.TextSettings.HorzAlign; FTextLyout.VerticalAlign:= Item.TextSettings.VertAlign; finally FTextLyout.EndUpdate; end; Result:= FTextLyout.Height+10; end; end; procedure TChatBox.LayoutResize(Sender: TObject); Var Item : TLabel; CalloutRectangle : TCalloutRectangle; Layout : TLayout; I : Integer; begin Layout:=TLayout(Sender); for I := 0 to Layout.Children.Count-1 do begin If Layout.Children.Items[I] is TCalloutRectangle Then begin CalloutRectangle:=TCalloutRectangle(Layout.Children.Items[I]); Item:=TLabel(CalloutRectangle.Children.Items[0]); CalloutRectangle.Width:=(Layout.Width / 100) * FMsgWidthPercentage; Layout.Height:=CalculateTextItemHeight(Item); end; If Layout.Children.Items[I] is TButton Then begin TButton(Layout.Children.Items[I]).Width:=(Layout.Width / 100) * (100-FMsgWidthPercentage-5); end; end; end; Procedure TChatBox.AddMessage(pMessageId : Integer; PDate, PAutor, PMessage : String; PMessagePos : TMessagePos); Var lcLayout : TLayout; begin PDate:=Trim(PDate); PAutor:=Trim(PAutor); PMessage:=Trim(PMessage); FLastMessageId:=PMessageId; lcLayout:=FCreateMsgBlock((Self as TVertScrollBox), PMessageId, PDate, PAutor, PMessage, PMessagePos); Self.AddObject(lcLayout); end; function TChatBox.FCreateMsgBlock(AOwner: TComponent; PMessageId : Integer; PDate, PAutor, PMessage : String; PMessagePos : TMessagePos) : TLayout; Var lcLayout,lcLayout2 : TLayout; Item : TLabel; Button : TButton; CalloutRectangle : TCalloutRectangle; lcHeight : Single; URL : String; begin lcLayout:=TLayout.Create(AOwner); lcLayout.Tag:=pMessageId; lcLayout.Align:=TAlignLayout.Top; lcLayout.Width:=200; lcLayout.Position.X:=0; lcLayout.Position.Y:= ((AOwner as TVertScrollBox).ContentBounds.Height+10); lcLayout.Margins.Bottom:=10; CalloutRectangle:=TCalloutRectangle.Create(lcLayout); CalloutRectangle.XRadius:=FCalloutXRadius; CalloutRectangle.YRadius:=FCalloutYRadius; CalloutRectangle.CalloutWidth:=10; CalloutRectangle.CalloutOffset:=-3-FCalloutYRadius-CalloutRectangle.CalloutWidth; CalloutRectangle.Width:=((AOwner as TVertScrollBox).Width / 100) * FMsgWidthPercentage; CalloutRectangle.HitTest:=False; case PMessagePos of msgRight : begin CalloutRectangle.Align:=TAlignLayout.Right; CalloutRectangle.CalloutPosition:=TCalloutPosition.Right; CalloutRectangle.Padding.Right:=CalloutRectangle.CalloutLength+CalloutRectangle.XRadius; CalloutRectangle.Padding.Left:=CalloutRectangle.XRadius; end; msgLeft : begin CalloutRectangle.Align:=TAlignLayout.Left; CalloutRectangle.CalloutPosition:=TCalloutPosition.Left; CalloutRectangle.Padding.Left:=CalloutRectangle.CalloutLength+CalloutRectangle.XRadius; CalloutRectangle.Padding.Right:=CalloutRectangle.XRadius; end; end; CalloutRectangle.Padding.Top:=1; CalloutRectangle.Padding.Bottom:=1; lcLayout.AddObject(CalloutRectangle); Item:=TLabel.Create(CalloutRectangle); Item.TextSettings.Font.Size:=MessageFontSize; CalloutRectangle.AddObject(Item); Item.Align:=TAlignLayout.Client; {$IFDEF MSWINDOWS} Item.OnClick:=MyMsgContainerOnClick; {$ENDIF MSWINDOWS} Item.Text:=PDate+' '+PAutor+#10+PMessage; Item.HitTest:=True; Item.WordWrap:=True; lcHeight:=CalculateTextItemHeight(Item); lcLayout.Height:=lcHeight; URL:=ExtractURL(pMessage); Item.StyledSettings:=Item.StyledSettings- [TStyledSetting.Size,TStyledSetting.Style]; if Not URL.IsEmpty then begin lcLayout2:=TLayout.Create(lcLayout); lcLayout2.Align:=TAlignLayout.Client; lcLayout2.Margins.Left:=5; lcLayout2.Margins.Right:=5; lcLayout.AddObject(lcLayout2); Button:=TButton.Create(lcLayout2); Button.Text:='Открыть'; Button.Align:=TAlignLayout.Center; Button.HelpKeyword:=URL; Button.OnClick:=ButtonClick; lcLayout2.AddObject(Button); end; lcLayout.OnResize:=LayoutResize; Result:=lcLayout; end; function TChatBox.ExtractURL(pString : String) : String; Var S : String; begin Result:=''; if Not pString.Contains('http') then Exit; S:=pString.Substring(Pos('http',pString)-1); S:=S.Remove(S.IndexOfAny([' ',','])); Result:=S.TrimRight(['.']); end; end. -
Alex7wrt отреагировална ophion в [TBannerAd] [Android] Почему на устройстве не отображается реклама BannerAd?
Рекомендую начать с простого... проверьте файл hosts, который расположен тут /system/etc/hosts
Именно этот файл редактирует AdBlock и прочие решения.
-
Alex7wrt отреагировална AngryOwl в Скрытие приложения с панели задач.
Попробуйте
uses {$IFDEF MSWINDOWS}, Winapi.Windows, FMX.Platform.Win{$ENDIF}; {$IFDEF MSWINDOWS} ShowWindow(ApplicationHWND, SW_HIDE); {$ENDIF} -
Alex7wrt отреагировална Kitty в RAD XE9 (RAD X Seattle)
Правильно.
Для споров Си или Делфи полно других форумов.
-
Alex7wrt отреагировална alexbirukov в KTeam приложение для уведомления о ДТП мотоциклистов Челябинска
Разработчик: Александр Бирюков
Ссылки на приложения: iOS и Android
Описание:
Алгоритм работы:
Пользователь попавший в ДТП создает заявку или нажатием кнопки SOS в экстренной ситуации отправляет экстренное сообщение на сервер. Модераторы получают СМС уведомления о произошедшей аварии. После модерации пользователи системы получают СМС уведомления с адресом аварии и Push уведомления.
-
Alex7wrt отреагировална Brovin Yaroslav в Описание TfgApplicationEvents - мониторинг основных событий приложения
Описание:
Назначение: Получение основных событий приложения, путем подвешивания обработчиков на события компонента в дизайнере Поддерживаемые платформы: Windows, OSX, iOS, Android Демо проект: Samples\ApplicationEventsDemo\ApplicationEventsDemo.dproj Доступен с версии: XE7 Возможности:
Все события перехватываю события во всем приложении.
Получение результатов (интентов) из других приложений (OnActivityResult) Нотификация о выполнения Action в TAсtionList (OnActionExecute) Нотификация о обновлении Action в TAсtionList (OnActionUpdate) Перехват любого исключения в приложении (OnException) Простой приложения (OnIdle) Оповещение об изменении размера формы (OnFormSizeChanged) Оповещение о необходимости сохранить данные UI формы при изменении состояния приложения. Особенно актуально для мобильных платформ (OnSaveState) Изменение состояния приложения (OnStateChanged) Факт изменения стиля формы (OnStyleChanged) Изменение ориентации устройства (OnOrientationChanged) Все формы приложения на старте созданы (OnFormsCreated) Форма приложения разрушается (OnFormReleased) Изменение главной формы (OnMainFormChanged) Изменение заголовка главной формы (OnMainFormCaptionChanged) Уведомление об отображении формы (OnFormBeforeShown) Уведомления об активации и деактивации формы (OnFormActive, OnFormDeactivate) Уведомления о создании и разрушении формы (OnFormCreate, OnFormDestroy) Изменение скейла экрана (OnScaleChanged)
-
Alex7wrt отреагировална Brovin Yaroslav в Описание TfgActivityDialog
Описание
Назначение: Компонент предназначен для визуального отображения хода выполнения длительной операции. При этом пользовательский интерфейс блокируется диалоговым окном до окончания выполнения задачи. Используется, когда время выполнения задачи нельзя оценить никаким адекватным способом (Ожидание ответа от сервера при авторизации и тд.) Если время выполнения известно, то рекомендуется использовать TfgProgressDialog Поддерживаемые платформы: iOS, Android Демо проект: Samples\ProgressDialogDemo\ProgressDialogDemo.dproj Скриншоты
Работа под iOS:
Работа под Андроид (Выше, чем GingerBread 2.3): Работа под Андроид (GingerBread 2.3): -
Alex7wrt отреагировална rareMax в Шаблон невизуального компонента
Type
TBaseComponent=Class(TComponent)
private
protected
public
Constructor Create(AOwner:TComponent);override;
Destructor Destroy;override;
published
end;
implementation
Constructor TBaseComponent.Create(AOwner:TComponent);
Begin
inherted Create(Aowner);
End;
Destructor TBaseComponent.Destroy;
Begin
inherted Destroy;
end;
-
Alex7wrt получил реакцию от zonik в Как записать видео на Андроиде?
Да чего там )) Все точно подмечено. Напишу немного не в тему, тоже извините... Я вот удивляюсь, почему относительно несложные приложения на андроиде после установки на устройство занимают около 30 МБ, когда нативные могут и меньше мегабайта весить. Неоспоримый плюс FMX - возможность практически одним кодом писать для нескольких платформ, из-за чего страдает качество в каждом из них. Здесь однозначно есть к чему стремиться.
-
Alex7wrt отреагировална Равиль Зарипов (ZuBy) в [Android] [XE7] Ошибка класса ENotImplemented
procedure TForm22.Button1Click(Sender: TObject); var aParams: TMapsEngineYandexLocator; params, values: array of string; begin // 37.151.215.206 Астана, Казахстан SetLength(params, 1); SetLength(values, 1); params[0] := 'Внешний IP'; InputQuery('Введите...', params, values, procedure(const AResult: TModalResult; const AValues: array of string) begin if AResult = mrOk then begin mEngine.SetOptionsYandexLocator(''); aParams.IP.IPAddress_v4 := AValues[0]; TTask.Run( procedure begin mEngine.YandexLocator(aParams, TMapsEngineYandexLocatorType.IP, myLoc); mEngine.SetOptionsYandex(''); // получить через Yandex mEngine.Geocoding(myLoc, aData); TThread.Synchronize(nil, procedure begin lbCoordinate.Text := 'lat: ' + myLoc.Latitude.tostring + ' lon: ' + myLoc.Longitude.tostring; lbAddress.Text := aData.CountryCode + ' ' + aData.City + ' ' + aData.FormattedAddress; end); end); end; end); end; -
Alex7wrt получил реакцию от AngryOwl в Как записать видео на Андроиде?
Да чего там )) Все точно подмечено. Напишу немного не в тему, тоже извините... Я вот удивляюсь, почему относительно несложные приложения на андроиде после установки на устройство занимают около 30 МБ, когда нативные могут и меньше мегабайта весить. Неоспоримый плюс FMX - возможность практически одним кодом писать для нескольких платформ, из-за чего страдает качество в каждом из них. Здесь однозначно есть к чему стремиться.