-
Постов
26 -
Зарегистрирован
-
Посещение
-
Победитель дней
1
Весь контент TrueCrypt
-
Привет, при вызове метода ASeries.AddXY (пример: ASeries.AddXY(ASeries.MaxXValue + 1, AValue);) происходит утечка памяти, при том довольно сильная. Есть ли какая-то возможность устранить такой недочет. Исходник чарта закрытый, найти перврпричину не удается.
-
Пробовал через стиль сделать, парентом делать слой в стиле элемента, но тогда всё содержимое при перерисовке начинает скакать между элементами.
-
Заполняю дерево, на узлах создаю фрейм (либо же любой другой объект), делаю узлам Expand и при скролировании возникает ошибка «Argument out of range», будто неправильно рассчитывается количество вложенных элементов. Как можно избавиться от такой ошибки?На узел кладу объект так: TfrFolderItem.Create(ATreeNode {owner}, ATreeNode {parent}, AFolderName); ATreeNode.Expand;
-
Хоткеи работают, но только «системные», т.е. Alt+Enter будет работать, а Shift+O — уже нет. Сначала дельфи посылает нажатие клавиш активному компоненту, а уж потом на всякие экшенлисты и т.д.
- 6 ответов
-
- ActionList
- Frame
-
(и ещё 1 )
C тегом:
-
Внимание, вопрос: на кой нужен этот уберобжект? (J/B)SON есть «искаропки», для xml есть гора разных реализаций, под разные задачи. В чем преимущество вашей реализации (кроме компиляции под кучу платформ)? Не понял фразу « Дальше я написал вокруг него километр кода, создал набор стилей и сделал динамическую загрузку стилей для списка. В список в соответствии со стилями можно добавить порядка 20 разных компонентов», через уберобжект грузятся стили для listbox?
- 19 ответов
-
С подобной байдой сталкивался при копировании кода, например, из визуалстудии. Из-за кривых переносов строк, в общем.
-
Обнаружил баг: если в ActionListUpdate делать динамическое назначение экшена на контрол, то у Application проиходит сильное раздутие коллекции FActionClientsList (с последующими тормозами интерфейса и нагрузкой на CPU); из-за этого приходится добавлять проверки, на явное изменение экшена, переприсваивать экшен приходится в два действия: сначала установить его в nil, а уж после применить нужный. Было бы неплохо в обезьяне, в SetAction добавить проверку, что переназначается новый экшен и перед «Application.RegisterActionClient(Self)» делать «Application.UnregisterActionClient(Self);»
-
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 — сочетание не обработано и будет передано вложенным компонентам.
- 6 ответов
-
- ActionList
- Frame
-
(и ещё 1 )
C тегом:
-
Нашел, в каком-то плане, красивое решение. Публиковать?
- 6 ответов
-
- ActionList
- Frame
-
(и ещё 1 )
C тегом:
-
Спасибо за ответ. Увы, не получилось задать стилями пропроциональный ресайз, пришлось использовать два компонента.
-
Ахой, столкнулся с очередной проблемой Firemonkey, есть Frame, в нем ActionList, на Action есть Shortcut, но почему-то он никак не хочет отрабатывать. В ActionList главной формы Shortcut работают, а на фреймах — ни в какую. Кто сталкивался, как можно решить проблему?
- 6 ответов
-
- ActionList
- Frame
-
(и ещё 1 )
C тегом:
-
Приветствую, обнаружил удивительный баг: есть кнопка со стилем, содержащим 2 path (их видимость чередуется), так вот, если резко подергать размер формы, то эти path становятся невидимыми, или наоборот, показывается скрытый path. Сталкивался ли кто с такой ерундой и как лечить? Первое, что приходит на ум — завести отдельные стили с отдельными path и в коде переключать «стайл лукап» у контрола, но хотелось бы без прибегания к программному коду.
-
Приветствую, хотел бы узнать (может кто-то уже решал эту проблему), можно ли как-то с помощью стандартны компонентов (без написания кода) сделать пропорциональный ресайз вложенных элементов? Например, есть прямоугольник, внутри него лежит path (у него анкеры: лево, право, верх, низ), при изменении размеров квадрата вдвое, размер вектора меняется на половину. Пробовал использовать scale у вектора, но вектор ресайзится с левого верхнего угла, а не по центру.
-
Для контейнера и задавал. Марджин контейнера работает, но элементы обрезаются не по нижней границе.
-
Увы, но паддинг для айтемов не заработал. ХЕ10. И в стиле задал для Content паддинги — никак не влияет.
-
Приветствую, есть ли какая-нибудь возможность задать содержимому списка общий отступ так, чтобы последний элемент отступал от нижней границы списка? Знаю, что можно воспользоваться Margins'ами, но вознкает определенное неудобство определения последнего элемента и применения к нему параметров.
-
Более гибкий вариант, работающий как под х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, вложенные процедуры как-то хитро компилируются, в итоге либо кривой стек возникает, либо еще что, поэтому пришлось колбек вынести в глобальный метод.
-
Обнаружил проблему, что в х64 ф-я FindWindow возвращает nil. В WindowProc приходит какой-то левый хендл окна. Вообще, какое-то странное поведение у обезьяны начинается, по стеку там вообще откуда-то из лева приходит вызов этого колбека. И очень отличается от поведения в х86.
-
Благодарю за ответ, пытался исходник поредактировать — винда на права доступа ругалась. Сделал так: 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. Может кому пригодится.
-
Приветствую, реально ли как-то без особых костылей научить ф-ю WndProc обрабатывать сабж? Делал через SetWindowLong, работает, но очень уж костыльно выглядит.
-
Но при отключенном хиттесте маусмув не отрабатывает.
-
Приветствую, столкнулся с такой проблемой: есть фрейм, у которого отключен хиттест (этот фрейм вкладывается в TListBoxitem, а у этого айтема обрабатывается событие клика), необходимо сделать анимашку изменения цвета при наведении мыши. При включенном хиттесте всё работает, при отключенном — нет. Можно ли как-то с отключенным хиттестом включить обработку триггера IsMouseOver?
-
Неужели никак нельзя получить доступ к вложенным элементам? Просто стилем накидать проще, чем городить свой объект с прямым доступом к дочерним элементам. ---- Что самое интересное, в TStyledControl.FindStyleResource объект FResourceLink = nil.