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

TrueCrypt

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

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

  • Посещение

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

    1

Весь контент TrueCrypt

  1. TrueCrypt

    Утечка памяти в чартах

    Привет, при вызове метода ASeries.AddXY (пример: ASeries.AddXY(ASeries.MaxXValue + 1, AValue);) происходит утечка памяти, при том довольно сильная. Есть ли какая-то возможность устранить такой недочет. Исходник чарта закрытый, найти перврпричину не удается.
  2. Попап меню под панелью задач оказывается, т.к. менюшка расположена на попапе, а тот как обычная форма интерпретируется виндой. Либо свой попап делать, либо показывать вместо меню форму/окно.
  3. Пробовал через стиль сделать, парентом делать слой в стиле элемента, но тогда всё содержимое при перерисовке начинает скакать между элементами.
  4. TrueCrypt

    Добавление на Item

    Заполняю дерево, на узлах создаю фрейм (либо же любой другой объект), делаю узлам Expand и при скролировании возникает ошибка «Argument out of range», будто неправильно рассчитывается количество вложенных элементов. Как можно избавиться от такой ошибки?На узел кладу объект так: TfrFolderItem.Create(ATreeNode {owner}, ATreeNode {parent}, AFolderName); ATreeNode.Expand;
  5. Хоткеи работают, но только «системные», т.е. Alt+Enter будет работать, а Shift+O — уже нет. Сначала дельфи посылает нажатие клавиш активному компоненту, а уж потом на всякие экшенлисты и т.д.
  6. Внимание, вопрос: на кой нужен этот уберобжект? (J/B)SON есть «искаропки», для xml есть гора разных реализаций, под разные задачи. В чем преимущество вашей реализации (кроме компиляции под кучу платформ)? Не понял фразу « Дальше я написал вокруг него километр кода, создал набор стилей и сделал динамическую загрузку стилей для списка. В список в соответствии со стилями можно добавить порядка 20 разных компонентов», через уберобжект грузятся стили для listbox?
  7. С подобной байдой сталкивался при копировании кода, например, из визуалстудии. Из-за кривых переносов строк, в общем.
  8. Обнаружил баг: если в ActionListUpdate делать динамическое назначение экшена на контрол, то у Application проиходит сильное раздутие коллекции FActionClientsList (с последующими тормозами интерфейса и нагрузкой на CPU); из-за этого приходится добавлять проверки, на явное изменение экшена, переприсваивать экшен приходится в два действия: сначала установить его в nil, а уж после применить нужный. Было бы неплохо в обезьяне, в SetAction добавить проверку, что переназначается новый экшен и перед «Application.RegisterActionClient(Self)» делать «Application.UnregisterActionClient(Self);»
  9. 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 — сочетание не обработано и будет передано вложенным компонентам.
  10. Нашел, в каком-то плане, красивое решение. Публиковать?
  11. Спасибо за ответ. Увы, не получилось задать стилями пропроциональный ресайз, пришлось использовать два компонента.
  12. TrueCrypt

    ActionList Frame Shortcut

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

    Исчезновение стиля

    Приветствую, обнаружил удивительный баг: есть кнопка со стилем, содержащим 2 path (их видимость чередуется), так вот, если резко подергать размер формы, то эти path становятся невидимыми, или наоборот, показывается скрытый path. Сталкивался ли кто с такой ерундой и как лечить? Первое, что приходит на ум — завести отдельные стили с отдельными path и в коде переключать «стайл лукап» у контрола, но хотелось бы без прибегания к программному коду.
  14. Приветствую, хотел бы узнать (может кто-то уже решал эту проблему), можно ли как-то с помощью стандартны компонентов (без написания кода) сделать пропорциональный ресайз вложенных элементов? Например, есть прямоугольник, внутри него лежит path (у него анкеры: лево, право, верх, низ), при изменении размеров квадрата вдвое, размер вектора меняется на половину. Пробовал использовать scale у вектора, но вектор ресайзится с левого верхнего угла, а не по центру.
  15. Для контейнера и задавал. Марджин контейнера работает, но элементы обрезаются не по нижней границе.
  16. Увы, но паддинг для айтемов не заработал. ХЕ10. И в стиле задал для Content паддинги — никак не влияет.
  17. Приветствую, есть ли какая-нибудь возможность задать содержимому списка общий отступ так, чтобы последний элемент отступал от нижней границы списка? Знаю, что можно воспользоваться Margins'ами, но вознкает определенное неудобство определения последнего элемента и применения к нему параметров.
  18. Более гибкий вариант, работающий как под х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, вложенные процедуры как-то хитро компилируются, в итоге либо кривой стек возникает, либо еще что, поэтому пришлось колбек вынести в глобальный метод.
  19. Обнаружил проблему, что в х64 ф-я FindWindow возвращает nil. В WindowProc приходит какой-то левый хендл окна. Вообще, какое-то странное поведение у обезьяны начинается, по стеку там вообще откуда-то из лева приходит вызов этого колбека. И очень отличается от поведения в х86.
  20. Благодарю за ответ, пытался исходник поредактировать — винда на права доступа ругалась. Сделал так: 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. Может кому пригодится.
  21. Приветствую, реально ли как-то без особых костылей научить ф-ю WndProc обрабатывать сабж? Делал через SetWindowLong, работает, но очень уж костыльно выглядит.
  22. Но при отключенном хиттесте маусмув не отрабатывает.
  23. Приветствую, столкнулся с такой проблемой: есть фрейм, у которого отключен хиттест (этот фрейм вкладывается в TListBoxitem, а у этого айтема обрабатывается событие клика), необходимо сделать анимашку изменения цвета при наведении мыши. При включенном хиттесте всё работает, при отключенном — нет. Можно ли как-то с отключенным хиттестом включить обработку триггера IsMouseOver?
  24. Неужели никак нельзя получить доступ к вложенным элементам? Просто стилем накидать проще, чем городить свой объект с прямым доступом к дочерним элементам. ---- Что самое интересное, в TStyledControl.FindStyleResource объект FResourceLink = nil.
×
×
  • Создать...