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

Семисегментный индикатор


Рекомендуемые сообщения

Компоненты TSevSeg - семисегментный индикатор и TSeparator - разделитель.

Переписал компоненты с VCL. Может, кому пригодится. Пример использования:

 

sevseg.jpg

 

Для разового использования можно просто подключить к проекту как модуль.

 

SevenSegment.zip

Изменено пользователем Tera
Ссылка на комментарий
  • Администраторы

Добрый день, Юрий,
 
Красота. Хороший компонент. Возможно вам пригодятся пара замечаний по портированию с VCL на FMX, которые помогу вам сделать ваш компонент еще лучше.

  • Когда вы выполняете отрисовку в перекрытом методе TControl.Paint, не надо вызывать BeginScene и EndScene. Так как этими методами руководит сцена, обычно это форма.
    procedure TSeparator.Draw(px1, py1, px2, py2: Single; pColor: TAlphaColor; Opac: Single);
    var
      MyRect: TRectF;
    begin
      MyRect := TRectF.Create(px1, py1, px2, py2);
    
      with Canvas do
      begin
       [b] BeginScene; // <!--- Не нужно[/b]
        Fill.Kind := TBrushKind.Solid;
        Fill.Color := pColor;
        FillRect(MyRect, 0, 0, AllCorners, Opac);
        [b]EndScene; [/b][b]<!--- Не нужно[/b]
      end;
      Canvas
    end;
    

Дополнительно:

1. Инициализацию точек для полигона можно сделать сразу на прямую. 

Было:

  // Установить точки, определяющие многоугольник
  p1 := TPointF.Create(px1, py1);
  p2 := TPointF.Create(px2, py2);
  p3 := TPointF.Create(px3, py3);
  p4 := TPointF.Create(px4, py4);
  p5 := TPointF.Create(px5, py5);
  p6 := TPointF.Create(px6, py6);

  // Создать полигон
  SetLength(MyPolygon, 6);
  MyPolygon[0] := p1;
  MyPolygon[1] := p2;
  MyPolygon[2] := p3;
  MyPolygon[3] := p4;
  MyPolygon[4] := p5;
  MyPolygon[5] := p6; 

Стало:

  MyPolygon := [TPointF.Create(px1, py1),
                TPointF.Create(px2, py2),
                TPointF.Create(px3, py3),
                TPointF.Create(px4, py4),
                TPointF.Create(px5, py5),
                TPointF.Create(px6, py6)];

При этом для динамических массивов перед присваивание не нужно  вызывать функцию SetLength. Экономия места и 6 переменных.

 

2. Сравнение вещественных чисел должно осуществляться при помощи функции System.Math.SameValue. Это касается всех мест в этом юните. В противном случае у вас могут быть фантомные ложные срабатывания условий, которые найти будет сложно.

Было:

procedure TSevSeg.SetCellSpace(const Value: Single);
begin
  if Value = CellSpace then
    exit;
  FCellSpace := Value;
end;

Стало:

procedure TSevSeg.SetCellSpace(const Value: Single);
begin
  if SameValue(Value, CellSpace) then
    exit;
  FCellSpace := Value;
end;
Ссылка на комментарий

Спасибо Brovin Yaroslav за советы. Все исправил. Я совсем недавно стал изучать FireMonkey.

SevenSegment.zip

Изменено пользователем Tera
Ссылка на комментарий
  • Администраторы

Стоит. Так как FireMonkey использует вещественную координатную сетку, и поэтому особенно на устройствах с нестандартным скейлом около 1,33 вещественная сетка позволит избежать "прыганья" контрола при изменении его позиции

Ссылка на комментарий
  • Администраторы

В вашей новой версии SameValue так же нужно использовать для сравнения с 0 или 1. По факту - все сравнения вещественных чисел только с SameValue

Ссылка на комментарий

Доработал компонент под Андроид. Исправил некоторые ошибки. В архиве есть примеры (без исходников). Индикатор можно подвигать мышкой или пальцем.

 

SevenSegment.zip

Изменено пользователем Tera
Ссылка на комментарий
  • 2 недели спустя...

Добавил несколько свойств. Text – позволяет вводить значение '-0', CodeSym – позволяет отображать некоторые буквы, для чего свойство Style необходимо установить в sCode.

Добавил компонент TDegree – градус.

 

degree.jpg

SevenSegment.zip

Ссылка на комментарий
  • 2 недели спустя...

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...