Tera Опубликовано 23 октября, 2015 Опубликовано 23 октября, 2015 (изменено) Компоненты TSevSeg - семисегментный индикатор и TSeparator - разделитель. Переписал компоненты с VCL. Может, кому пригодится. Пример использования: Для разового использования можно просто подключить к проекту как модуль. SevenSegment.zip Изменено 23 декабря, 2016 пользователем Tera Brovin Yaroslav, zairkz, Kitty и 6 других 9 Цитата
Администраторы Brovin Yaroslav Опубликовано 23 октября, 2015 Администраторы Опубликовано 23 октября, 2015 Добрый день, Юрий, Красота. Хороший компонент. Возможно вам пригодятся пара замечаний по портированию с 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; AngryOwl, xenon54, Равиль Зарипов (ZuBy) и 3 других 6 Цитата
Tera Опубликовано 23 октября, 2015 Автор Опубликовано 23 октября, 2015 (изменено) Спасибо Brovin Yaroslav за советы. Все исправил. Я совсем недавно стал изучать FireMonkey. SevenSegment.zip Изменено 23 декабря, 2016 пользователем Tera AngryOwl, zairkz и Kitty 3 Цитата
Tera Опубликовано 23 октября, 2015 Автор Опубликовано 23 октября, 2015 Brovin Yaroslav, может вообще не стоит использовать Single, ведь пиксели все равно не делятся и где-то округляются. zairkz 1 Цитата
Администраторы Brovin Yaroslav Опубликовано 23 октября, 2015 Администраторы Опубликовано 23 октября, 2015 Стоит. Так как FireMonkey использует вещественную координатную сетку, и поэтому особенно на устройствах с нестандартным скейлом около 1,33 вещественная сетка позволит избежать "прыганья" контрола при изменении его позиции Цитата
Администраторы Brovin Yaroslav Опубликовано 23 октября, 2015 Администраторы Опубликовано 23 октября, 2015 В вашей новой версии SameValue так же нужно использовать для сравнения с 0 или 1. По факту - все сравнения вещественных чисел только с SameValue Цитата
Tera Опубликовано 27 октября, 2015 Автор Опубликовано 27 октября, 2015 (изменено) Доработал компонент под Андроид. Исправил некоторые ошибки. В архиве есть примеры (без исходников). Индикатор можно подвигать мышкой или пальцем. SevenSegment.zip Изменено 23 декабря, 2016 пользователем Tera zairkz 1 Цитата
Tera Опубликовано 5 ноября, 2015 Автор Опубликовано 5 ноября, 2015 Добавил несколько свойств. Text – позволяет вводить значение '-0', CodeSym – позволяет отображать некоторые буквы, для чего свойство Style необходимо установить в sCode. Добавил компонент TDegree – градус. SevenSegment.zip rareMax и zairkz 2 Цитата
david_yusupov Опубликовано 19 ноября, 2015 Опубликовано 19 ноября, 2015 Спасибо классная штуку, очень помогло Цитата
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.