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

Alex7wrt

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

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

  • Посещение

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

    31

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

  1. Like
    Alex7wrt отреагировална Евгений Корепов в Требования к целевому уровню API с августа 2018 г.   
    Аудитория никак не изменится. Ведь minSdkVersion="14" все равно перекроет и все старые устройства.
  2. Like
    Alex7wrt получил реакцию от Евгений Корепов в Требования к целевому уровню API с августа 2018 г.   
    ИМХО, можно разместить версию с Target SDK 14, чтобы собрать как можно большую аудиторию, а в ноябре обновить приложение до 26.
  3. Like
    Alex7wrt отреагировална Евгений Корепов в Обработка анимированных GIF по рецепту китайского коллеги   
    Принцип работы такой:
    На форму кладете стандартный TImage Создаете экземпляр TGifPlayer Задаете свойство FGifPlayer.Image:=Image; где Image это лежащая на форме TImage Загружаете гифку FGifPlayer.LoadFromFile('D:\Embarcadero\Projects\ShareCode\FMX.GifUtils\GIF_Example.gif'); Запускаем проигрывание гифки FGifPlayer.Play; Вот код:
    unit UnitFormMain; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.GifUtils, FMX.Objects; type TFormMain = class(TForm) Image: TImage; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } FGifPlayer : TGifPlayer; end; var FormMain: TFormMain; implementation {$R *.fmx} procedure TFormMain.FormCreate(Sender: TObject); begin FGifPlayer:=TGifPlayer.Create(Self); FGifPlayer.Image:=Image; FGifPlayer.LoadFromFile('D:\Embarcadero\Projects\ShareCode\FMX.GifUtils\GIF_Example.gif'); FGifPlayer.Play; end; end. Вот демо проект во вложении:
     
    FMX.GifUtils.Demo.zip
  4. Like
    Alex7wrt отреагировална Brovin Yaroslav в Как сделать перемещение контрола мышкой/пальцем?   
    Добрый вечер,
     
    Перемещение контрола можно сделать двумя способами:
    Используя обычный набор событий OnMouseDown, OnMouseMove, OnMouseUp. Использовать для перемещения жесты. 1. Реализация с использованием событий мыши
    Эти события реализованы для всех платформ. В том числе они эмулируются на мобильных платформ, где понятия мыши, как такового нету. Это означает, что их можно использовать для реализации перетаскивания контрола. Это можно сделать, например, следующим образом:
     
    а) Создаем форму и кидаем на нее картинку. Я назвал ее DraggableImage.

    б) Заводим два поля.
    TForm5 = class(TForm) DraggableImage: TImage; procedure DraggableImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); procedure DraggableImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single); procedure FormCreate(Sender: TObject); procedure DraggableImageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); private FStartPos: TPointF; FPressed: Boolean; end; FStartPos - начальная локальная позиция мыши внутри нашего контрола (картинки), когда пользователь зажал кнопку мышки или опустил палец на экран. FPressed - флаг для сигнализирования, что пользователь опустил палец (зажал кнопку мыши) на нашу картинку и до текущего момента не снял с экрана. в) В конструкторе формы для перетаскиваемого контрола ОБЯЗАТЕЛЬНО задаем AutoCapture = True. Это позволит контролу генерировать события перемещения мыши, даже если курсор мыши ушел за локальные границы контрола.
    procedure TForm5.FormCreate(Sender: TObject); begin DraggableImage.AutoCapture := True; end;  г) В момент нажатия на картинку сохраняем локальную позицию мыши и задаем флаг FPressed = True
    procedure TForm5.DraggableImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin FPressed := True; FStartPos := TPointF.Create(X, Y); end; д) В момент отпускания кнопки мыши или убирания пальца с экрана сбрасываем флаг FPressed:
    procedure TForm5.DraggableImageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin FPressed := False; end; е) И собственно меняем позицию картинки, когда мы ведем мышкой по картинке:
    procedure TForm5.DraggableImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single); var MoveVector: TVector; begin if FPressed then begin // Вычисляем локальное смещение относительно первоначальной позиции MoveVector := TVector.Create(X - FStartPos.X, Y - FStartPos.Y, 0); // Вычисляем смещение в координатах формы, чтобы учесть изменение // координат при смещении родительских контролов MoveVector := DraggableImage.LocalToAbsoluteVector(MoveVector); if DraggableImage.ParentControl <> nil then      MoveVector := DraggableImage.ParentControl.AbsoluteToLocalVector(MoveVector); // Перемещаем картинку на вычисленный вектор // Для RAD Studio XE5 DraggableImage.Position.Point := DraggableImage.Position.Point + MoveVector.ToPointF; // Для новых версий // DraggableImage.Position.Point := DraggableImage.Position.Point + TPointF(MoveVector); end; end; Этот кусок стоит прокомментировать, чтобы корректно выполнить перетаскивание контролу обязательно нужно вычислять смещение в абсолютных координатах формы. Причина в том, что если контрол повернут или входит один в другой, то нужно учитывать смещения всей цепочки родительских контролов до формы. Поэтому мы вначале вычисляем смещение в локальных координатах, затем вычисляем его в абсолютных координатах формы. А затем обратно переводим в локальные координаты родительского контрола. После чего изменяем позицию контрола на вычисленное смещение.
     
    Такой подход используется, в частности, в контроле TSelection, который так же можно перемещать мышкой или пальцем.
     
    P.S. Чтобы лучше понять это, нарисуйте на листке бумаги положения контрола и попробуйте вручную выполнить этот алгоритм с преобразованием координат. 
     
    Собственно говоря, такой подход отлично работает везде и не требует использования системы жестов.
    2. Реализация с использованием жестов
    Этот способ будет работать только на мобильных платформах, поскольку нужный жест Pan (если я правильно помню) не поддерживается под Windows. Поэтому в целом, первый вариант является универсальным и лучшим решением. 
  5. Like
    Alex7wrt отреагировална Brovin Yaroslav в Определить, к какому TObjectList принадлежит элемент   
    Грех не написать подробный ответ нашему постоянному пользователю с времен зарождения форума
  6. Like
    Alex7wrt отреагировална Brovin Yaroslav в Определить, к какому TObjectList принадлежит элемент   
    Если честно, тут задача на мой взгляд в неправильном подходе. Который порождает странную задачу. Это как плыть против течения, вместо того, чтобы плыть по течению.
    Если требуется выполнить данную задачу, то  лучше не побояться написать один дополнительный класс "Менеджер объектов", которому вы будите делегировать данную задачу.
    Чтобы поиск был быстрый, нужно использовать словарь. Время поиска будет O(1) против поиска в списке. Один из вариантов реализации может быть таким:
    В менеджере есть набор ваших списков (логические группы объектов) - список списков В менеджере есть словарь соответствия контрол -> индекс списка из (1) при добавлении контрола добавляете его в список и заносите контрол в словарь Поиск за О(1) Вариант, который предложил Kami хороший для вариантов, когда объекты ваши. А вот если вы хотите для штатных контролов это сделать, то чтобы подмешать такой интерфейс, вам потребуется сделать наследников для каждого UI контрола. А если эти контролы еще и на форме лежат, то там придется изрядно попотеть, чтобы добавить в IDE ваши версии штатных контролов с этим интерфейсом.
    P.S. Избегайте паттерна один контрол "владеется" несколькими списками. Это к "При создании каждого из них  AOwnsObjects задано как True.". Такой подход рано или поздно при усложнии логики закончится AV и сложным дебаггингом, кто кого удалил и когда и почему. Используйте золотое правило: "Один объект может иметь только одного владельца, один объект может использовать во многих других местах. Только владелец отвечает удаление объекта и в хорошем случае и за его создание. Клиенты объекта только пользуются им и не удаляют его."
  7. Like
    Alex7wrt отреагировална kami в Определить, к какому TObjectList принадлежит элемент   
    В рантайме нет никаких дженериков. Компилятор преобразует все дженерики в реальные списки с необходимой типизацией. Поэтому - действительно никак. Вполне возможно, что даже is TObjectList<TMyClass> не сработает - компилятор вполне вправе посчитать исходный класс TObjectList<TMyClass> не тем, с которым производится is.
    Это неправильно. Потому что есть еще Insert, есть Update (в том числе - и InsertRange). Правильно - перекрыть метод Notify или реализовать обработчик события OnNotify (последнее даже создания наследников не требует).
    Вообще, если по каким-то причинам необходимо знать "владельца", было бы совсем хорошо сделать наследника от TRectangle, который будет реализовывать интерфейс наподобие такого:
     
    IOwneredIntf = interface ['{ADF563F3-B4CE-4E96-9559-F0FFC2936D5Z}'] function GetOwner: TObject; procedure SetOwner(const Value: TObject); property Owner: TObject read GetOwner write SetOwner; end; Список, который хочет установить владельческие отношения с этим TRectangle, в своем методе Notify приводит его к интерфейсу и устанавливает intf.Owner:=Self
    Ну и в обратном порядке - тоже.
    При этом появляется возможность работать со списком не только TRectangle, а вообще чем угодно, что поддерживает указанный интерфейс.
    И если список сделать тоже с поддержкой интерфейса (не знаю, какие методы в нем необходимы), то и сам объект может работать со своим владельцем абсолютно не интересуясь его типом.
  8. Like
    Alex7wrt отреагировална ENERGY в Что невозможно сделать на Delphi для Android?   
    Delphi хоронят уже лет 15, это все слова. Нет идеальных инструментов. У всех какие то косяки, втч и у нативных средств, ведь все это придумывают люди, люди не роботы.
    На деле Delphi отличное средство для мультиплатформенной разработки вполне сложных программ. Мне как фрилансеру вполне хватает. Производительность гораздо лучше чем у Angular\Ionic, которые по факту WebView - веб в браузере - очень тормозное решение и подходит только для формочки "логин\пароль".  Также по производительности и глюкам Delphi имхо лучше чем ReactJS, и Xamarin aka Mono. 
    Во фрилансе огромная конкуренция, в основном индусы, в этом плане с Delphi можно быстрее разработать ПО чем предлагают сроки остальные.
    Проблема Делфай в том что оно дорогое, и  не так распространено - (это взаимосвязанный фактор) - таким образом сложно найти команду и мало проектов на нем разрабатывается, меньше сообщество и меньше документации и библиотек с готовыми решения Поэтому для одиночек это больше подходит.
     
    Но конечно нужно смотреть на развитие - вот Токио получилась очень сырым продуктом, я до сих пор на Берлине пишу под 4 платформы, если следующая версия выйдет такой же ультраглючной, то следует задуматься.
    А вообще хороший программист - это тот кто знает несколько языков, не бойтесь учить новое - опыт ускорит разработку с любым инструментом.
  9. Like
    Alex7wrt получил реакцию от Brovin Yaroslav в Тормозит выполнение таймера   
    Выше правильно написали о глюках в Tokyo под Android. 
    Также учтите, что событие таймера, также как и анимации, обрабатываются в главном потоке. При этом вы задали достаточно маленький интервал для таймера. Поэтому, лучше перенести действия над визуальными компонентами за пределы таймера (если они там есть), а сам таймер сделать на основе потоков.
  10. Like
    Alex7wrt получил реакцию от Rokweb в Тормозит выполнение таймера   
    Выше правильно написали о глюках в Tokyo под Android. 
    Также учтите, что событие таймера, также как и анимации, обрабатываются в главном потоке. При этом вы задали достаточно маленький интервал для таймера. Поэтому, лучше перенести действия над визуальными компонентами за пределы таймера (если они там есть), а сам таймер сделать на основе потоков.
  11. Like
    Alex7wrt отреагировална ENERGY в Пример с CurveTo, кривые Безье   
    Исправленный код для Берлина и выше:
    procedure TForm2.FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); var path : TPathData; begin path := TPathData.Create; try path.MoveTo(TPointF.Create (10,100)); path.CurveTo (TPointF.Create(100,10),TPointF.Create(150,150), TPointF.Create(200,100)); Canvas.Stroke.Thickness := 2; Canvas.Stroke.Kind := TBrushKind.Solid; Canvas.Stroke.Color := TAlphaColorRec.Red; Canvas.BeginScene; Canvas.DrawPath(path, 1.0); Canvas.EndScene; finally path.Free; end; end;
     
     
  12. Like
    Alex7wrt получил реакцию от Alexey Belyaev в Портетная и альбомная ориентация - как лучше сделать разный дизайн?   
    В событии OnResize формы проверять width > height и для каждого из двух вариантов переприсваивать позиции и размеры тех контролов, которые должны меняться.
     
  13. Like
    Alex7wrt отреагировална sinuke в Возможно ли сделать такой интерфейс с ЛистВью?   
    Ну вот набросал примерчик. Он упрощенный, но смысл такой же примерно (код листвью со скриншота выше выложить не могу просто из-за того, что там идут зависимости от модели данных).
    Лично я все рисую кодом - так полный контроль того, что выводится на экран. И собственно так можно выводить практически что угодно. И не нужны никакие монструозные ТМС компоненты

    ListView_Schedule_Sample.zip
  14. Like
    Alex7wrt отреагировална sinuke в Возможно ли сделать такой интерфейс с ЛистВью?   
    да, легко
    вот мое расписание в листвью
     

  15. Like
    Alex7wrt отреагировална Akad в Application.ProcessMessages - плохой стиль?   
    Так же плохой для многих стиль - goto, break и continue. А многим коллегам ума не хватает даже использовать  free /release и глобальные переменные, для них созданы всякие диезы с явами. И дальше что? Подстраиваться под всех, не используя возможности полноценного языка?
    Application.ProcessMessages надо просто использовать с осторожностью. Таймеры отключать, за нажатиями на закрытие форм и пр. следить. Если есть какое-то долгое вычисление, которое не предсказуемо через какое время закончится, а таблицу уже начали обновлять, то милое дело запустить его в другом потоке, параллельно в GUI проигрывая анимашку.  Другие варианты  реализаций - это очень сложно, и интерфейс получится не отзывчивым.
    Splash с прогрессом надо делать только так, если максимальной скорости загрузки хотим. Вообще много областей применений есть у  Application.ProcessMessages. Надо помнить об основных нюансах, иначе будут проблемы.
     
  16. Like
    Alex7wrt отреагировална CyberStorm в Публикация для небольшой группы людей   
    Опубликовать врядли - какой профит получит компания Google от вашего приложения для избранных?
    Можно попробовать бета-режим:
    Используйте закрытое тестирование для целевых групп. Выберите этот вариант, чтобы протестировать приложение в небольшой группе пользователей (например, среди сотрудников компании или отдела). Закрытое бета-тестирование может проводиться для отдельных адресов электронной почты, сообщества Google+ или группы Google.
  17. Like
    Alex7wrt получил реакцию от rareMax в Анимация движение button по кругу   
    В вашем случае несколько TButton, у каждого из них меняются две координаты, и все это зависит от одного параметра. Поэтому нет особого смысла в TAnimation, здесь проще воспользоваться Таймером.
    Сделал простой пример, во вложении.
     
     
    Buttons.zip
  18. Like
    Alex7wrt получил реакцию от Ingalime в Анимация движение button по кругу   
    Задать для тех TButton, которые должны вращаться по окружности значение
    Position.Point:=PointF(Xc+R*cos(A+D[i]), Yc+R*sin(A+D[i])), где Xc, Yc - координаты центра, вокруг которого движется TButton, R - расстояние от этого центра до центральной точки TButton, A - параметр (угол), который линейно меняется (если нужна постоянная скорость) с помощью таймера либо TAnimation.
    Если элементов TButton несколько, то сдвигом A+D задается угловое смещение TButton относительно друг друга. Например, если всего N штук TButton, то Di=2*Pi/N*i.
    Xc, Yc и R легко выражается через координаты и размеры центра и TButton.
    P.S. Задача аналогична круговому вращению планет вокруг Солнца
  19. Like
    Alex7wrt получил реакцию от MrAnderson в Что невозможно сделать на Delphi для Android?   
    Первый раз слышу о проблемах с TThread.Synchronize.
     
  20. Like
    Alex7wrt отреагировална ENERGY в Как нарисовать круглый TImage   
    С помощью маски можно любую форму.TBitmap.CreateFromBitmapAndMask().
    В результате получим изображение с прозрачностью, в данном случае звезда и прозрачный фон. 

    procedure TForm1.Button1Click(Sender: TObject); var ImageRes: TResourceStream; Result: TBitmap; tmpMS : TMemoryStream; begin ImageRes := TResourceStream.Create(HInstance, 'IMAGE', RT_RCDATA); try Image1.Bitmap.CreateFromStream(ImageRes); Image2.Bitmap.LoadFromFile('c:\temp\MaskedBitmap\Images\Mask.png'); Result := TBitmap.Create; Result.CreateFromBitmapAndMask(Image1.Bitmap, Image2.Bitmap); // applying alpha channel to Bitmap - workaround. If you can improve write here how tmpMS := TMemoryStream.Create; Result.SaveToStream(tmpMS); Result.LoadFromStream(tmpMS); tmpMS.Free; Image3.Bitmap.Assign(Result); finally ImageRes.Free; Result.Free; end; end;  
    MaskedBitmap.zip
  21. Like
    Alex7wrt отреагировална Равиль Зарипов (ZuBy) в Что невозможно сделать на Delphi для Android?   
    1) Решение Андрея не полное, нет колбэка от выбранного действия. Неизвестно юзер разрешил или нет
    2) Не работают сервисы как положено
    3) Старый СДК, из-за чего мы не можем использовать
    новые темы (сейчас используется Holo Light) окраска статус бара, в делфе тспользуется костыль процы интел не поддерживаются (хотя уже и не выпускают новые, но все же) для того чтобы сделать мультилайн в уведомлениях нужно перекомпилить fmx.jar  4) Ограничение в делфи (в бридже) на создание джава классов, из-за чего FMX не может просто перейти на новый СДК
    5) Нет нативного рендеринга
    6) Невозможно использовать анимацию
    7) Работа с картой и браузером ужасна
    8) Работа с пуш уведомлениями тоже ужасна, нужно все самому
     
    И это скорее всего не всё, то что вспомнил  
  22. Like
    Alex7wrt отреагировална Akad в Что невозможно сделать на Delphi для Android?   
    Вопрос не в том, что можно или не можно принципиально сделать, а в том на сколько это потом будет работать у пользователя. Так вот например в текущей версии (10.2.2) можно добиться, что установленное с помощью шнура и adb приложение будет работать стабильно. Но потом берём удаляем это приложение через диспетчер, ставим этот же apk и получаем крэш на старте в дебрях fmx. Очищаем данные с помощью кнопки в диспетчере приложений, и прога (о чудо!) работает без сбоев. Вот подобные проблемы сводят на нет все старания. Когда у вас на отладочных телефонах всё работает нормально, а в плей марките вам единицы ставят да ещё и в отзывах ругают.

     
  23. Like
    Alex7wrt отреагировална S_007 в Контур TRectangle   
    Alex безразмерное Спасибо! 
  24. Like
    Alex7wrt получил реакцию от S_007 в Контур TRectangle   
    Если нужно убрать контур полностью, то 
    Rec_1.Stroke.Kind:=TBrushKind.None; Если нужно отобразить не все стороны, то
    Rec_1.Sides := [TSide.Top, TSide.Left, TSide.Right];  
  25. Like
    Alex7wrt отреагировална #WAMACO в Окончание подписки   
    только оплатить
×
×
  • Создать...