-
Постов
26 -
Зарегистрирован
-
Посещение
-
Победитель дней
1
Сообщения, опубликованные TrueCrypt
-
-
Попап меню под панелью задач оказывается, т.к. менюшка расположена на попапе, а тот как обычная форма интерпретируется виндой. Либо свой попап делать, либо показывать вместо меню форму/окно.
-
Пробовал через стиль сделать, парентом делать слой в стиле элемента, но тогда всё содержимое при перерисовке начинает скакать между элементами.
-
Заполняю дерево, на узлах создаю фрейм (либо же любой другой объект), делаю узлам Expand и при скролировании возникает ошибка «Argument out of range», будто неправильно рассчитывается количество вложенных элементов.
Как можно избавиться от такой ошибки?На узел кладу объект так:
TfrFolderItem.Create(ATreeNode {owner}, ATreeNode {parent}, AFolderName); ATreeNode.Expand;
-
В 13.04.2016 в 18:30, RoschinSpb сказал:
Какая у вас версия? Сейчас проверил на RAD Studio 10 — работает. У фрейма Enabled должно быть True.
Хоткеи работают, но только «системные», т.е. Alt+Enter будет работать, а Shift+O — уже нет. Сначала дельфи посылает нажатие клавиш активному компоненту, а уж потом на всякие экшенлисты и т.д.
-
Внимание, вопрос: на кой нужен этот уберобжект? (J/B)SON есть «искаропки», для xml есть гора разных реализаций, под разные задачи.
В чем преимущество вашей реализации (кроме компиляции под кучу платформ)?
Не понял фразу « Дальше я написал вокруг него километр кода, создал набор стилей и сделал динамическую загрузку стилей для списка. В список в соответствии со стилями можно добавить порядка 20 разных компонентов», через уберобжект грузятся стили для listbox?
-
С подобной байдой сталкивался при копировании кода, например, из визуалстудии. Из-за кривых переносов строк, в общем.
-
Обнаружил баг: если в 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 — сочетание не обработано и будет передано вложенным компонентам.
-
Нашел, в каком-то плане, красивое решение. Публиковать?
-
Спасибо за ответ. Увы, не получилось задать стилями пропроциональный ресайз, пришлось использовать два компонента.
-
Ахой, столкнулся с очередной проблемой Firemonkey, есть Frame, в нем ActionList, на Action есть Shortcut, но почему-то он никак не хочет отрабатывать. В ActionList главной формы Shortcut работают, а на фреймах — ни в какую.
Кто сталкивался, как можно решить проблему?
-
Приветствую, обнаружил удивительный баг: есть кнопка со стилем, содержащим 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.
Утечка памяти в чартах
в TeeChart
Опубликовано
Привет, при вызове метода ASeries.AddXY (пример: ASeries.AddXY(ASeries.MaxXValue + 1, AValue);) происходит утечка памяти, при том довольно сильная. Есть ли какая-то возможность устранить такой недочет. Исходник чарта закрытый, найти перврпричину не удается.