Перейти к содержанию
Fire Monkey от А до Я

Alex7wrt

Пользователи
  • Постов

    508
  • Зарегистрирован

  • Посещение

  • Победитель дней

    31

Активность репутации

  1. Like
    Alex7wrt получил реакцию от Vitaldj в Отображение значка дочерней формы на панели задач, Windows   
    Нашел решение в другой теме. 
    http://fire-monkey.ru/topic/504-neskolko-okon-prilozheniia-v-paneli-zadach/
     
  2. Like
    Alex7wrt отреагировална Равиль Зарипов (ZuBy) в Несколько мониторов, Windows   
    Как то так
    Left := screen.Displays[1].BoundsRect.Left;
  3. Like
    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; Вам остается только добавить логику по вычислению позиции верхнего или нижнего регистра относительно основного текста.
  4. Like
    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 пикселей и при увеличении высоты, вы потеряете качество отрисовки прогресс бара (смотрите рисунок выше).
  5. Like
    Alex7wrt получил реакцию от Brovin Yaroslav в [TEdit] [Android] Можно ли изменить высоту TEdit?   
    Большое спасибо!
  6. Like
    Alex7wrt отреагировална Brovin Yaroslav в [TEdit] [Android] Можно ли изменить высоту TEdit?   
    Добрый вечер,
    Посмотрите тему: Почему для некоторых контролов нельзя поменять высоту или ширину?  
  7. Like
    Alex7wrt отреагировална krapotkin в Заполнение текстом контрола, TText   
    до полной нечитаемости текста
     
    задача может быть решена путем метода половинного деления
    смотрите тему про подстройку размера TLabel
    только в вашем случае после измерения надо будет не размер контрола менять, а делить кегль пополам и смотреть, больше надо или меньше
    У алгоритма неплохая сходимость, но быстрым его не назовешь...
  8. Like
    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; При таком подходе главный поток не будет блокироваться и будет корректно отрисовываться и работать.
  9. Like
    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 устройств с ретиной экраном и без:

  10. Like
    Alex7wrt отреагировална Andrey Efimov в Некорректное определение разрешения экрана   
    Мне кажется, было бы полезнее дать ссылку на небольшую заметку Ярослава, в конце концов, пользуйтесь поиском, заметка лежит рядом с этой темой....
    Получаем разрешение экрана устройства, логические и физические размеры экрана в FireMonkey
  11. Like
    Alex7wrt отреагировална Равиль Зарипов (ZuBy) в Некорректное определение разрешения экрана   
    вот тут наглядно показано
  12. Like
    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
  13. Like
    Alex7wrt отреагировална Ginne в Как сделать зеркально отраженный текст?   
    Отражение можно получить простой манипуляцией Scale(X,Y), вот пример использования:

  14. Like
    Alex7wrt отреагировална Tera в Семисегментный индикатор   
    Компоненты TSevSeg - семисегментный индикатор и TSeparator - разделитель.
    Переписал компоненты с VCL. Может, кому пригодится. Пример использования:
     

     
    Для разового использования можно просто подключить к проекту как модуль.
     
    SevenSegment.zip
  15. Like
    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.
  16. Like
    Alex7wrt отреагировална ophion в [TBannerAd] [Android] Почему на устройстве не отображается реклама BannerAd?   
    Рекомендую начать с простого... проверьте файл hosts, который расположен тут /system/etc/hosts
    Именно этот файл редактирует AdBlock и прочие решения.
  17. Like
    Alex7wrt отреагировална AngryOwl в Скрытие приложения с панели задач.   
    Попробуйте
    uses   {$IFDEF MSWINDOWS}, Winapi.Windows, FMX.Platform.Win{$ENDIF}; {$IFDEF MSWINDOWS} ShowWindow(ApplicationHWND, SW_HIDE); {$ENDIF}
  18. Like
    Alex7wrt отреагировална Kitty в RAD XE9 (RAD X Seattle)   
    Правильно.
    Для споров Си или Делфи полно других форумов.
  19. Like
    Alex7wrt отреагировална alexbirukov в KTeam приложение для уведомления о ДТП мотоциклистов Челябинска   
    Разработчик: Александр Бирюков
    Ссылки на приложения: iOS и Android
    Описание:
     


    Алгоритм работы:
    Пользователь попавший в ДТП создает заявку или нажатием кнопки SOS в экстренной ситуации отправляет экстренное сообщение на сервер. Модераторы получают СМС уведомления о произошедшей аварии. После модерации пользователи системы получают СМС уведомления с адресом аварии и Push уведомления.




  20. Like
    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)

     
  21. Like
    Alex7wrt отреагировална Brovin Yaroslav в Описание TfgActivityDialog   
    Описание
    Назначение: Компонент предназначен для визуального отображения хода выполнения длительной операции. При этом пользовательский интерфейс блокируется диалоговым окном до окончания выполнения задачи. Используется, когда время выполнения задачи нельзя оценить никаким адекватным способом (Ожидание ответа от сервера при авторизации и тд.) Если время выполнения известно, то рекомендуется использовать TfgProgressDialog Поддерживаемые платформы: iOS, Android Демо проект: Samples\ProgressDialogDemo\ProgressDialogDemo.dproj Скриншоты
    Работа под iOS:
    Работа под Андроид (Выше, чем GingerBread 2.3): Работа под Андроид (GingerBread 2.3):
  22. Like
    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;
  23. Like
    Alex7wrt получил реакцию от zonik в Как записать видео на Андроиде?   
    Да чего там )) Все точно подмечено. Напишу немного не в тему, тоже извините... Я вот удивляюсь, почему относительно несложные приложения на андроиде после установки на устройство занимают около 30 МБ, когда нативные могут и меньше мегабайта весить. Неоспоримый плюс FMX - возможность практически одним кодом писать для нескольких платформ, из-за чего страдает качество в каждом из них. Здесь однозначно есть к чему стремиться.
  24. Like
    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;
  25. Like
    Alex7wrt получил реакцию от AngryOwl в Как записать видео на Андроиде?   
    Да чего там )) Все точно подмечено. Напишу немного не в тему, тоже извините... Я вот удивляюсь, почему относительно несложные приложения на андроиде после установки на устройство занимают около 30 МБ, когда нативные могут и меньше мегабайта весить. Неоспоримый плюс FMX - возможность практически одним кодом писать для нескольких платформ, из-за чего страдает качество в каждом из них. Здесь однозначно есть к чему стремиться.
×
×
  • Создать...