-
Постов
82 -
Зарегистрирован
-
Посещение
-
Победитель дней
15
Весь контент Dmitry_4501
-
По сути, StylesData обращается к полю типа TDictionary<string, TValue>, и позволяет хранить там свои данные. Можно написать что-то вроде // Запись значений TreeViewItem.StylesData['custom.isLocked'] := true; TreeViewItem.StylesData['custom.id'] := 'id'; TreeViewItem.StylesData['custom.groupId'] := 1234; // Получение значений var isLocked: Boolean := TreeViewItem.StylesData['custom.isLocked'].AsBoolean(); var id: string := TreeViewItem.StylesData['custom.id'].AsString(); var groupId: Integer := TreeViewItem.StylesData['custom.groupId'].AsInteger(); И т.д. Разумеется custom не является обязательным, можно использовать любое.
-
Допустим, на форме есть кнопка со своим стилем, её стиль выглядит допустим так, и надо найти opacityanimation. Искать надо не от sublayout_6, а от самой кнопки, т.е: Если функция находит нужный объект стиля и возвращает true, то тогда можем работать с переменной _opacityAnimation, ведь в неё придет ссылка на объект анимации из стиля. Всё просто. Но кстати, можно работать и другим способом. Если нужно обратиться к одному или нескольким свойствам какого-то объекта внутри стиля то можно использовать первый способ (желтый) А если нужно получить объект, то есть второй способ (зеленый). В принципе логика можно сказать такая же что и в самом первом способе через FindStyleResource Полезная особенность StylesData. Его можно использовать для хранения любых пользовательских данных.
-
Я такое поведение реализовал с одними лишь стилями, код вообще не писал. А вот при помощи кода решил другой ваш вопрос (про AlternatingRowBackground) FMXProject.zip
-
Такое поведение было нужно? 20251030-1634-06.2957183.mp4
-
Можно ваш проектик? Хотелось бы самому увидеть структуру вашего стиля и код.
-
Какой StyleName у вашей анимации в стиле? FindStyleResource, StylesData ищут именно по StyleName. К тому же покажите код, как вы ищете анимацию. И да, изменения, внесенные в компоненты стиля будут утрачены после перерисовки (а конкретно после вызова метода ApplyStyleLookup)
-
Как было правильно подмечено Поэтому делать стили компонентам можно в самой RAD Studio. Их даже рисовать не обязательно. При желании можно строить стили компонентов на TRectangle. Хотя есть некоторые моменты, которые доставляют определнные неудобства при работе со стилями.
-
Можно попробовать вот это: https://github.com/neslib/Neslib.Yoga/
-
Компонент TPanel в своём стиле строится на компоненте TRectangle, который в свою очередь имеет два прекрасных свойства XRadius и YRadius, которые и отвечают за степень закруглённости углов. Выбираете нужную панель, правая кнопка мыши -> Edit Custom Style
-
В общем. Я решил тоже установить RedOS. Установил на виртуалку. Собрал SDK в Delphi. Попробовал собрать проект - не получилось Тогда я начал искать в сети решения. Нашел как установить gcc и прочие утилиты и библиотеки для разработки. (при помощи команды dnf groupinstall "Development Tools" После установки я решил обновить SDK при помощи кнопки Update Local File Cache По итогу ничего не получилось. Тогда я решил при помощи Beyond Compare сравнить файлы и папки моих SDK (один для RedOS не работающий и второй для Ubuntu полностью рабочий). Я заметил различие в том что в SDK для RedOS отсутствовала папка gcc. Я полез искать эту папку в самой RedOS и нашел её, но почему-то PAServer её не передал во время создания SDK. Зайдя в папку я нашел причину проблемы. Для Ubuntu папка с gcc называется вот так - x86_64-linux-gnu А для RedOS папка с gcc называется вот так - x86_64-redsoft-linux Вот и вся причина. PAServer ничего не знает ни о какой x86_64-redsoft-linux и поэтому при создании SDK её не копирует. Отсюда и ошибка сборки проекта на стадии линковки. В общем, решил эту проблему самым простым способом - создал символическую ссылку ln -s ./x86_64-redsoft-linux ./x86_64-linux-gnu А затем ещё раз в Delphi нажал на кнопку Update Local File Cache После того как процесс обновления файлов SDK завершился я попробовал собрать проект и... Краткое руководство как получить рабочий SDK для RedOS. 1. Загружаем PAServer в систему 2. Выполняем команду dnf groupinstall "Development Tools" 3. В терминале переходим по пути из / в /usr/lib/gcc 4. Создаем символическую ссылку ln -s ./x86_64-redsoft-linux ./x86_64-linux-gnu 5. В Delphi создаем\обновляем (при помощи Update Local File Cache) SDK для RedOS Готово
-
Может поможет создание еще одного SDK но уже для RedOS?
-
Уже давно замечаю такое странное поведение, но увы, отловить пока причину так и не смог. Не сказать бы что это хоть как-то влияет на работу самой IDE. В общем. При открытии и установке пакетов иногда среда может поломать пути в настройках в секции Library, исключительно для Windows 32-bit, для остальных платформ всё нормально. Вот как это выглядит. А вот как выглядит на Windows 64 Разницу заметили? Если нет, то вот в чём она выражается Среда, с какого-то момента изменяет пути таким образом, чтобы ни одной переменной не было. Причём, если добавить новый путь с использованием переменных, то спустя какое-то время и он изменится.
-
Попробуйте вот так (не самый идеальный вариант, но он работает и ошибок не выдает). procedure TForm1.Button1Click(Sender: TObject); begin var selectedItems: TArray<TListBoxItem>; // Объявляем массив из объектов TListBoxItem for var item: TFMXObject in ListBox1.Children.Items[1].Children do // Перебираем каждый дочерний компонент в ListBox, который является экземпляром класса TListBoxItem. begin if item is TListBoxItem then // Проверяем, является ли item экземпляром класса TListBoxItem if TListBoxItem(item).IsChecked then // Проверяем, является ли элемент отмеченным галочкой begin System.SetLength(selectedItems, System.Length(selectedItems) + 1); // Увеличиваем длину массива selectedItems[High(selectedItems)] := TListBoxItem(item); // Вставляем элемент в массив end; end; DeleteAllCheckedFiles(selectedItems); end; procedure TForm1.DeleteAllCheckedFiles(items: TArray<TListBoxItem>); begin if System.Length(items) < 1 then Exit; for var i: Integer := 0 to System.Length(items) - 1 do begin var item: TListBoxItem := items[i]; if Assigned(item) then begin // TFile.Delete(item.Text); item.Free(); // Освобождаем память, тем самым объект уничтожится и больше не будет находиться в списке элементов TListBox end; end; end;
-
Можно увидеть вашу реализацию безрамочной формы и вашей WindowProc?
-
Оконные сообщения в FMX можно обрабатывать так же как и в VCL. Достаточно в вашу WindowProc добавить это: var Message: TMessage; Message.Msg := uMsg; Message.WParam := wParam; Message.LParam := lParam; Message.Result := 0; frm.Dispatch(Message); Тогда потом можно будет смело написать что-то вроде procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT; И оно будет работать.
-
Кажется я понял в чем причина. Попробуйте заменить SendMessage на PostMessage, у меня после этого окно развернулось на весь экран.
-
Да. Окно на FireMonkey не реагирует на это сообщение. Странно, я точно помню что делал уже такое на FireMonkey и оно работало. Правда было это давно, попробую еще поковыряться, может получится.
-
Хм, странно. Должно работать. Сейчас открою проект еще раз у себя. Гляну.
-
Подключусь к теме... Как-то пытался сделать подобное и в принципе получилось, безрамочное окно, которое по-нативному работает, что удалось заставить работать: Если взять окно за заголовок и начать двигать им туда-сюда, то все остальные окна свернутся - нативное поведение Если взять окно за заголовок то в Windows 11 появляется верхнее меню с макетами отображения на экране - нативное поведение Если взять окно за заголовок и перетащить его к одному из краев экрана, то появится макет для отображения окна - нативное поведение Нативным образом реализовано изменение размера за все края формы, включая диагональные. Так же окно имеет нативные анимации появления\исчезания, разворачивания\сворачивания Так же имеется нативная тень А на Windows 11 имеются закруглённые края окна Что не получилось: Не получилось реализовать нативное поведение, когда в Windows 11 наводишь курсор на кнопку "развернуть окно", там появляется небольшое меню с макетами отображения на экране. Нормально реализовать границы для изменения размеров окна, ибо из-коробки они находятся за пределами окна в поле где тень у окна (в Windows 10 и Windows 11 так), у меня же они внутри окна. Как-то делал и получалось, но уже не помню. Код несложно адаптировать и под FireMonkey BorderlessWindowWithAeroSnap.zip
-
Проходишь циклом по всему списку и у каждого элемента проверяешь свойство IsChecked, если оно true, то тогда при помощи TFile.Delete удаляешь файл. Как-то так: procedure DeleteAllCheckedFiles(); begin if ListBox1.Count < 1 then Exit; // Если количество элементов меньше 1, то выходим из процедуры for var I: Integer := 0 to ListBox1.Count - 1 do if ListBox1.ListItems[I].IsChecked then // Проверяем свойство IsChecked (т.е отмечен ли элемент) TFile.Delete(ListBox1.ListItems[I].Text); // Удаляем файл (только в том случае, если в тексте элемента записан путь до файла, иначе придется переделать эту строчку под свои нужды) end; Для TFile.Delete необходимо подключить юнит System.IOUtils
-
Это добавлено специально чтобы в дизайнере форм случайно не переместить компонент. Очень удобно, в VCL такого нет и порой это может вылиться в мороку, когда вместо одного компонента выбрал другой и перетащил, тем самым поломав весь UI.