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

Равиль Зарипов (ZuBy)

Модераторы
  • Постов

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

  • Посещение

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

    264

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

  1. Like
    Равиль Зарипов (ZuBy) получил реакцию от enatechno в ColorComboBox произвольный список цветов   
    const aColorNames: array [0 .. 3] of string = ('Black', 'Red', 'Yellow', 'Green'); aColors: array [0 .. 3] of TAlphaColor = (TAlphaColorrec.Black, TAlphaColorrec.red, TAlphaColorrec.Yellow, TAlphaColorrec.Green); procedure TForm1.DoItemApplyStyleLookup(Sender: TObject); var ColorObj: TShape; begin if TListBoxItem(Sender).FindStyleResource<TShape>('color', ColorObj) then ColorObj.Fill.Color := aColors[TListBoxItem(Sender).Tag]; end; procedure TForm1.Button1Click(Sender: TObject); var aItem: TListBoxItem; I: Integer; begin ComboBox1.DropDownKind := TDropDownKind.Custom; // uses FMX.Pickers; for I := Low(aColorNames) to High(aColorNames) do begin aItem := TListBoxItem.Create(ComboBox1); aItem.Parent := ComboBox1; aItem.Text := aColorNames[I]; aItem.Width := aItem.DefaultSize.Width; aItem.Height := aItem.DefaultSize.Height; aItem.StyleLookup := 'colorlistboxitemstyle'; aItem.StylesData['color.Fill.Color'] := aColors[I]; aItem.OnApplyStyleLookup := DoItemApplyStyleLookup; aItem.Tag := I; end; end; как-то так
  2. Like
    Равиль Зарипов (ZuBy) отреагировална Brovin Yaroslav в Описание TfgRatingBar   
    Доработал компонент. Добавлено:
    Поддержка Tint эффекта - TfgRatingBar.TintColor Автоматический размер - TfgRatingBar.AutoSize Режим только отображения - TfgRatingBar.ReadOnly Событие окончательного изменения рейтинга (отжатие пальца от экрана или кнопки мышки) - TfgRatingBar.OnChange Событие в процессе изменения рейтинга - TfgRatingBar.OnChanging

  3. Like
    Равиль Зарипов (ZuBy) отреагировална krapotkin в Реестр в Андроиде и Delphi   
    это немного вчерашний день
    лучше 
    создавайте в приложении класс настроек и считывайте/записывайте  его одной строкой
  4. Like
    Равиль Зарипов (ZuBy) отреагировална Евгений Корепов в Как получить версию APK-файла под Win32?   
    Вот так напрямую в память:
    function ShellExecuteMy(CommandLine: string; AWorkDir: string = 'C:\') : String; var SA: TSecurityAttributes; SI: TStartupInfo; PI: TProcessInformation; StdOutPipeRead, StdOutPipeWrite: THandle; WasOK: Boolean; Buffer: array[0..255] of AnsiChar; BytesRead: Cardinal; WorkDir: string; Handle: Boolean; AOutputLine : String; begin with SA do begin nLength := SizeOf(SA); bInheritHandle := True; lpSecurityDescriptor := nil; end; CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0); try with SI do begin FillChar(SI, SizeOf(SI), 0); cb := SizeOf(SI); dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; wShowWindow := SW_HIDE; // wShowWindow := SW_MINIMIZE; // wShowWindow := SW_NORMAL; hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin hStdOutput := StdOutPipeWrite; hStdError := StdOutPipeWrite; end; WorkDir := AWorkDir; // Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine), Handle := CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil, PChar(WorkDir), SI, PI); // Result:=PI; CloseHandle(StdOutPipeWrite); finally CloseHandle(StdOutPipeRead); end; if Handle then try repeat // WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil); WasOK := ReadFile(StdOutPipeRead, Buffer, 50, BytesRead, nil); if BytesRead > 0 then begin Buffer[BytesRead] := #0; AOutputLine:=StrOemToAnsi(Buffer); Result :=Result + AOutputLine; end; until not WasOK or (BytesRead = 0); WaitForSingleObject(PI.hProcess, INFINITE); finally CloseHandle(PI.hThread); CloseHandle(PI.hProcess); end; finally CloseHandle(StdOutPipeRead); end; end; Функция читает пайп вывода и помещает в строку. 
    P.S. uses Winapi.Windows;
  5. Like
    Равиль Зарипов (ZuBy) отреагировална Brovin Yaroslav в [Статья] Жизненный цикл объектов в Delphi. Часть 2. Android, iOS. Что же использовать Destroy, Free, FreeAndNil или DisposeOf?   
    Ссылка: http://yaroslavbrovin.ru/object_life_cycle_in_delphi_part_2_android_ios-ru/ Автор: Ярослав Бровин Продолжаем тему жизненного цикла объектов в мире Delphi, но в этой части рассматриваем эту тему в рамках мобильных платформ Android и iOS.
    Delphi вводит новый подход к управлению памятью в мобильных платформах. Появляется автоматический подсчет ссылок, который с одной стороны облегчает код разработчика и должен помочь ему, а с другой стороны раскладывает равномерно грабли на пути освоения новых платформ в мире Delphi.
  6. Like
    Равиль Зарипов (ZuBy) получил реакцию от Евгений Корепов в Кодировки языков в APPLE   
    // uses FMX.Platform; var LocaleService: IFMXLocaleService; begin if TPlatformServices.Current.SupportsPlatformService(IFMXLocaleService, IInterface(LocaleService)) then Result := LocaleService.GetCurrentLangID; end;  
  7. Like
    Равиль Зарипов (ZuBy) получил реакцию от Alisson R Oliveira в TMapsEngine   
    Благодарю, все руки не доходили выложить исправленную версию
  8. Like
    Равиль Зарипов (ZuBy) получил реакцию от Rusland в Как заполнить эллипс?   
    var MyRect: TRectF; begin MyRect := RectF(10, 10, 30, 30); if Canvas.BeginScene then try Canvas.Fill.Color := TAlphaColorRec.Red; Canvas.Stroke.Color := TAlphaColorRec.Black; Canvas.FillEllipse(MyRect, 1); Canvas.DrawEllipse(MyRect, 1); finally Canvas.EndScene; end; end; FillEllipse - заливка
    DrawEllipse - обводка
  9. Like
    Равиль Зарипов (ZuBy) получил реакцию от Rusland в Принудительная остановка прокрутки ListView   
    На мобильных это делается с помощью TAniCalculations, в ModernLV есть метод getAniCalc
    if ListView1.getAniCalc <> nil then ListView1.getAniCalc.Animation := false; в момент вызова этого кода скроллинг остановится
  10. Like
    Равиль Зарипов (ZuBy) получил реакцию от Rusland в Рисование маршрута на MapView, Delphi, Android   
    Вас не смущает что это локальная переменная?
  11. Like
    Равиль Зарипов (ZuBy) получил реакцию от Brovin Yaroslav в Как заполнить эллипс?   
    var MyRect: TRectF; begin MyRect := RectF(10, 10, 30, 30); if Canvas.BeginScene then try Canvas.Fill.Color := TAlphaColorRec.Red; Canvas.Stroke.Color := TAlphaColorRec.Black; Canvas.FillEllipse(MyRect, 1); Canvas.DrawEllipse(MyRect, 1); finally Canvas.EndScene; end; end; FillEllipse - заливка
    DrawEllipse - обводка
  12. Like
    Равиль Зарипов (ZuBy) отреагировална ENERGY в Утечка при использовании анонимного метода или анонимные методы, циклические ссылки и ARC   
    Это касается ARC компиляторов, Android, iOS и будущего Linux.
    Если контейнер владелец, содержит классы, которые используют анонимный метод для общения с ним (классом владельцем), то такая конструкция порождает утечку памяти из-за появления циклической ссылки. Т.к. при присваивании анонимного метода инкрементируется счетчик ссылок и не меняется. Причем это не указано в хелпе.

    А дело было так - при вызове MyCore.Free класс не уничтожался - не вызывался деструктор из за того, что после вызова Free, счетчик ссылок (reference Count) был равен 1. Приходилось пользоваться  DisposeOf. Решил разобраться.
    Для этого перекрыл виртуальные методы TObject отвечающие за изменения счетчика объекта (см. также полный пример ниже).
    function __ObjAddRef: Integer; override;
    function __ObjRelease: Integer; override;
     
    Итак TCore содержит класс TTestClass - у которого есть событие OnMyEvent. 
    Прототип описан как анонимная процедура - TAnonymProc = reference to procedure;

    При указании анонимной процедуры, т.е. : 
    procedure TCore.SetEvent; begin   fTest.OnMyEvent := procedure ()   begin     fSetFlag := true;   end; end; счетчик ссылок TCore увеличивается на 1 и не изменяется при выходе из SetEvent.
    Теперь при вызове Free TCore - не будет вызван деструктор, который должен уничтожит классы TCore и TTestClass и произойдет утечка памяти.

    Решение : 
    1. Использовать слабые ссылки - weak, в нашем примере добавить атрибут [weak]:
    TTestClass = class strict private   [weak]fOnMyEvent:TAnonymProc; public   property OnMyEvent: TAnonymProc read fOnMyEvent write fOnMyEvent; end;  При присваивании объекта в переменную со слабой ссылкой не происходит увеличение счётчика ссылок объекта на единицу. Аналогично, при очистке слабой ссылки не происходит уменьшение счётчика объекта на единицу.
    2. Не использовать анонимные методы, а использовать обычные указатели на метод: 
    Вместо TAnonymProc = reference to procedure; используем классический 
           TAnonymProc = procedure of object;

    Демо пример, где можно отследить утечку прикрепил.
    Полный код: 
     
    AnonMethodsCycle.zip
  13. Like
    Равиль Зарипов (ZuBy) отреагировална RoschinSpb в vkHardwareBack, vkHome, vkMenu (Android)   
    Средствами Fire Monkey нельзя. И это относится не только к HardwareBack, Home, Menu но и вообще к любым клавишам на любой клавиатуре. Возможно можно как-то воспользоваться андроидными системными функциями, но например в Windows нету системных средств для определения наличия физических клавиш. Так что обработка горячих клавиш всегда должна дублироваться какими-то другими интерфейсными элементами, если конечно Вы не хотите намеренно скрыть что-то от обычных пользователей.
  14. Like
    Равиль Зарипов (ZuBy) получил реакцию от Kitty в vkHardwareBack, vkHome, vkMenu (Android)   
    как понять список доступных кнопок?
    на счёт кнопки Home, все верно, так и должно быть
  15. Like
    Равиль Зарипов (ZuBy) отреагировална Alex7wrt в файл не находится   
    В iOS нужно писать StartUp\Documents.
    В Android assets\internal. 
    Посмотрите, что  у вас представляет собой filename. Судя по вашему коду должно быть имя файла плюс расширение.
  16. Like
    Равиль Зарипов (ZuBy) получил реакцию от Kitty в Кодировки языков в APPLE   
    Все оно верно даст
    Вы проверяли?
    У меня все отлично, стоит регион Казахстан, язык системы русский
    Результат кода - ru
    Не поленился и запустил симулятор, языки естественно менял на соответствующие
      
     
  17. Like
    Равиль Зарипов (ZuBy) получил реакцию от AngryOwl в Принудительная остановка прокрутки ListView   
    На мобильных это делается с помощью TAniCalculations, в ModernLV есть метод getAniCalc
    if ListView1.getAniCalc <> nil then ListView1.getAniCalc.Animation := false; в момент вызова этого кода скроллинг остановится
  18. Like
    Равиль Зарипов (ZuBy) получил реакцию от #WAMACO в Как убрать лишние уведомления в шторке при пуше?   
    http://blog.rzaripov.kz/2017/02/firebase-android-ios-2.html 
    смотрите Delphi код, там есть получение DeviceID 
  19. Like
    Равиль Зарипов (ZuBy) получил реакцию от Alex7wrt в Принудительная остановка прокрутки ListView   
    На мобильных это делается с помощью TAniCalculations, в ModernLV есть метод getAniCalc
    if ListView1.getAniCalc <> nil then ListView1.getAniCalc.Animation := false; в момент вызова этого кода скроллинг остановится
  20. Like
    Равиль Зарипов (ZuBy) получил реакцию от Евгений Корепов в Как убрать лишние уведомления в шторке при пуше?   
    http://blog.rzaripov.kz/2017/02/firebase-android-ios-2.html 
    смотрите Delphi код, там есть получение DeviceID 
  21. Like
    Равиль Зарипов (ZuBy) получил реакцию от Евгений Корепов в Как заполнить эллипс?   
    var MyRect: TRectF; begin MyRect := RectF(10, 10, 30, 30); if Canvas.BeginScene then try Canvas.Fill.Color := TAlphaColorRec.Red; Canvas.Stroke.Color := TAlphaColorRec.Black; Canvas.FillEllipse(MyRect, 1); Canvas.DrawEllipse(MyRect, 1); finally Canvas.EndScene; end; end; FillEllipse - заливка
    DrawEllipse - обводка
  22. Like
    Равиль Зарипов (ZuBy) получил реакцию от AngryOwl в Как заполнить эллипс?   
    var MyRect: TRectF; begin MyRect := RectF(10, 10, 30, 30); if Canvas.BeginScene then try Canvas.Fill.Color := TAlphaColorRec.Red; Canvas.Stroke.Color := TAlphaColorRec.Black; Canvas.FillEllipse(MyRect, 1); Canvas.DrawEllipse(MyRect, 1); finally Canvas.EndScene; end; end; FillEllipse - заливка
    DrawEllipse - обводка
  23. Like
    Равиль Зарипов (ZuBy) получил реакцию от Andrey Efimov в Как заполнить эллипс?   
    var MyRect: TRectF; begin MyRect := RectF(10, 10, 30, 30); if Canvas.BeginScene then try Canvas.Fill.Color := TAlphaColorRec.Red; Canvas.Stroke.Color := TAlphaColorRec.Black; Canvas.FillEllipse(MyRect, 1); Canvas.DrawEllipse(MyRect, 1); finally Canvas.EndScene; end; end; FillEllipse - заливка
    DrawEllipse - обводка
  24. Like
    Равиль Зарипов (ZuBy) получил реакцию от Kitty в Как заполнить эллипс?   
    var MyRect: TRectF; begin MyRect := RectF(10, 10, 30, 30); if Canvas.BeginScene then try Canvas.Fill.Color := TAlphaColorRec.Red; Canvas.Stroke.Color := TAlphaColorRec.Black; Canvas.FillEllipse(MyRect, 1); Canvas.DrawEllipse(MyRect, 1); finally Canvas.EndScene; end; end; FillEllipse - заливка
    DrawEllipse - обводка
  25. Like
    Равиль Зарипов (ZuBy) получил реакцию от Kitty в Как заполнить эллипс?   
    для заливки используется 
    Canvas.Fill.Color := цвет; Canvas.FillEllipse();  
×
×
  • Создать...