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

Brovin Yaroslav

Администраторы
  • Постов

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

  • Посещение

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

    390

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

  1. Like
    Brovin Yaroslav отреагировална Martifan в iOS Speech To Text   
    https://github.com/jimmckeeth/FireMonkey-Android-Voice/
  2. Like
    Brovin Yaroslav получил реакцию от Ярослав Никольский в Как в Builder C++ задать выравнивание компонента TAlignLayout?   
    Точка используется в языке Delphi, в С++ это будет в данном случае "::"
    ScrollBar1->Align = TAlignLayout::Client P.S. По скольку начиная с ХЕ6 требуется обязательное указание пространства имен для перечислимых типов, нужно обязательно указывать namespace.
  3. Thanks
    Brovin Yaroslav получил реакцию от FireMy в Сообщения чата в виде сообщений в iphone.   
    Для содания стиля сообщения используйте TStyleObject. Он позволяет исходную растровую картинку облака собщения растягивать в любой размер.
  4. Like
    Brovin Yaroslav получил реакцию от Alex7wrt в Как сделать перемещение контрола мышкой/пальцем?   
    Добрый вечер,
     
    Перемещение контрола можно сделать двумя способами:
    Используя обычный набор событий 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
    Brovin Yaroslav отреагировална krapotkin в Скругление углов у Edit   
  6. Like
    Brovin Yaroslav получил реакцию от ENERGY в Определить, к какому TObjectList принадлежит элемент   
    Так поиск в словаре O(1). Вычисление хеша и получение индекса.
  7. Like
    Brovin Yaroslav получил реакцию от Alex7wrt в Определить, к какому TObjectList принадлежит элемент   
    Грех не написать подробный ответ нашему постоянному пользователю с времен зарождения форума
  8. Like
    Brovin Yaroslav получил реакцию от Alex7wrt в Определить, к какому TObjectList принадлежит элемент   
    Если честно, тут задача на мой взгляд в неправильном подходе. Который порождает странную задачу. Это как плыть против течения, вместо того, чтобы плыть по течению.
    Если требуется выполнить данную задачу, то  лучше не побояться написать один дополнительный класс "Менеджер объектов", которому вы будите делегировать данную задачу.
    Чтобы поиск был быстрый, нужно использовать словарь. Время поиска будет O(1) против поиска в списке. Один из вариантов реализации может быть таким:
    В менеджере есть набор ваших списков (логические группы объектов) - список списков В менеджере есть словарь соответствия контрол -> индекс списка из (1) при добавлении контрола добавляете его в список и заносите контрол в словарь Поиск за О(1) Вариант, который предложил Kami хороший для вариантов, когда объекты ваши. А вот если вы хотите для штатных контролов это сделать, то чтобы подмешать такой интерфейс, вам потребуется сделать наследников для каждого UI контрола. А если эти контролы еще и на форме лежат, то там придется изрядно попотеть, чтобы добавить в IDE ваши версии штатных контролов с этим интерфейсом.
    P.S. Избегайте паттерна один контрол "владеется" несколькими списками. Это к "При создании каждого из них  AOwnsObjects задано как True.". Такой подход рано или поздно при усложнии логики закончится AV и сложным дебаггингом, кто кого удалил и когда и почему. Используйте золотое правило: "Один объект может иметь только одного владельца, один объект может использовать во многих других местах. Только владелец отвечает удаление объекта и в хорошем случае и за его создание. Клиенты объекта только пользуются им и не удаляют его."
  9. Like
    Brovin Yaroslav получил реакцию от kami в Определить, к какому TObjectList принадлежит элемент   
    Если честно, тут задача на мой взгляд в неправильном подходе. Который порождает странную задачу. Это как плыть против течения, вместо того, чтобы плыть по течению.
    Если требуется выполнить данную задачу, то  лучше не побояться написать один дополнительный класс "Менеджер объектов", которому вы будите делегировать данную задачу.
    Чтобы поиск был быстрый, нужно использовать словарь. Время поиска будет O(1) против поиска в списке. Один из вариантов реализации может быть таким:
    В менеджере есть набор ваших списков (логические группы объектов) - список списков В менеджере есть словарь соответствия контрол -> индекс списка из (1) при добавлении контрола добавляете его в список и заносите контрол в словарь Поиск за О(1) Вариант, который предложил Kami хороший для вариантов, когда объекты ваши. А вот если вы хотите для штатных контролов это сделать, то чтобы подмешать такой интерфейс, вам потребуется сделать наследников для каждого UI контрола. А если эти контролы еще и на форме лежат, то там придется изрядно попотеть, чтобы добавить в IDE ваши версии штатных контролов с этим интерфейсом.
    P.S. Избегайте паттерна один контрол "владеется" несколькими списками. Это к "При создании каждого из них  AOwnsObjects задано как True.". Такой подход рано или поздно при усложнии логики закончится AV и сложным дебаггингом, кто кого удалил и когда и почему. Используйте золотое правило: "Один объект может иметь только одного владельца, один объект может использовать во многих других местах. Только владелец отвечает удаление объекта и в хорошем случае и за его создание. Клиенты объекта только пользуются им и не удаляют его."
  10. Like
    Brovin Yaroslav отреагировална 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, а вообще чем угодно, что поддерживает указанный интерфейс.
    И если список сделать тоже с поддержкой интерфейса (не знаю, какие методы в нем необходимы), то и сам объект может работать со своим владельцем абсолютно не интересуясь его типом.
  11. Like
    Brovin Yaroslav получил реакцию от CodeToad в [Вебинар] FGX Native. Новейшая кроссплатформенная платформа для мобильной разработки на Delphi   
    Добрый вечер,
    Я подумаю об альтернативном средстве распространения новостей. Здесь отпишусь, как определюсь. Скорее всего буду публиковать новости на данном форуме в специальном разделе.
  12. Like
    Brovin Yaroslav отреагировална POV в Возможно ли закруглить углы в выделении ListView   
    В редактировании стиля найди selection, у него SourceLink и перетащи на кружок синий снизу слева. Измени размер и будет щастье... хотя наверняка как-то это тупо, можно правильнее.

  13. Like
    Brovin Yaroslav получил реакцию от Rusland в [Вебинар] FGX Native. Новейшая кроссплатформенная платформа для мобильной разработки на Delphi   
    Добрый вечер,
    Я подумаю об альтернативном средстве распространения новостей. Здесь отпишусь, как определюсь. Скорее всего буду публиковать новости на данном форуме в специальном разделе.
  14. Like
    Brovin Yaroslav получил реакцию от Ingalime в [Вебинар] FGX Native. Новейшая кроссплатформенная платформа для мобильной разработки на Delphi   
    Добрый вечер,
    Я подумаю об альтернативном средстве распространения новостей. Здесь отпишусь, как определюсь. Скорее всего буду публиковать новости на данном форуме в специальном разделе.
  15. Like
    Brovin Yaroslav получил реакцию от Akad в [Вебинар] FGX Native. Новейшая кроссплатформенная платформа для мобильной разработки на Delphi   
    Добрый вечер,
    Я подумаю об альтернативном средстве распространения новостей. Здесь отпишусь, как определюсь. Скорее всего буду публиковать новости на данном форуме в специальном разделе.
  16. Like
    Brovin Yaroslav получил реакцию от Savage в Инструкция по установке набора компонентов FGX   
    Скачать пакет можно здесь: Скачать
    1. Удалить старый пакет библиотеки FGX
    Открываем среду IDE RAD Studio XE7 с административными правами. В меню открываем менеджер пакетов: "Component -> Install Packages..."

    Среди списка компонентов находим "FMX Extension Components". Выделяем и нажимаем кнопку "Remove"

    2. Установка пакета библиотеки FGX
    Открываем в среде группу проектов. "File -> Open Project -> FGXGroup.groupproj"

    Собираем пакет fgx210 для всех требуемых платформ. Выделяем в менеджере проектов нужную платформу "Target Platforms" и в контекстном меню пакета fgx210 выбираем "Build"

    Далее повторяем сборку для всех целевых платформ.
    3. Устанавливаем Design-Time пакет
    Выбираем в группе проектов dclfgx210 пакет и в контекстном меню выбираем "Install"
    Если пакет успешно установлен, то появится сообщение со списком зарегистрированных компонентов следующего вида:

    Все! Установка окончена.
  17. Confused
    Brovin Yaroslav отреагировална dim в Странное поведение переменной integer   
    блин, что делаю не так (под андроид)
    var iio:integer;
    begin
        rz:=High(CartList);// возвращает 0 хотя есть 1 запись в массиве
        for iio := 0 to rz do begin
          // цикл не выполняется так как iio=1 в отладчике
        end;
    уже всю голову сломал подскажите что не так
  18. Like
    Brovin Yaroslav отреагировална Akad в Странное поведение переменной integer   
    Что такое CartList? Зачем High использовать (от слова вообще)? Что такое rz? Если for 0 to 0, то 1 раз цикл выполнится.
    P.S. Почему бы на форумах не перестать считать всех телепатами?
     
  19. Like
    Brovin Yaroslav получил реакцию от Ingalime в BEAM is Embarcadero's March Cool App Winner   
    Woll2Woll’s BEAM (Beacon External Advanced Mapper) is the missing feature for RAD Server’s BeaconFence technology and the March 2018 Winner of our Cool App contest. With RAD Server and BeaconFence it is easy to create an application that accurately tracks indoor location. Using the IDE map layout editor you place beacons on your floor plan, and then your app can accurately track its location through the map.

    That is where Woll2Woll’s BEAM technology comes in. It makes it easy to let your end users edit and create their own maps for use with your BeaconFence app. This flexibility makes your apps so much more flexible and powerful. You can build your app around BeaconFence without concern about the specifics of the location where it will be used. Then with BEAM it can be updated to based on beacon placement and the floor plan.
    Beyond BeaconFence and FireMonkey BEAM also makes use of Woll2Woll’s amazing FirePower components to round out its user interface. According to Roy Wall of Woll2Woll software, “BEAM uses RAD Studio’s FireMonkey so it is a universal application that shines in both usability and performance . . . with a common codebase it is trivial to add advanced features with a single development team.” The great thing is BEAM is available on iOS, macOS, Windows, and Android, supporting touch input as well as keyboard and mouse. It is in all the major App stores.
      
    BEAM was developed by Roy Woll of Woll2Woll software. You can find more information on Woll2Woll’s website and while you are there check out some of Woll2Woll’s other great products like FirePower.
    [YoutubeButton url='https://youtu.be/1C5VLJ3EIm8']
    Interested in submitting for the Embarcadero’s Cool App contest? It’s open to any business or consumer application built with RAD Studio, Delphi or C++Builder. Embarcadero awards Cool App contest winners a $500 Amazon gift card and winning submissions are also highlighted on the company’s YouTube channel. For more information on the contest and a link to the submission form, click here.
    Просмотр полной статьи
  20. Like
    Brovin Yaroslav отреагировална ENERGY в [Отклонение] TFloatAnimation и TFrame   
    Столкнулся с такой же проблемой, если любой компонент (в моем случае TImage ) лежит на фрейме не работает TFloatAnimation вообще.
    Решение: 
    При создании фрейма нужно указывать Self формы, а не  nil.
    : MyFrame := TMyFrame.Create(Self);
  21. Like
    Brovin Yaroslav отреагировална kami в Тормозит выполнение таймера   
    Не, оказывается я ошибся еще больше. Чтобы окончательно выяснить - залез на https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms644906(v=vs.85).aspx
    USER_TIMER_MINIMUM (0x0000000A), -  минимально возможный интервал = 10мс. Но это недостижимый идеал :)))
  22. Like
    Brovin Yaroslav отреагировална kami в Тормозит выполнение таймера   
    Графические движки не пользуются таймерами, это чревато гигантскими лагами.
    QueryPerfomanceCounter и т.п.
  23. Like
    Brovin Yaroslav отреагировална kami в Тормозит выполнение таймера   
    Ни одна операционная система (за исключением систем реального времени) не обеспечит вам такую точность. Среда разработки здесь ни при чем. Совсем.
    К примеру, на Windows минимально возможный интервал таймера, емнип, 55мс.
    При этом нужно понимать, что событие таймера сработает только тогда, когда главный поток не будет ничем занят. А это, поверьте, случается достаточно редко. Грубо говоря - событие отработает "по остаточному принципу".  Т.е. в реальности даже 55мс на Windows будет обеспечено далеко не всегда. Что уж говорить про мобильные платформы.
    Вам нужно пересмотреть алгоритм работы.
  24. Like
    Brovin Yaroslav отреагировална krapotkin в Тормозит выполнение таймера   
    услышьте plz. в токио перешли на "правильную" работу в едином потоке с Java. Вообще это хорошо. Но вся FMX писалась в расчете на старую модель. А теперь те фишки не работают )))
    когда поменяют - ХЗ
    поэтому универсальный ответ - смотрите как это сделано в исходниках, например у TAnimation там все понятно. ProcessMessages точно не будет работать больше. Наконец-то г"внокод умрет. Аллилуйя.
    Чтобы ответить на вопрос, как часто может быть вызван таймер, надо не срач на форуме устраивать а просто попробовать. И станет ясно, что 1000 fps не получить. И 100. Возможно, при попутном ветре, 10.
  25. Like
    Brovin Yaroslav отреагировална Akad в Тормозит выполнение таймера   
    Есть смысл переходить с 10.2.2 на 10.2.3? Народ тут писал, что студия вылетать стала на ровном месте. А судя по чейнж логу ни одного серьёзного бага поправлено не было.
    Во-первых интервал в 1мс для таймера не достижим без специальной настройки ОС. Реально события будут приходить 10-23мс. И это при условии, что программа больше ничего не делает. Это не зависит от дельфи, а зависит от винды.
    Во-вторых "накладные расходы" таймера при таком обновлении - это основная статья расходов процессора. И вообще так писать - это просто жесть. Любая анимация - это 1000/60мс т.е. частота обновления среднестатистического монитора. И то лучше 1000/30 или 1000/25. Меньше плавности на чуть, зато будет реально работать. Если нужна не анимация, а рассчёт чего-то - это надо выносить в отдельный поток.
    Если речь идёт про андроид/яось, то кроме нескольких деталей в целом ситуация не меняется. Писать так нельзя.
     
×
×
  • Создать...