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

Error

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

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

  • Посещение

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

    8

Сообщения, опубликованные Error

  1. Я создал данную тему чтобы выяснить наличие спроса на кастомные FMX компоненты. При наличии спроса будут появляться новые FMX компоненты.

     

    TEsImageSelection

    4.11.2016 23-32-28.png

    Начну с компонента позволяющего выделать часть изображения или фотографии, может быть полезно для создания аватарки в вашем приложении, графических редакторах, и подобном. Предусмотрен режим контроля границ, пропорционального выделения - к примеру для квадратной\круглой аватараки.

    Интересно наличие спроса на данный компонент за цену в $8? (+вы получаете поддержку и новые версии в течении года)

  2. 19 часов назад, web_warp сказал:

    При переносе немаленького проекта с Berlin Architect 24.0.22858.6822 на Berlin Architect 24.0.24468.8770 стал некорректно работать Code Completion (ctrl + space): 

    Он отрабатывает на собственные подключаемые классы,comp_er1.png

    меняя типы возвращаемых данных на int,comp_er2.png  

    ни в какую не хочет, например, показывать список компонентов на форме, т.к. тоже всё меняет на int. Создаём UnicodeString CT, а Code Completion думает, что это int CT.comp_er3.png

    Что делать? Как лечить? Или меня в дурку уже?((

    К сожалению на данный момент Code Completion частично сломан, и к сожалению, с каждой версией все хуже :(

    Как можно попробовать починить:

    • Возможно у вас в коде есть синтаксическая ошибка, даже одна ошибка может поломать весь Code Completion.
    • Попробуйте пересобрать проект (Clean + Build).
    • Попробуйте перезапустить IDE.
    • Попробуйте пересоздать весь проект перетащив в него все юниты и формы, возможно на новом проекте Code Completion заработает.
  3. 20 минут назад, Alex7wrt сказал:

    1. Функцию FontSizeForBox можно было бы привести к типу single, так как в FMX шрифт может быть нецелым и, кроме того, функция CalcTextSize у вас определяется типом TSizeF

    К сожалению, это сделает функцию более медленной, я был перед выбором или скорость или точность, учитывая уже имеющиеся тормоза FMX я решил выбрать скорость. Но даже так функция работает весьма не плохо.

    23 минуты назад, Alex7wrt сказал:

    2. Расширить функциональность FontSizeForBox на случай многострочного текста.

    Да, в будущем расширю обе функции для этого.

  4. *** Небольшой обмен опытом ***

    Вижу что вопросы о размере текста довольно частые, поделюсь своими наработками.

    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;

    ---

    Также данные функции можно найти в этом юните

  5. 1 час назад, Ufomaster сказал:

    Изучаю паттерны.  Меня интересует почему рабочий паттерн отличается от того который среда генерирует по умолчанию. 

    Я бы не пользовался данной функцией генерации паттернов, судя по тому что 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;

     

  6. Только что, Steepe_Hare сказал:

    менеджер событий - это один таймер на все события? но Interval же у всех разный

    Это некий вспомогательный класс, к примеру TEventManager, который хранит список событий в формате <СсылкаНаОбработчик, НеобходимаяЗадержкаПередВызовом>,

    Внутри класса молотит 1 таймер, обработчик которого проходит по списку и смотрит какие события необходимо вызвать и удалить из списка, или не удалять если нужна периодичность, а просто перенести НеобходимаяЗадержкаПередВызовом вперед.

    Когда нам надо создать событие мы делаем что-то типо EventManager.Add(OnAnoterTimer, 100);

  7. Добавлю что менеджер событий - это единственное верное решение, в противном случае (куча таймеров) приложение станет настолько не детерминированным, что глюки будут лезть отовсюду, а нормальная отладка просто невозможна.

  8. 1 час назад, chaplin.u@gmail.com сказал:

    Спасибо Руслан но уровень заряда я знаю. Мне нужно на моей форме дать уровень заряда на удалённом приборе. Значёк батарейки с полосками внутри. Хорошо бы и цветом управлять.

    Могу написать соответствующий компонент на заказ, если заинтересовало пишите на почту

  9. Цитата

    когда выбираешь "Настроить", появляется окошко с ползунком, которое хрен уберешь. 

    Достаточно еще раз нажать "Настроить"

    Цитата

    Реализуй сворачивание в трей

    Это противоречит философии приложения - максимальная простота - "в одно нажатие"

  10. 16 часов назад, ZuBy сказал:

    Смотрел код, незнал что можно вызвать через апи.

    я делал через .bat

    
    shutdown -s -t <время>
     
    shutdown -a

     

    Вконце концов "shutdown" дергает теже самые api :)

  11. 19 часов назад, Pax Beach сказал:

    А в Android работает? ;-) Это очень актуально.

     

    к сожалению на Android нет возможности выключить устройство программно без рут прав.

  12. screenshot.png

    PowerOff - максимально упрощенное приложение для автоотключения компьютера.

    Приложение и исходный код можно загрузить здесь: https://github.com/errorcalc/PowerOff

    Полезно если вы перед сном любите включать ролики на YouTube/музыку/сериалы/фильмы, но засыпаете и они продолжают играть всю ночь, вызывая на утро головную боль...

    По большому счету утилита была написана и с целью проверить пригодность технологии FireMonkey для разработки - в целом - да, на данный момент, под Windows (и для имитирования UWP интерфейса), это вполне работоспособная технология.

  13. 3 часа назад, jornada сказал:

     

    Это не баг. Не могу найти что в стилевом оформлении листвью отвечает за эту линию и как цвет поменять.

    Screenshot_2016-08-22-22-24-13.png

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

×
×
  • Создать...