-
Постов
167 -
Зарегистрирован
-
Посещение
-
Победитель дней
8
Сообщения, опубликованные Error
-
-
Надеюсь буду
-
Проголосовал, это просто эпик!
---
Сильно подозреваю что баг не на всех компах воспроизводиться.
У меня на виртуалке воспроизводится, надеюсь и у аутсорсеров тоже воспроизведется.
-
Думаю смогу
-
В моей статье есть решение: https://habrahabr.ru/post/317814/
-
19 часов назад, ENRGY сказал:
Error
Да и без сглаживания это выглядит гораздо лучше чем растровые.
Я не замечал там каких то заметных несглаженных искажений. К тому же можно приготовить в редакторе smooth картинку, скомбинировав ее из нескольких путей (слоев) и она будет вполне себе сглаженной .
Да кстати, напишите то же самое разработчикам Windows. У них ужасное форсированное масштабирование на Win 8-10 для всех окон. Да оно сглаженное, но такое размытое, как будто сидишь с близорукостью.. Вот пример как не нужно сглаживать. Хорошо хоть эту "фичу" отключить можно, и то не везде.
На мобилках порисуйте графические примитивы, TPath, и т.д. - малого того что сглаживания нет, так и разбиение на треугольники часто очень паршивого качества выходит. Особенно при небольших размерах отрисовываемых примитивов, а для иконок именно такие и требуются.
Про тормоза говорить не буду.
-
41 минуту назад, ENRGY сказал:
Хорошая задумка, только уже ведь есть TimageList. C довольно неплохой идеей.
А вообще хотелось бы векторный TImageList, куда можно загрузить список TPath
Сначала надо чтобы FMX научилась отрисовывать графические примитивы со сглаживанием, а для этого надо имплиминтировать на каждой платформе (iOS, Android) нативную канву...
Начинаю сомневаться что это вообще когда-либо произойдёт.
-
6 часов назад, AlexG сказал:
Есть компонент TTaskBar, отвечающий за работу приложения со своим элементом приложения на Панели Задач. Он позволяет отображать "состояние" приложения и т.д.
Но вся загвоздка в том, что этот элемент работает только с VCL. Что касается FMX, конкретно под Windows, то таковой реализации нет, и не удается использовать этот компонент "ручками".
Короче. Проблема в том, чтобы отображать в "панели задач" состояние FMX приложения.
Может кто-то подскажет, в особенности наши уважаемые гуру, - что делать и как быть?
Самое очевидное, посмотреть как реализован TTaskBar и сделать аналог для FMX, или сильно урезанный аналог с необходимым вам функционалом.
-
39 минут назад, POV сказал:
Когда задал компоненте новый TextSettings функция TextWidth возвращает ширину текста для шрифта по умолчанию. Хотя отрисовывает с моими новыми настройками.
Отчего?
-
В 04.02.2017 в 17:51, rakhmet сказал:
а) Выбор типа соединения (http/ftp) с поддержкой SSL.
SSL поддерживается и является рекомендуемым способом.
В 04.02.2017 в 17:51, rakhmet сказал:б) Возможность видеть текущую (используемую в настоящий момент) версию и ту, что доступна в обновлении.
Версия в обновлении является одним из аргументов в функции-callback-а сообщающей о доступности обновления, текущую версию легко получить используя TFileVersion.CreateForFile()
В 04.02.2017 в 17:51, rakhmet сказал:в) Доступный по нажатию на кнопку/ссылку какой-нибудь changelog/history - чтобы видеть, что конкретно несёт в себе обновление.
Этого на данный момент нет, но может появиться в будущем.
В 04.02.2017 в 17:51, rakhmet сказал:1. Обновление будет с полной заменой обновляемой файла, или же будет поддержка патчей (на тот случай, когда можно обойтись патчем на 0,5 мегабайта, чтобы не тянуть 50 мегабайт обновлённого файла)?
С полной заменой, с современной скоростью интернета патчи и их поддержка - очень сомнительная штука.
В 04.02.2017 в 17:51, rakhmet сказал:2. Не понял, каким образом будет реализовано обновление для FMX - в обход мобильных магазинов?
TurboUpdate предназначено исключительно для Windows, в будущем возможно появление поддержки MacOS.
-
Вы можете посмотреть пример использования TurboUpdate на примере приложения PowerOff: https://github.com/errorcalc/PowerOff
(Для использования TurboUpdate необходимо изменить Config.inc) -
Выложена альфа версия ErrorSoft TurboUpdate - библиотека для легкого добавления автообновления в ваши FMX и VCL приложения под Windows.
Совместимость - Delphi Seattle и выше.
Описания пока нет, но в репозитории есть примеры для ознакомления.
Лицензирование - для OpenSource и не коммерческого использования данная библиотека абсолютно бесплатна, допустимо изменение и т.д.
Для коммерческого применения - пока нет решения.
https://github.com/errorcalc/TurboUpdate
Перед использованием необходимо установить необходимые Packages:
- TurboUpdateFmxOnly.groupproj - FMX only.
- TurboUpdateGroup.groupproj - VCL + FMX, зависит от ErrorSoftVclComponents(https://github.com/errorcalc/FreeEsVclComponents).
Это ранняя альфа, необходимы ваши отзывы, критика и т.д.
-
5 часов назад, Major сказал:
Не в первый раз встречаю утверждение, что глобальные переменные в Delphi - зло. Но почему? Всегда их использую и вроде не было проблем из-за этого.
-
10 часов назад, beegl сказал:
Подскажите, чем заменить TGraphicControl в FMX?
На Андроид переделать ScrollingText хочу)
unit ALScrollingText; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.WebBrowser, FMX.ScrollBox, FMX.Memo, FMX.Objects; type TTextLayout = (tlTop, tlCenter, tlBottom); TTextDirection = (tdLeftToRight, tdRightToLeft); TALScrollingText = class(TGraphicControl) private fText: String; Timer: TTimer; fSpeed: Integer; fBackgroundColor: TColor; BackBitmap: TBitmap; DrawnBitmap: TBitmap; WholeBitmap: TBitmap; Position: Integer; fEdgeFade: Boolean; fEdgeFadeWidth: Integer; fLayout: TTextLayout; fTextDirection: TTextDirection; fPixelJump: Integer; fVisible: Boolean; procedure SetText(const Value: String); procedure SetSpeed(const Value: Integer); procedure OnTimer(Sender: TObject); procedure SetBackgroundColor(const Value: TColor); procedure CMFontChanged(var Msg: TMessage); message CM_FontChanged; procedure InvalidateEverything; procedure SetEdgeFadeWidth(const Value: Integer); function CalcColorIndex(StartColor, EndColor: TColor; Steps, ColorIndex: Integer): TColor; procedure SetLayout(const Value: TTextLayout); procedure SetTextDirection(const Value: TTextDirection); procedure SetVisible(const Value: Boolean); protected procedure Paint; override; procedure Loaded; override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Resize; override; published property Text: String read fText write SetText; property Speed: Integer read fSpeed write SetSpeed default 50; property BackgroundColor: TColor read fBackgroundColor write SetBackgroundColor default clBtnFace; property EdgeFadeWidth: Integer read fEdgeFadeWidth write SetEdgeFadeWidth default 15; property Layout: TTextLayout read fLayout write SetLayout default tlCenter; property TextDirection: TTextDirection read fTextDirection write SetTextDirection default tdLeftToRight; property PixelJump: Integer read fPixelJump write fPixelJump default 1; property Visible: Boolean read fVisible write SetVisible; property Font; property Enabled; property ParentFont; property OnMouseDown; property OnMouseUp; property OnClick; end; procedure Register; implementation procedure Register; begin RegisterComponents('ScrollingTextEx', [TALScrollingText]); end; { TALScrollingText } constructor TALScrollingText.Create(AOwner: TComponent); begin inherited; BackBitmap := TBitmap.Create; DrawnBitmap := TBitmap.Create; WholeBitmap := TBitmap.Create; WholeBitmap.Transparent := True; Timer := TTimer.Create(nil); Timer.OnTimer := OnTimer; Width := 50; Height := 18; ParentFont := True; fVisible := True; fText := 'Text'; Speed := 50; fEdgeFade := True; fEdgeFadeWidth := 15; fBackgroundColor := clBtnFace; fLayout := tlCenter; fTextDirection := tdLeftToRight; fPixelJump := 1; Position := -Width; Font.Color := clWindowText; end; destructor TALScrollingText.Destroy; begin Timer.Free; BackBitmap.Free; DrawnBitmap.Free; WholeBitmap.Free; inherited; end; procedure TALScrollingText.Loaded; begin inherited; InvalidateEverything; if fTextDirection = tdLeftToRight then Position := -(WholeBitmap.Width - Width) else Position := 0; end; procedure TALScrollingText.OnTimer(Sender: TObject); begin if Enabled then begin if fTextDirection = tdLeftToRight then begin Inc(Position, fPixelJump); if Position >= 0 then Position := -WholeBitmap.Width + Width; end else begin Dec(Position, fPixelJump); if Position <= -(WholeBitmap.Width - Width) then Position := 0; end; Paint; end; end; procedure TALScrollingText.Paint; begin inherited; BitBlt(DrawnBitmap.Canvas.Handle, 0, 0, Width, Height, BackBitmap.Canvas.Handle, 0, 0, SrcCopy); DrawnBitmap.Canvas.Draw(Position, 0, WholeBitmap); BitBlt(Canvas.Handle, 0, 0, Width, Height, DrawnBitmap.Canvas.Handle, 0, 0, SrcCopy); end; procedure TALScrollingText.InvalidateEverything; var i: Integer; begin with WholeBitmap do begin Canvas.Brush.Color := fBackgroundColor; Canvas.FillRect(Rect(0, 0, Width, Height)); Canvas.Font := Self.Font; Width := WholeBitmap.Canvas.TextWidth(fText) + (2 * Self.Width); Height := Self.Height; if (Self.Font.Color = clGreen) or (fBackgroundColor = clGreen) then begin TransparentColor := clRed; Canvas.Font.Color := clRed; end else begin TransparentColor := clGreen; Canvas.Font.Color := clGreen; end; if fLayout = tlTop then Canvas.TextOut(Self.Width, 0, fText) else if fLayout = tlCenter then Canvas.TextOut(Self.Width, (Self.Height div 2) - (Canvas.TextHeight(fText) div 2), fText) else Canvas.TextOut(Self.Width, Self.Height - Canvas.TextHeight(fText), fText); end; with BackBitmap do begin Width := Self.Width; Height := Self.Height; Canvas.Brush.Color := Self.Font.Color; Canvas.FillRect(Rect(0, 0, Self.Width, Self.Height)); if fEdgeFadeWidth > 0 then begin for i := 0 to fEdgeFadeWidth-1 do begin Canvas.Pen.Color := CalcColorIndex(fBackgroundColor, Self.Font.Color, fEdgeFadeWidth, i+1); Canvas.MoveTo(i, 0); Canvas.LineTo(i, Self.Height); Canvas.MoveTo(Width-i-1, 0); Canvas.LineTo(Width-i-1, Self.Height); end; end; end; DrawnBitmap.Width := Width; DrawnBitmap.Height := Height; end; procedure TALScrollingText.CMFontChanged(var Msg: TMessage); begin inherited; InvalidateEverything; Msg.Result := 1; end; procedure TALScrollingText.Resize; begin inherited; InvalidateEverything; end; procedure TALScrollingText.SetBackgroundColor(const Value: TColor); begin if fBackgroundColor <> Value then begin fBackgroundColor := Value; InvalidateEverything; end; end; procedure TALScrollingText.SetSpeed(const Value: Integer); begin if fSpeed <> Value then begin fSpeed := Value; Timer.Interval := Value; end; end; procedure TALScrollingText.SetText(const Value: String); begin if fText <> Value then begin fText := Value; InvalidateEverything; end; end; procedure TALScrollingText.SetEdgeFadeWidth(const Value: Integer); begin if fEdgeFadeWidth <> Value then begin fEdgeFadeWidth := Value; InvalidateEverything; end; end; procedure TALScrollingText.SetLayout(const Value: TTextLayout); begin if fLayout <> Value then begin fLayout := Value; InvalidateEverything; end; end; procedure TALScrollingText.SetTextDirection(const Value: TTextDirection); begin if fTextDirection <> Value then begin fTextDirection := Value; if Value = tdLeftToRight then Position := -(WholeBitmap.Width - Width) else Position := 0; InvalidateEverything; end; end; function TALScrollingText.CalcColorIndex(StartColor, EndColor: TColor; Steps, ColorIndex: Integer): TColor; var BeginRGBValue: Array[0..2] of Byte; RGBDifference: Array[0..2] of Integer; Red, Green, Blue: Byte; NumColors: Integer; begin if (ColorIndex < 1) or (ColorIndex > Steps) then raise ERangeError.Create('ColorIndex can''t be less than 1 or greater than ' + IntToStr(Steps)); NumColors := Steps; Dec(ColorIndex); BeginRGBValue[0] := GetRValue(ColorToRGB(StartColor)); BeginRGBValue[1] := GetGValue(ColorToRGB(StartColor)); BeginRGBValue[2] := GetBValue(ColorToRGB(StartColor)); RGBDifference[0] := GetRValue(ColorToRGB(EndColor)) - BeginRGBValue[0]; RGBDifference[1] := GetGValue(ColorToRGB(EndColor)) - BeginRGBValue[1]; RGBDifference[2] := GetBValue(ColorToRGB(EndColor)) - BeginRGBValue[2]; // Calculate the bands color Red := BeginRGBValue[0] + MulDiv(ColorIndex, RGBDifference[0], NumColors - 1); Green := BeginRGBValue[1] + MulDiv(ColorIndex, RGBDifference[1], NumColors - 1); Blue := BeginRGBValue[2] + MulDiv(ColorIndex, RGBDifference[2], NumColors - 1); Result := RGB(Red, Green, Blue); end; procedure TALScrollingText.SetVisible(const Value: Boolean); begin if Value <> fVisible then begin fVisible := Value; Enabled := fVisible; TGraphicControl(Self).Visible := fVisible; end; end; end.
не очень понятно какое это имеет отношение к теме поста.
А унаследоваться от TControl можно.
-
Вообще стандартные диалоговые окна на то и стандартные, чтобы юзеру привычно было.
А если так хочется свои - то да, придется форму создавать.
-
3 часа назад, kami сказал:
Чтобы начали ломать софт на FMX - софт должен стать популярным. Вероятность популяризации софта в какой-то мере пропорциональна количеству написанного софта. Количество написанного софта тем больше, чем популярнее язык/фреймворк. Посему - фразу следует построить так "Когда (если) FMX станет популярным - появится и взломанный софт, написанный на нем".
Тоже самое сказанное другими словами.
-
-
Взлом FMX приложения скорее всего более сложен чем взлом Java приложения.
Хотя бы по причине кучи декомпиляторов Java байткода, с Delphi же сложнее, придеться копаться в бинарнике каким-нибудь отладчиком/дизассемблером.
-
-
1 час назад, Kitty сказал:
Нет ни одного форума где не было бы руганьи. Плохо. Меня интересует только сухой приговор - перспективы fmx. И мнение разработчиков fmx тут главное...
Они сами не знают, и у них нет единого мнения. Сейчас многое зависит от того какой релиз будет через год.
-
-
Ссылка: https://habrahabr.ru/post/318876/
Автор: Error
Описание:
Delphi и C++Builder разработчики, использующие VCL не по наслышке знают о вездесущей проблеме мерцания контролов.
Мерцание происходит при перерисовке, вследствие того, что сначала отрисовываеться фон компонента, и только потом сам компонент.
И если в случае с наследниками от TWinControl частичным решением проблемы является установка свойства DoubleBuffered в True, что заставляет контрол отрисовываться в буфере(однако DoubleBuffered работает тоже не идеально, к прим.: контрол перестает быть прозрачным), то в случае с TGraphicControl решение с DoubleBuffered просто невозможно, из-за отсутствия у TGraphicControl окна, установка же DoubleBuffered в True у родителя не помогает, из-за того что отрисовка вложенных TGraphicControl-ов происходит уже после прорисовки родителя в буфере.
Обычно остается только одно — смириться с мерцанием, и максимально упростить отрисовку для минимизации эффекта, или использовать по возможности исключительно TWinControl-ы, что не всегда возможно и удобно.Однажды намучившись с мерцанием, я не выдержал и решил решить эту проблему, раз и навсегда!
...
-
1 час назад, ZuBy сказал:
вот вы часто используете нативные контролы и какие? браузер и карты не считаем, они кросс
Использовать нативный TEdit и TMemo под iOS - must have.
1 час назад, ZuBy сказал:опять же повторюсь, что у айос почти нет фрагментации по сравнению с андроид
И это тоже плюс к iOS.
1 час назад, ZuBy сказал:про какие костыли вы говорите?
Конкретный пример не приведу, но FMX для Android есть костыли.
-
11 минут назад, ZuBy сказал:
т.к. фрагментация у IOS небольшая в отличии от Android можно по ошибке сказать что там приложения работают лучше.
если выбрать десять девайсов на андроиде с нормальными характеристиками (процом!), то приложения будут работать +/- одинаково
ну и зависит еще от используемых технологии и компонентов. из-за неправильной архитектуры приложения, создаются костыли и темы на форуме)
Не соглашусь, под iOS доступны нативные компоненты, Z-Order.
Delphi код работает в основном потоке, в отличие от Android, что уже от многих глюков уберегает.
И в целом на мой взгляд интеграция с системой более аккуратная, из-за меньшего количество костылей в FMX для iOS.
-
У меня в TLang в Seattle тупо в редакторе перевод нельзя добавить, так что это не наш метод xD
В примере FMX приложения PowerOff просто в коде на русский текст заменяю, если в русской винде запущенно: https://github.com/errorcalc/PowerOff/blob/master/Main.pas#L206
Хотя это костыль, и для более крупного приложения надо написать вспомогательный модуль.
В Vcl есть встроенное средство для перевода, неплохое(хотя и заброшенное немного имхо), я его в https://github.com/errorcalc/ProjectScreen к примеру использую. Жалко аналога в Fmx нет.
Встреча в Питере 11-го октября 2018
в Сходки/Встречи
Опубликовано
Буду