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

enatechno

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

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

  • Посещение

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

    26

Активность репутации

  1. Like
    enatechno отреагировална Равиль Зарипов (ZuBy) в Не работают стили на другом компьютере   
    сохранить стиль в файл рядом Windows 10 Desktop нажать на кнопку удаления Добавить новый стиль, там должно быть написано WIndows Загрузить сохраненный стиль
  2. Like
    enatechno отреагировална Error в Небольшой обмен опытом. О размере текста, TTextLaout.   
    *** Небольшой обмен опытом ***
    Вижу что вопросы о размере текста довольно частые, поделюсь своими наработками.
    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; ---
    Также данные функции можно найти в этом юните
  3. Like
    enatechno отреагировална kami в Паттерн Наблюдатель   
    Так куда уж подробнее
    Всё, что может меняться - должно иметь интерфейс подписки. Все заинтересованные объекты должны подписываться и отписываться. А уж реализация и передаваемая информация - это детали.
    У меня, например, в качестве события об уведомлении используется вот такое:
    type TNotificationAction = (naAdd, naChange, naDelete); TNotificationEvent<T> = procedure(Sender: TObject; Action: TNotificationAction; const Param: T) of object; Можете глянуть в исходники FMX, фраза для поиска - FreeNotification
  4. Like
    enatechno получил реакцию от Rusland в TBitmap -> TJPEGImage и TgifImage   
    Для конвертации можете использовать TBitmapCodecManager. Например, так я его использую для сохранения файлов в различном формате:
     
    var aExtention, aFileName: string; aFileStream: TFileStream; aSaveParams: TBitmapCodecSaveParams; aSurf: TBitmapSurface; aBitmap: TBitmap ..... aFileStream := TFileStream.Create(aFileName, fmCreate); try aSurf := TBitmapSurface.Create(); try aSurf.Assign(aBitmap); aSaveParams.Quality := 70; TBitmapCodecManager.SaveToStream(aFileStream, aSurf, aExtention, @aSaveParams); finally FreeAndNil(aSurf); end; finally FreeAndNil(aFileStream); end; Для сохранения jpg использую aExtention='.jpg' и т.д.



    И почему Вы используете  TJPEGImage и TgifImage? Они разве есть в FMX? TImage.Bitmap читается из файла так:
     
    var aImage: TImage; aFileName: string; ... aImage.Bitmap.LoadFromFile(aFileName);  
  5. Like
    enatechno получил реакцию от Pax Beach в TBitmap -> TJPEGImage и TgifImage   
    Для конвертации можете использовать TBitmapCodecManager. Например, так я его использую для сохранения файлов в различном формате:
     
    var aExtention, aFileName: string; aFileStream: TFileStream; aSaveParams: TBitmapCodecSaveParams; aSurf: TBitmapSurface; aBitmap: TBitmap ..... aFileStream := TFileStream.Create(aFileName, fmCreate); try aSurf := TBitmapSurface.Create(); try aSurf.Assign(aBitmap); aSaveParams.Quality := 70; TBitmapCodecManager.SaveToStream(aFileStream, aSurf, aExtention, @aSaveParams); finally FreeAndNil(aSurf); end; finally FreeAndNil(aFileStream); end; Для сохранения jpg использую aExtention='.jpg' и т.д.



    И почему Вы используете  TJPEGImage и TgifImage? Они разве есть в FMX? TImage.Bitmap читается из файла так:
     
    var aImage: TImage; aFileName: string; ... aImage.Bitmap.LoadFromFile(aFileName);  
  6. Like
    enatechno получил реакцию от Равиль Зарипов (ZuBy) в TBitmap -> TJPEGImage и TgifImage   
    Для конвертации можете использовать TBitmapCodecManager. Например, так я его использую для сохранения файлов в различном формате:
     
    var aExtention, aFileName: string; aFileStream: TFileStream; aSaveParams: TBitmapCodecSaveParams; aSurf: TBitmapSurface; aBitmap: TBitmap ..... aFileStream := TFileStream.Create(aFileName, fmCreate); try aSurf := TBitmapSurface.Create(); try aSurf.Assign(aBitmap); aSaveParams.Quality := 70; TBitmapCodecManager.SaveToStream(aFileStream, aSurf, aExtention, @aSaveParams); finally FreeAndNil(aSurf); end; finally FreeAndNil(aFileStream); end; Для сохранения jpg использую aExtention='.jpg' и т.д.



    И почему Вы используете  TJPEGImage и TgifImage? Они разве есть в FMX? TImage.Bitmap читается из файла так:
     
    var aImage: TImage; aFileName: string; ... aImage.Bitmap.LoadFromFile(aFileName);  
  7. Like
    enatechno отреагировална Brovin Yaroslav в [Android] Почему возникает ошибка ECanvasException 'Handle not allocated'?   
    Дело в том, что у вас Image1.Bitmap, как экземпляр класса TBitmap присутствует. НО в нем нету никакой информации. То есть по факту у него размер равен 0 на 0. Это значит, что для него хендл не будет выделяться (Зачем системе хранить пустой битмап). Поэтому, когда вы пытаетесь с ним поработать и получить доступ к канве, то получаете такую ошибку:
    raised exception class ECanvasException with message 'Handle not allocated' Теперь смотрим ваш код:
    Image1.Bitmap.Canvas.BeginScene; Будет работать с канвой, но хендла нет. отсюда будет исключение.
    Image1.Bitmap.Clear(0); Опять же работает с канвой и пытается очистить пустой битмап.
    Image1.Bitmap.LoadFromStream(MemStream); Это корректный вызов, при загрузке нового битмапа будет выделен хендл на уровне Image1.Bitmap.
    Соответственно, вам нужно:
    Сформировать новый битмап Загрузить его в Image1.Bitmap На Windows используется GDI+/Direct2D канва, которая может работать по другому. А на мобильных платформах GPU, поэтому у вас и возникает ошибка.
  8. Like
    enatechno получил реакцию от Rusland в Как изменить версию АПИ для компиляции проекта   
    Хочу возразить.
    Был у меня такой случай. Проект, который успешно компилировался под android на Berlin 10.1 (без upd1) с ndk из коробки (r9c), в один "прекрасный" день при создании lib[ИмяПроекта].so выдал ошибку:
    lib[ИмяПроекта].so: mmap: failed to allocate ........... bytes for output file: Not enough space
    Так как со свободным местом было все норм, я стал гуглить подобную ошибку и узнал что она встречается в разных версиях RAD (начиная с XE7). Как решение, предлагалось обновить NDK на более позднюю. Что я и сделал, установив ndk r12b. И это решило мою проблему: с новым ndk проект был успешно откомпилирован и запущен на разных версиях android. 
  9. Like
    enatechno получил реакцию от Andrey Efimov в Как изменить версию АПИ для компиляции проекта   
    Хочу возразить.
    Был у меня такой случай. Проект, который успешно компилировался под android на Berlin 10.1 (без upd1) с ndk из коробки (r9c), в один "прекрасный" день при создании lib[ИмяПроекта].so выдал ошибку:
    lib[ИмяПроекта].so: mmap: failed to allocate ........... bytes for output file: Not enough space
    Так как со свободным местом было все норм, я стал гуглить подобную ошибку и узнал что она встречается в разных версиях RAD (начиная с XE7). Как решение, предлагалось обновить NDK на более позднюю. Что я и сделал, установив ndk r12b. И это решило мою проблему: с новым ndk проект был успешно откомпилирован и запущен на разных версиях android. 
  10. Like
    enatechno получил реакцию от Pax Beach в Как изменить версию АПИ для компиляции проекта   
    Хочу возразить.
    Был у меня такой случай. Проект, который успешно компилировался под android на Berlin 10.1 (без upd1) с ndk из коробки (r9c), в один "прекрасный" день при создании lib[ИмяПроекта].so выдал ошибку:
    lib[ИмяПроекта].so: mmap: failed to allocate ........... bytes for output file: Not enough space
    Так как со свободным местом было все норм, я стал гуглить подобную ошибку и узнал что она встречается в разных версиях RAD (начиная с XE7). Как решение, предлагалось обновить NDK на более позднюю. Что я и сделал, установив ndk r12b. И это решило мою проблему: с новым ndk проект был успешно откомпилирован и запущен на разных версиях android. 
  11. Like
    enatechno отреагировална RoschinSpb в [XE8] Новая иерархия классов   
    Возможно, что вопрос уже потерял актуальность, но тут есть дерево наследования всех классов пакета FMX. Инфа немного впереди паровоза, т. е. актуальна для следующей версией после RAD Studio 10.
  12. Like
    enatechno отреагировална Равиль Зарипов (ZuBy) в Наклеить одно изображение на другое   
    var bmp: TBitmap; SrcRect, DstRect, SrcRect2, DstRect2: TRectF; begin bmp := TBitmap.Create(256, 256); bmp.Canvas.BeginScene(); try SrcRect := TRectF.Create(0, 0, 256, 256); DstRect := TRectF.Create(20, 20, 236, 236); SrcRect2 := TRectF.Create(0, 0, 256, 256); DstRect2 := TRectF.Create(0, 0, 256, 256); bmp.Clear(TAlphaColorRec.Null); bmp.Canvas.DrawBitmap(Image1.Bitmap, SrcRect2, DstRect2, 0.8, false); bmp.Canvas.DrawBitmap(Image2.Bitmap, SrcRect, DstRect, 0.8, false); finally bmp.Canvas.EndScene(); Image3.Bitmap.SetSize(256, 256); Image3.Bitmap.CopyFromBitmap(bmp); bmp.Free; end; end;  
  13. Like
    enatechno отреагировална Равиль Зарипов (ZuBy) в как держать компоненты вместе   
    Top+Top
    Top+Client
  14. Like
    enatechno получил реакцию от Равиль Зарипов (ZuBy) в Как сохранить пропорции у ScaledLayout ?   
    Если хотите пропорционального изменять размеры  ScaledLayout:
    1). Используйте для него выравнивание по одному краю (например: Top, Left ... );
    2). При запуске программы фиксируйте TScaledLayout.OriginalWidth и TScaledLayout.OriginalHeight;
    3). Т.к. в зависимости от выравнивания у Вас будет изменятся один из параметров (при выравнивании Top - Width, при Left - Height), то будьте готовы в OnResize изменять пропорционально второй параметр. Например так:
     
    aRatio := ScaledLayout1.Width / ScaledLayout1.OriginalWidth; ScaledLayout1.Height := ScaledLayout1.OriginalHeight * aRatio;  
    tstScaledLayout.zip
  15. Like
    enatechno получил реакцию от Andrey Efimov в Как сохранить пропорции у ScaledLayout ?   
    Если хотите пропорционального изменять размеры  ScaledLayout:
    1). Используйте для него выравнивание по одному краю (например: Top, Left ... );
    2). При запуске программы фиксируйте TScaledLayout.OriginalWidth и TScaledLayout.OriginalHeight;
    3). Т.к. в зависимости от выравнивания у Вас будет изменятся один из параметров (при выравнивании Top - Width, при Left - Height), то будьте готовы в OnResize изменять пропорционально второй параметр. Например так:
     
    aRatio := ScaledLayout1.Width / ScaledLayout1.OriginalWidth; ScaledLayout1.Height := ScaledLayout1.OriginalHeight * aRatio;  
    tstScaledLayout.zip
  16. Like
    enatechno получил реакцию от chaplin.u@gmail.com в Как сохранить пропорции у ScaledLayout ?   
    Если хотите пропорционального изменять размеры  ScaledLayout:
    1). Используйте для него выравнивание по одному краю (например: Top, Left ... );
    2). При запуске программы фиксируйте TScaledLayout.OriginalWidth и TScaledLayout.OriginalHeight;
    3). Т.к. в зависимости от выравнивания у Вас будет изменятся один из параметров (при выравнивании Top - Width, при Left - Height), то будьте готовы в OnResize изменять пропорционально второй параметр. Например так:
     
    aRatio := ScaledLayout1.Width / ScaledLayout1.OriginalWidth; ScaledLayout1.Height := ScaledLayout1.OriginalHeight * aRatio;  
    tstScaledLayout.zip
  17. Like
    enatechno получил реакцию от Rusland в Как сохранить пропорции у ScaledLayout ?   
    Если хотите пропорционального изменять размеры  ScaledLayout:
    1). Используйте для него выравнивание по одному краю (например: Top, Left ... );
    2). При запуске программы фиксируйте TScaledLayout.OriginalWidth и TScaledLayout.OriginalHeight;
    3). Т.к. в зависимости от выравнивания у Вас будет изменятся один из параметров (при выравнивании Top - Width, при Left - Height), то будьте готовы в OnResize изменять пропорционально второй параметр. Например так:
     
    aRatio := ScaledLayout1.Width / ScaledLayout1.OriginalWidth; ScaledLayout1.Height := ScaledLayout1.OriginalHeight * aRatio;  
    tstScaledLayout.zip
  18. Like
    enatechno отреагировална Rusland в После "сна" программа с сервисом не стартует   
    Всем кто в сервис передает параметры, типа:
    procedure TFrmMain.StartService(); var LIntent: JIntent; begin LIntent := TJIntent.Create; LIntent.setClassName(TAndroidHelper.Context.getPackageName(), TAndroidHelper.StringToJString('com.embarcadero.services.TestRemoteServ')); LIntent.setAction(StringToJString('StartService')); TAndroidHelper.Activity.startService(LIntent); end; function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; begin if Intent.getAction.equalsIgnoreCase(StringToJString('StopService')) then begin Log('START_NOT_STICKY'); Result := TJService.JavaClass.START_NOT_STICKY; end else // if Intent.getAction.equalsIgnoreCase(StringToJString('StartService')) then begin Log('START_STICKY'); Result := TJService.JavaClass.START_STICKY; end; end; обязательно проверяйте Intent на nil !
    Когда система убивает ваше приложение из-за нехватки памяти и перезапускает сервис, то на Intent.getAction происходит Segmentation fault и сервис остается в подвешенном состоянии (на процессоре ARM в Приложения - Работающие у меня отображается как-будто сервис нормально перезапустился, а вот на процессоре Intel - видно как сервис находится в вечном перезапуске). И естественно хост-приложение не может нормально стартануть.
    Делаем примерно так:
    function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; begin if Intent<>nil then begin if Intent.getAction.equalsIgnoreCase(StringToJString('StopService')) then begin Log('START_NOT_STICKY'); Result := TJService.JavaClass.START_NOT_STICKY; end else // if Intent.getAction.equalsIgnoreCase(StringToJString('StartService')) then begin Log('START_STICKY'); Result := TJService.JavaClass.START_STICKY; end; end else begin Log('RESTART BY SYSTEM'); Result := TJService.JavaClass.START_STICKY; end; end;  
  19. Like
    enatechno отреагировална Pax Beach в После "сна" программа с сервисом не стартует   
    Ты молодец!
    На эту проблему потрачено неимоверно много времени, и не мной одним.
    В итоге, действительно проблема решилась.
    Всегда молодым программистам по 100 раз говорю — Проверяйте объекты на NULL! Простое условие "if not Assigned(Object)" сэкономит кучу времени. — и сам же в это болото залез.
     
  20. Like
    enatechno отреагировална Равиль Зарипов (ZuBy) в ListBox Item style (картинка на заднике и ее растяжка).   
    использовать TImage
  21. Like
    enatechno отреагировална Rusland в Как убрать клаву по окончанию ввода в TEdit ?   
    KillFocusByReturn=true
    Правда у меня на планшете Леново 7'' (Android 4.4) это не срабатывает и нажатие Enter приводит к переводу каретки... была уже тема такая
  22. Like
    enatechno получил реакцию от Rusland в Компонент для органайзера (аналог DevExpress ExpresScheduler или PlanIt)   
    TMS Planner
  23. Like
    enatechno отреагировална Pax Beach в TBeacon. CASE: Использование маячков для контроля расхода электроэнергии   
    В рамках конкурса Device Lab от Google подготовил кейс «Маячки Eddystone для контроля расхода электроэнергии».
    Ознакомиться можно по ссылке — http://singro.ru/eddystone-beacons-electro-energy/ и в ближайшее время на «Хабрахабре».

    С помощью компонента TBeacon решены задачи:
    — поиск ближайших маячков;
    — работа с маячками в сервисе Android; 
    — фильтрация маячков по технологии Eddystone, ссылкам, идентификаторам.
    — привязка маячков к геокоординатам и базе данных приборов учета электроэнергии.
     
    Черпайте идеи и задавайте вопросы.
    Буду рад ответить на них.
     
    UPD:
    Наша работа заняла второе место в конкурсе Google Device Lab. Прочитать об этом можно на хабре.
  24. Like
    enatechno отреагировална Vitaldj в Как Вы используете RAD Studio   
    Я использовал ранее только для себя.  Я с его помощью получил часть данных в диссертацию и успешно защитился в 2007 году. Помню удивление моего диссертационного совета, когда узнали, что я сам написал эту программу. Совет был по иммунологии/клинической фармакологии. Но со временем мой основной программы продукт понравился многим. И с 2009 года я выпустил первую публичную версию еще на delphi7. С 2015 года полностью переписываю его на FMX, что добавило кроссплатформанности. Мой программный продукт является автоматизированным рабочим местом врача - клинического фармаколога. Самое главное, он абсолютно бесплатный и без рекламы. Пользователи - врачи со всей РФ. Поэтому в опросе наверху я не смог выбрать "как я использую студию".
  25. Like
    enatechno отреагировална krapotkin в Как изменить порядок элементов в TGridLayout   
    сорри, ввел в заблуждение. вот картина
     

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