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

TrueCrypt

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

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

  • Посещение

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

    1

Сообщения, опубликованные TrueCrypt

  1. Привет, при вызове метода ASeries.AddXY (пример: ASeries.AddXY(ASeries.MaxXValue + 1, AValue);) происходит утечка памяти, при том довольно сильная. Есть ли какая-то возможность устранить такой недочет. Исходник чарта закрытый, найти перврпричину не удается.

     

  2. Попап меню под панелью задач оказывается, т.к. менюшка расположена на попапе, а тот как обычная форма интерпретируется виндой. Либо свой попап делать, либо показывать вместо меню форму/окно.

  3. Заполняю дерево, на узлах создаю фрейм (либо же любой другой объект), делаю узлам Expand и при скролировании возникает ошибка «Argument out of range», будто неправильно рассчитывается количество вложенных элементов.

    Как можно избавиться от такой ошибки?На узел кладу объект так:

                    TfrFolderItem.Create(ATreeNode {owner}, ATreeNode {parent}, AFolderName);
    
                    ATreeNode.Expand;

     

  4. В 13.04.2016 в 18:30, RoschinSpb сказал:

    Какая у вас версия? Сейчас проверил на  RAD Studio 10 — работает. У фрейма Enabled должно быть True.

    Хоткеи работают, но только «системные», т.е. Alt+Enter будет работать, а Shift+O — уже нет. Сначала дельфи посылает нажатие клавиш активному компоненту, а уж потом на всякие экшенлисты и т.д.

  5. Внимание, вопрос: на кой нужен этот уберобжект? (J/B)SON есть «искаропки», для xml есть гора разных реализаций, под разные задачи.

    В чем преимущество вашей реализации (кроме компиляции под кучу платформ)?

    Не понял фразу « Дальше я написал вокруг него километр кода, создал набор стилей и сделал динамическую загрузку стилей для списка. В список в соответствии со стилями можно добавить порядка 20 разных компонентов», через уберобжект грузятся стили для listbox?

  6. Обнаружил баг: если в ActionListUpdate делать динамическое назначение экшена на контрол, то у Application проиходит сильное раздутие коллекции FActionClientsList (с последующими тормозами интерфейса и нагрузкой на CPU); из-за этого приходится добавлять проверки, на явное изменение экшена, переприсваивать экшен приходится в два действия: сначала установить его в nil, а уж после применить нужный.

    Было бы неплохо в обезьяне, в SetAction добавить проверку, что переназначается новый экшен и перед «Application.RegisterActionClient(Self)» делать «Application.UnregisterActionClient(Self);»

  7. unit Forms.Persistent;
    
    interface
    
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      System.Math, System.Generics.Collections,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs;
    
    type
      TfrmPersistent = class(TForm)
      private
        FShortcuts: TDictionary<Integer, TPredicate<TfrmPersistent>>;
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
    
        procedure BindShortcut(const AShortcut: string; ACallBack: TPredicate<TfrmPersistent>);
        procedure UnbindShortcut(const AShortcut: string); inline;
        procedure UnbindShortcuts; inline;
    
        procedure KeyDown(var Key: Word; var KeyChar: Char;
          Shift: TShiftState); override;
      end;
    
    implementation
    
    {$R *.fmx}
    
    { TfrmPersistent }
    
    constructor TfrmPersistent.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
    
      FShortcuts := TDictionary<Integer, TPredicate<TfrmPersistent>>.Create;
    end;
    
    destructor TfrmPersistent.Destroy;
    begin
      UnbindShortcuts;
      FShortcuts.Free;
    
      inherited;
    end;
    
    procedure TfrmPersistent.BindShortcut(const AShortcut: string;
      ACallBack: TPredicate<TfrmPersistent>);
    var
      ms: IFMXMenuService;
    begin
      if not AShortcut.IsEmpty and TPlatformServices.Current.SupportsPlatformService(
        IFMXMenuService, ms) then
        FShortcuts.Add(ms.TextToShortCut(AShortcut), ACallBack);
    end;
    
    procedure TfrmPersistent.UnbindShortcut(const AShortcut: string);
    var
      ms: IFMXMenuService;
    begin
      if not AShortcut.IsEmpty and TPlatformServices.Current.SupportsPlatformService(
        IFMXMenuService, ms) then
        FShortcuts.Remove(ms.TextToShortCut(AShortcut));
    end;
    
    procedure TfrmPersistent.UnbindShortcuts;
    begin
      FShortcuts.Clear;
    end;
    
    end.
    

    Пример использования:

          BindShortcut('Ctrl+O', function (AForm: TfrmPersistent): Boolean
          begin
            todo: do something
            Result := True/False;
          end);

    True — сочетание обработано.

    False — сочетание не обработано и будет передано вложенным компонентам.

  8. Ахой, столкнулся с очередной проблемой Firemonkey, есть Frame, в нем ActionList, на Action есть Shortcut, но почему-то он никак не хочет отрабатывать. В ActionList главной формы Shortcut работают, а на фреймах — ни в какую.

    Кто сталкивался, как можно решить проблему?

  9. Приветствую, обнаружил удивительный баг: есть кнопка со стилем, содержащим 2 path (их видимость чередуется), так вот, если резко подергать размер формы, то эти path становятся невидимыми, или наоборот, показывается скрытый path. 

    Сталкивался ли кто с такой ерундой и как лечить?

    Первое, что приходит на ум — завести отдельные стили с отдельными path и в коде переключать «стайл лукап» у контрола, но хотелось бы без прибегания к программному коду.

  10. Приветствую, хотел бы узнать (может кто-то уже решал эту проблему), можно ли как-то с помощью стандартны компонентов (без написания кода) сделать пропорциональный ресайз вложенных элементов? 

    Например, есть прямоугольник, внутри него лежит path (у него анкеры: лево, право, верх, низ), при изменении размеров квадрата вдвое, размер вектора меняется на половину.

    Пробовал использовать scale у вектора, но вектор ресайзится с левого верхнего угла, а не по центру.

  11. Приветствую, есть ли какая-нибудь возможность задать содержимому списка общий отступ так, чтобы последний элемент отступал от нижней границы списка?

    Знаю, что можно воспользоваться Margins'ами, но вознкает определенное неудобство определения последнего элемента и применения к нему параметров.

  12. Более гибкий вариант, работающий как под х86, так и под х64:

    unit Forms.Persistent;
    
    interface
    
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      {$IF Defined(WIN32) OR Defined(WIN64)}
      System.Generics.Collections, Winapi.Windows, FMX.Platform.Win, Winapi.Messages,
      {$ENDIF}
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs;
    
    type
      TfrmPersistent = class(TForm)
      {$IF Defined(WIN32) OR Defined(WIN64)}
      private
        class var Callbacks: TDictionary<HWND, Pointer>;
        class constructor ClassCreate;
        class destructor ClassDestroy;
      protected
        procedure CreateHandle; override;
        procedure DestroyHandle; override;
      {$ENDIF}
      end;
    
    implementation
    
    {$R *.fmx}
    
    {$IF Defined(WIN32) OR Defined(WIN64)}
    
    { TfrmPersistent }
    
    function WindowProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
    var
      frm: TCommonCustomForm;
      oldProc: Pointer;
    begin
      frm := FindWindow(hwnd);
    
      if Assigned(frm) and (uMsg = WM_GETMINMAXINFO) then
      begin
        with PMinMaxInfo(LParam)^.ptMinTrackSize, frm do
        begin
          X := 950 + Width - ClientWidth;
          Y := 500 + Height - ClientHeight;
        end;
    
        Result := 0;
      end else
      if TfrmPersistent.Callbacks.TryGetValue(hwnd, oldProc) and Assigned(oldProc) then
        Result := CallWindowProc(oldProc, hwnd, uMsg, wParam, lParam)
      else
        Result := DefWindowProc(hwnd, uMsg, wParam, lParam);
    end;
    
    procedure TfrmPersistent.CreateHandle;
    var
      wnd: HWND;
    begin
      inherited CreateHandle;
    
      wnd := FormToHWND(Self);
    
      if wnd <> 0 then
      begin
        Callbacks.Add(wnd, Ptr(GetWindowLongPtr(wnd, GWLP_WNDPROC)));
    
        SetWindowLongPtr(wnd, GWLP_WNDPROC, NativeInt(@WindowProc));
      end;
    end;
    
    procedure TfrmPersistent.DestroyHandle;
    var
      wnd: HWND;
      oldProc: Pointer;
    begin
      wnd := FormToHWND(Self);
    
      if (wnd <> 0) and Callbacks.TryGetValue(wnd, oldProc) then
        SetWindowLongPtr(wnd, GWLP_WNDPROC, NativeInt(oldProc));
    
      inherited DestroyHandle;
    end;
    
    class constructor TfrmPersistent.ClassCreate;
    begin
      Callbacks := TDictionary<HWND, Pointer>.Create;
    end;
    
    class destructor TfrmPersistent.ClassDestroy;
    begin
      Callbacks.Free;
    end;
    {$ENDIF}
    
    end.

    Похоже, что при компиляции в х64, вложенные процедуры как-то хитро компилируются, в итоге либо кривой стек возникает, либо еще что, поэтому пришлось колбек вынести в глобальный метод.

  13. Обнаружил проблему, что в х64 ф-я FindWindow возвращает nil. В WindowProc приходит какой-то левый хендл окна.

    Вообще, какое-то странное поведение у обезьяны начинается, по стеку там вообще откуда-то из лева приходит вызов этого колбека. И очень отличается от поведения в х86.

  14. Благодарю за ответ, пытался исходник поредактировать — винда на права доступа ругалась. Сделал так:

    unit Forms.Persistent;
    
    interface
    
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      {$IF Defined(WIN32) OR Defined(WIN64)}
      Winapi.Windows, FMX.Platform.Win, Winapi.Messages,
      {$ENDIF}
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs;
    
    type
      TfrmPersistent = class(TForm)
      {$IF Defined(WIN32) OR Defined(WIN64)}
      private
        FHwnd: HWND;
        FOldWndProc: LONG_PTR;
      protected
        procedure CreateHandle; override;
        procedure DestroyHandle; override;
      {$ENDIF}
      end;
    
    implementation
    
    {$R *.fmx}
    
    {$IF Defined(WIN32) OR Defined(WIN64)}
    
    { TfrmPersistent }
    
    procedure TfrmPersistent.CreateHandle;
    
      function WindowProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
      var
        frm: TCommonCustomForm;
      begin
        frm := FindWindow(hwnd);
        Assert(frm.InheritsFrom(TfrmPersistent));
    
        if Assigned(frm) then
        begin
          if uMsg = WM_GETMINMAXINFO then
          begin
            with PMinMaxInfo(LParam)^.ptMinTrackSize, frm do
            begin
              X := 950 + Width - ClientWidth;
              Y := 500 + Height - ClientHeight;
            end;
    
            Result := 0;
          end else
            Result := CallWindowProc(Ptr(TfrmPersistent(frm).FOldWndProc), hwnd, uMsg, WParam, lParam);
        end else
          Result := DefWindowProc(hwnd, uMsg, wParam, lParam);
      end;
    
    begin
      inherited CreateHandle;
    
      FHwnd       := WindowHandleToPlatform(Handle).Wnd;
      FOldWndProc := GetWindowLongPtr(FHwnd, GWL_WNDPROC);
    
      SetWindowLongPtr(FHwnd, GWL_WNDPROC, NativeInt(@WindowProc));
    end;
    
    procedure TfrmPersistent.DestroyHandle;
    begin
      Assert(FHwnd <> 0);
      SetWindowLongPtr(FHwnd, GWL_WNDPROC, FOldWndProc);
    
      inherited DestroyHandle;
    end;
    {$ENDIF}
    
    end.

    Может кому пригодится.

  15. Приветствую, столкнулся с такой проблемой: есть фрейм, у которого отключен хиттест (этот фрейм вкладывается в TListBoxitem, а у этого айтема обрабатывается событие клика), необходимо сделать анимашку изменения цвета при наведении мыши. При включенном хиттесте всё работает, при отключенном — нет. Можно ли как-то с отключенным хиттестом включить обработку триггера IsMouseOver?

  16. Неужели никак нельзя получить доступ к вложенным элементам? Просто стилем накидать проще, чем городить свой объект с прямым доступом к дочерним элементам.

    ----

    Что самое интересное, в TStyledControl.FindStyleResource объект FResourceLink = nil.

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