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

Error

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

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

  • Посещение

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

    8

Весь контент Error

  1. Я создал данную тему чтобы выяснить наличие спроса на кастомные FMX компоненты. При наличии спроса будут появляться новые FMX компоненты. TEsImageSelection Начну с компонента позволяющего выделать часть изображения или фотографии, может быть полезно для создания аватарки в вашем приложении, графических редакторах, и подобном. Предусмотрен режим контроля границ, пропорционального выделения - к примеру для квадратной\круглой аватараки. Интересно наличие спроса на данный компонент за цену в $8? (+вы получаете поддержку и новые версии в течении года)
  2. К сожалению на данный момент Code Completion частично сломан, и к сожалению, с каждой версией все хуже Как можно попробовать починить: Возможно у вас в коде есть синтаксическая ошибка, даже одна ошибка может поломать весь Code Completion. Попробуйте пересобрать проект (Clean + Build). Попробуйте перезапустить IDE. Попробуйте пересоздать весь проект перетащив в него все юниты и формы, возможно на новом проекте Code Completion заработает.
  3. Это баг, заводите issue в багтрекер
  4. https://habrahabr.ru/search/?q=delphi+mvc#h Правда чистый MVC в VCL не выйдет\не целесообразен.
  5. К сожалению, это сделает функцию более медленной, я был перед выбором или скорость или точность, учитывая уже имеющиеся тормоза FMX я решил выбрать скорость. Но даже так функция работает весьма не плохо. Да, в будущем расширю обе функции для этого.
  6. На мой взгляд - там все хорошо, и нет утечки памяти
  7. *** Небольшой обмен опытом *** Вижу что вопросы о размере текста довольно частые, поделюсь своими наработками. function CalcTextSize(Text: string; Font: TFont; Size: Single = 0): TSizeF; Функция для расчета размера прямоугольника, занимаемого однострочным текстом. Параметры: Text - Текст Font - Шрифт с которым будет выводиться текст Size - если 0, то Font.Size будет использоваться из Font, иначе из данного параметра Исходный код: uses System.Types, FMX.Types, FMX.Graphics, FMX.TextLayout, System.Math, System.SysUtils; function CalcTextSize(Text: string; Font: TFont; Size: Single = 0): TSizeF; var TextLayout: TTextLayout; begin TextLayout := TTextLayoutManager.DefaultTextLayout.Create; try TextLayout.BeginUpdate; try TextLayout.Text := Text; TextLayout.MaxSize := TPointF.Create(9999, 9999); TextLayout.Font.Assign(Font); if not SameValue(0, Size) then begin TextLayout.Font.Size := Size; end; TextLayout.WordWrap := False; TextLayout.Trimming := TTextTrimming.None; TextLayout.HorizontalAlign := TTextAlign.Leading; TextLayout.VerticalAlign := TTextAlign.Leading; finally TextLayout.EndUpdate; end; Result.Width := TextLayout.Width; Result.Height := TextLayout.Height; finally TextLayout.Free; end; end; function FontSizeForBox(Text: string; Font: TFont; Width, Height: Single; MaxFontSize: Single = cMaxFontSize): Integer; Функция возвращающая максимально возможный размер шрифта, для текста вписанного в заданный прямоугольник. Параметры: Text - Текст Font - Шрифт с которым будет выводиться текст Width, Height - Ширина и высота прямоугольника MaxFontSize - Максимально возможный размер шрифта Исходный код: uses System.Types, FMX.Types, FMX.Graphics, FMX.TextLayout, System.Math, System.SysUtils; const cMaxFontSize = 512; function FontSizeForBox(Text: string; Font: TFont; Width, Height: Single; MaxFontSize: Single = cMaxFontSize): Integer; var Size, Max, Min, MaxIterations: Integer; Current: TSizeF; begin Max := Trunc(MaxFontSize); Min := 0; MaxIterations := 20; repeat Size := (Max + Min) div 2; Current := CalcTextSize(Text, Font, Size); if ((Abs(Width - Current.Width) < 1) and (Width >= Current.Width)) and ((Abs(Height - Current.Height) < 1) and (Height >= Current.Height)) then break else if (Width < Current.Width) or (Height < Current.Height) then Max := Size else Min := Size; Dec(MaxIterations); until MaxIterations = 0; Result := Size; end; --- Также данные функции можно найти в этом юните
  8. Я бы не пользовался данной функцией генерации паттернов, судя по тому что TList здесь создается не дженериковый, а обычный, функционал этот довольно заброшен. А уж отсутствию(!) у TSubject удаления созданного им TList это еще и говнокод. IObserver = interface procedure Update(ASubject: TSubject); end; TSubject = class strict private FObservers: TList; public constructor Create; procedure Attach(AObserver: IObserver); procedure Detach(AObserver: IObserver); strict protected procedure NotifyObservers; end; TConcreteSubject = class(TSubject) end; TConcreteObserver = class(TInterfacedObject, IObserver) public procedure Update(ASubject: TSubject); end; constructor TSubject.Create; begin inherited Create; FObservers := TList.Create; end; procedure TSubject.Attach(AObserver: IObserver); begin FObservers.Add(@AObserver); end; procedure TSubject.Detach(AObserver: IObserver); var idx: Integer; begin idx := FObservers.IndexOf(@AObserver); If idx <> -1 Then begin FObservers.Delete(idx); end; end; procedure TSubject.NotifyObservers; var Current: ^IObserver; begin for Current in FObservers do begin Current.Update(self); end; end; procedure TConcreteObserver.Update(ASubject: TSubject); begin // put your code here end;
  9. Это некий вспомогательный класс, к примеру TEventManager, который хранит список событий в формате <СсылкаНаОбработчик, НеобходимаяЗадержкаПередВызовом>, Внутри класса молотит 1 таймер, обработчик которого проходит по списку и смотрит какие события необходимо вызвать и удалить из списка, или не удалять если нужна периодичность, а просто перенести НеобходимаяЗадержкаПередВызовом вперед. Когда нам надо создать событие мы делаем что-то типо EventManager.Add(OnAnoterTimer, 100);
  10. Добавлю что менеджер событий - это единственное верное решение, в противном случае (куча таймеров) приложение станет настолько не детерминированным, что глюки будут лезть отовсюду, а нормальная отладка просто невозможна.
  11. Могу написать соответствующий компонент на заказ, если заинтересовало пишите на почту
  12. Достаточно еще раз нажать "Настроить" Это противоречит философии приложения - максимальная простота - "в одно нажатие"
  13. к сожалению на Android нет возможности выключить устройство программно без рут прав.
  14. особой разницы чем стилизовать нет, это известная проблема, и к сожалению нормального решения нет.
  15. PowerOff - максимально упрощенное приложение для автоотключения компьютера. Приложение и исходный код можно загрузить здесь: https://github.com/errorcalc/PowerOff Полезно если вы перед сном любите включать ролики на YouTube/музыку/сериалы/фильмы, но засыпаете и они продолжают играть всю ночь, вызывая на утро головную боль... По большому счету утилита была написана и с целью проверить пригодность технологии FireMonkey для разработки - в целом - да, на данный момент, под Windows (и для имитирования UWP интерфейса), это вполне работоспособная технология.
  16. Нет, нельзя, TPopupMenu/Window не могут принимать фокус ввода
  17. Error

    SearchBox в ListView

    По идее кромка принадлежит TEdit, попробуйте изменить стиль у TEdit на прозрачный (edit.StyleLookup = 'transparentedit')
  18. Error

    SearchBox в ListView

    Приложите скрин плиз, вполне возможно это баг из-за сглаживания текстур.
  19. Насколько я понимаю это суммарный доход при использовании Starter
×
×
  • Создать...