• 0
Vitaldj

Создание и коррекция кастомных стилей в XE8

Вопросы

Уважаемые форумчане, программирую давно, но как то не приходилось связываться со стилями, до этого писал ( http://fire-monkey.ru/topic/1536-kak-pomeniat-fon-edit/#entry7561 ) что нужно поменять фон в edit. Получил ответ, что лучше работать со стилями, занялся этой проблемой, посмотрел вебинар по этому поводу, перелопатил эту ветку форума про стили, но понял, что все вопросы и ответы были получены в 2014 году и что в XE8 поменялось много. Не смог, вернее смог, но криво и не правильно(( разобраться как поменять стиль у edit. Смог разобраться до момента подкладки TRectangle и все. Даже поставил hittest в false, но потерялась возможность вводе текста, его не видно(. Подскажите, где поновее мануал? Или просьба Ярославу, стиль - очень важная штука, не хотел бы он тут поподробнее об этом рассказать и многие вопросы отпали у очень многих людей.

​Ну или хотяб помогите с этим простым примером.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 ответов на этот вопрос

  • 0

Так какой конкретно вопрос? Как изменить фон у TEdit или где найти мануал? Если второй, то насколько я искал, большого и грамотного мануала нет. Есть страничка на сайте emarcadero и несколько видеомануалов. Поэтому придется разбираться самому.

Если все-таки вопрос по TEdit - то тут пара нюансов (Из своего опыта):

1. Если ты решил прозрачный Edit поставить на Rectangle прямо на форме, то нужно именно подложить Rectangle под Edit, а не размещать Edit в Rectangle как дочерний компонент. Т. к. если разместить компонент в компоненте, Edit не будет получать фокус при перемещении курсора клавишей Tab.

 

2. Если хочешь по-быстрому сделать это через стили, тогда нужно через Еdit Custom Style открыть стиль и прямо в него положить TRectangle (главное, чтобы он не был кому-либо родителем, установить HitTest = False). Просто у меня под рукой дельфей сейчас нет, поэтому конкретно не могу сказать. Но главное, чтобы он был ПОД всей остальной тряхомудией, которая есть в стиле TEdit. Здесь может возникнуть сложность, т. к. в редакторе стилей нет возможности сделать Bring To Front или Send to Back. Поэтому может это придется сделать программно в обработчике OnApplyStyleLookup.

 

3. Ну а если подходить основательно к вопросу, то тут нужен Bitmap Style Designer (далее BSD), который включен в IDE. Здесь нужно:

 Открыть нужный стиль

 Сохранить из него картинку

 В любом редакторе дорисовать прямоугольник того цвета и прозрачности, которые тебе требуются.

 Загрузить обратно картинку в BSD

 Скопировать стандартный стиль для Edit, Переименовать его.

 Установить ему Kind = (что-то типа FMXListBox, точно не помню)

 Указать область для фона

 Сохранить стиль в формате (.style)

 добавить в форму StyleBook, выбрать его в реквизите StyleBook формы

 Загрузить сохраненный стиль этот StyleBook.

 Для нужного TEdit указать в Stylelookup Имя, которое вы указали в BSD для нового элемента.

 

Я ни в коем случае не претендую на то, что это лучшие способы, но у меня такие способы во всяком случае работают.

 

Хотя может быть все это можно сделать проще.

Изменено пользователем AndreyS

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Спасибо за подробный ответ, кое что пробовал, не все получилось. В общем, очень грустно(. Считаю, что стили одна и почти самая основная фишка FMX, а тут такой голяк с мануалами и вебинарами. Повторюсь, что они есть, но все сделаны в 2014 года, в 2015 многое поменялось. И все они общего значения, 50% времени в них вообще объясняются общие азы, которые особо ничего не дают, мало конкретных примеров(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Вообще по опыту пользования, стили в FM (как они задуманы) - это действительно удобная и крутая штука. И если нормально разобраться, то создание стилей не очень сложная задача. Но, конечно, есть минусы, которые портят картину:

1. Нет полного описания свойств объектов.

2. Для объектов отображаются свойства, которые на внешний вид никак не влияют и только сбивают с толку.

3. Для ряда объектов некоторые свойства тупо игнорируются при формировании стиля (например, отступы у ListBox) и их потом приходится вручную устанавливать каждый раз, когда что-то меняешь в стиле

4. Нет возможности (я во всяком случае не нашел для FM) плавно менять внешний вид контролов при наведении курсора, нажатии и пр.

5. Не совсем понятна логика подбора стилей в при указании свойства StyleLookup. Иногда хватает стили с других форм, вместо своей. А в XE8 update 1 для некоторых контролов (у меня это был TListBoxItem) указывать стиль в дизайн-тайме стало вообще бессмысленно, т. к. он его теряет при запуске приложения.

6. Конечно, иногда лагает редактор стилей непосредственно в IDE (например, как здесь писали у кого-то сильно память жрет). Но по сравнению с XE2, где Access violation был просто спутником по жизни, все на приемлемом уровне.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Да, насчет стилей - контролам в хелп, думаю, уже пора добавлять еще одну вкладку к методам и событиям - Стиль

Изменено пользователем VladimirS

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Такая-же проблема: добавил TRectangle, StyleName установил в background, цвет белый, HitTest=false - результат - ни курсора ни значений ни фокуса, самое интересное, если цвет делаю прозрачным, то и курсор и фокус и значения есть, НО нет ФОНА, если кто знает помогите?

Захват-1.jpg

Изменено пользователем oss0kin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Похоже Вы разместили Rectangle 'background' поверх других контролов. Попробуйте нажать на нем правой кнопкой мыши и в контекстном меню выбрать Control -> Send To Back

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
43 минуты назад, oss0kin сказал:

если кто знает помогите

Сделайте Background контейнером для Content-а.

Clip2net_160728184934.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 23.07.2015 в 17:09, AndreyS сказал:

Нет возможности (я во всяком случае не нашел для FM) плавно менять внешний вид контролов при наведении курсора, нажатии и пр

Как это нет? А набор анимаций для чего. С их использованием можно сделать практически любой выверт с UI. Вообще различные Animation очень забавная вещь. Когда у меня была задача создать свой стиль для приложения и я стал вплотную изучать этот вопрос (ещё на XE4) то добравшись до этого просто забыл про время, забавляясь с различными возможностями этого функционала (именно применительно ко стилям)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
14 часов назад, dnekrasov сказал:

Сделайте Background контейнером для Content-а.

Clip2net_160728184934.png

Спасибо большое dnekrasov! Благодаря вам получилось! Подскажите пожалуйста есть-ли какое-нибудь описание какой набор атрибутов и их назначение у того-же editstyle, пока ищу через демо-стили, но не все понятно? Опять же структура: background - контейнер для content, есть-ли какое-нибудь описание? У меня Delphi XE8. Заранее благодарен!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
52 минуты назад, oss0kin сказал:

Подскажите пожалуйста есть-ли какое-нибудь описание какой набор атрибутов и их назначение у того-же editstyle

Описания я так и не нашёл - пришлось до всего доходить самому. В данном случае eidtstyle - простой TLayout. Кстати, чаще всего как контейнер для стиля контрола используется TLayout, но в последних версиях редактора стилей появилась возможность использовать при создании не только контролы из палитры но и такие объекты как TStyledObject, TActiveStyleObject и т.д. - что значительно упростило работу (раньше приходилось вручную редактировать текст стиля). А вообще, чтобы просто понять работу со стилями и разобраться хотя-бы в основных принципах работы с ними мне очень помог Firemonkey StyleEditor. Он очень глючный, давно уже не поддерживается и реальные стили с его помощью уже не создать, но как помощник при старте изучения можно использовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
20 минут назад, dnekrasov сказал:

Описания я так и не нашёл - пришлось до всего доходить самому. В данном случае eidtstyle - простой TLayout. Кстати, чаще всего как контейнер для стиля контрола используется TLayout, но в последних версиях редактора стилей появилась возможность использовать при создании не только контролы из палитры но и такие объекты как TStyledObject, TActiveStyleObject и т.д. - что значительно упростило работу (раньше приходилось вручную редактировать текст стиля). А вообще, чтобы просто понять работу со стилями и разобраться хотя-бы в основных принципах работы с ними мне очень помог Firemonkey StyleEditor. Он очень глючный, давно уже не поддерживается и реальные стили с его помощью уже не создать, но как помощник при старте изучения можно использовать.

Спасибо большое! Буду изучать!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От notricky
      На Android код, который работает исправно на Win  вызывает ошибку "CalledFromWrongThreadException: Only the original thread that created a view hierarcy can touch its views" 
      Смысл таков, что я пытаюсь показать форму из треда, у которой BorderStyle=none (роли это не играет).
      Решение в Андроиде заключается в том, чтобы пускать через  runOnUiThread  (то есть выполнять интерфейсные штуки в главном потоке). Как я понимаю, в firemonkey эту фичу должен выполнять Synchronize().
      Тем не менее, ошибка возникает.
      А при запуске в режиме дебага на андроид девайсе событие кнопки вообще не срабатывает иногда. А если срабатывает, то возникает описанное выше исключение.
      Я собрал тестовый пример и в нем не сразу видна ошибка, тогда как получил я ее на рабочем проекте.
      Цель: показать бизибокс на время бекграундных действий. Этот бизибокс у меня сначала был просто на каждой форме и я интерфейсно его вызывал, но теперь решил сделать отедльной формой (как и тоаст), но почему так происходит я не понял. Вы что скажете?
       
      unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TWorkThread = class(TThread) public procedure Execute; override; end; var Form1: TForm1; implementation {$R *.fmx} uses unit2; procedure TForm1.Button1Click(Sender: TObject); var t: TWorkThread; begin t := TWorkThread.Create(True); t.FreeOnTerminate := true; t.Start; end; { TWorkThread } procedure TWorkThread.Execute; begin inherited; Self.Synchronize(procedure begin Form2.Show; Form2.Top := Form1.Top; Form2.Left := Form1.Left; Form2.BringToFront; end); Terminate; end; end.  
    • От notricky
      Почему-то не возможно использовать константы цветов, заданные в TAlphaColorRec, TColorRec.
      Они есть, но при присвоении, например, TextSettings.Font.Color = TColorRec.cRed или TAlphaColorRec.Red ничего не происходит. Нужно явно задавать $FFFF0000.
      Если так у кого-то ещё, напишите.
      А если что-то можно с этим сделать - тоже
    • От notricky
      Почему-то код, исправно работающий для WIN, не работает на ANDROID.
      procedure AssignEventToComponent(C: TComponent; MethodName: String; const Evt: TNotifyEvent; OnlyIfNil: boolean = true); var M: TMethod; begin M := GetMethodProp(C,MethodName); if not OnlyIfNil or (M.Code = nil) then begin TNotifyEvent(M) := Evt; SetMethodProp(C,MethodName,M); end; end; Есть какие-то особенности работы TMethod для ANDROID?
    • От Рагим
      Доброго времени суток. Имеется старый проект написанный на VCL. Хочу его перевести на FMX и столкнулся с тем, что не могу воспроизвести SWF. Компоненты Flash установлены и видны под VCL, а под FMX нет.
    • От Евгений Корепов
      Возникла задача поиска (фильтрации) в ListView по нескольким критериям. К примеру нужно искать по Item.Text, Item.Detail и Item.Date['Category']. Пошел путем, ранее подсказанным на этом форуме - правкой "function TListViewItems.ApplyFilter: Boolean" в FMX.ListView.pas. Передавать строку поиска хотел в строке типа "Text=Пеньки&Detail=по три рубля&Category=Осиновые", но быстро понял что код превращается в одноразовую кашу, а хотелось сделать красиво и на будущее.
      Сделал так - добавил еще один тип "TFilterPredicateEx = TPredicate<TListViewItem>;", к существующему "TFilterPredicate = TPredicate<string>;" в TListViewItems. Ну и далее по списку добавил аналоги к переменным, функциям и property.
      Смысл в том чтобы вместо обычного бутылочного горлышка в фильтации:
      ListView.Items.Filter:= function(X: string): Boolean begin Result := AFilterText.IsEmpty or X.ToLower.Contains(AFilterText.ToLower); end; иметь мощный инструмент с доступом ко всем плюшкам TListViewItem. Теперь это выглядит вот так:
      type TListViewFilterEx = record Category : String; Name : String; end; ... Var AFilter : TListViewFilterEx; // это для удобства хранения фильтров в одном месте ... AFilter.Category:='Береза'; AFilter.Name:='Пеньки'; AListView.Items.FilterEx:= function(X: TListViewItem): Boolean begin Result:= (AFilter.Category.IsEmpty or X.Data['Category'].AsString.ToLower.Contains(AFilter.Category.ToLower)) And ((AFilter.Name.IsEmpty or X.Text.ToLower.Contains(AFilter.Name.ToLower)) or (AFilter.Name.IsEmpty or X.Detail.ToLower.Contains(AFilter.Name.ToLower))); end; Подозреваю что все это можно было сделать с помощью хелперов, но до их освоения руки никак не дойдут. Если кто то сделает хелпер, дабы не править FMX.ListView.pas, буду очень благодарен.
      Внимание! FMX.ListView.pas от Delphi XE8, к другим версиям думаю не подойдет.
      Прилагаю дополненный FMX.ListView.pas к сообщению.
      FMX.ListViewWithFilterEx.zip
    • От Евгений Корепов
      При публикации нового приложения я обнаружил исчезновение Google Cloud Messaging из консоли разработчика, теперь вместо него Firebase Cloud Messaging. 
      Как я понимаю возможность push сообщений для Delphi закончилась? Или как то можно прикрутить FCM к проекту на Delphi?
    • От uuxyyz
      Коллеги, добрый день. Отписался сегодня по выходу XE8, но решили таки продолжить мытарства. Вопрос, кто нибудь может подсказать, как собрать 64 битное IOS приложение? Сегодня установили XE8, линковщик требует libsqlite3.a и все. 
    • От Рагим
      Доброго времени суток.
       
      Есть приложение которое на некоторые действия пользователей отвечает звонком. Приложение живет со времени Delphi 7. Для воспроизведения звука использую такую процедуру:
       
      Procedure Tform1.PlayRing; var s:string; begin  s := 'ringin.wav';  if FileExists(s) then   begin   form1.MediaPlayer1.Stop;   form1.MediaPlayer1.Clear;   form1.MediaPlayer1.FileName:=s;   form1.MediaPlayer1.Play;   end   else showmessage('Error 104: File not found: '+s);     end;   Звук воспроизводится нормально 50-60 раз. Потом либо выскакивает ошибка: Unsupported media file ringin.wav, либо приложение подвисает. Проблема появилась после перехода с VCL на FMX.
    • От mader
      Здравствуйте, подскажите пожалуйста, есть ли такая библиотека или Апи, для перехвата звонков.
       
      Необходимо следующее, когда пользователь звонит или ему звонят, необходимо отправить сигнал в PHP, В начале звонка и в конце звонка, а так же отправить номер телефона. кто звонил и кому звонили.
      как-то так.
       
      Возможно ли реализовать на Делфи? Установил себе XE8.
      Не хотелось бы пистаь на Java? Там все как-то сложно, хотелось бы на Делфи.
       
       
    • От Евгений Корепов
      Задача следующая - добавить анимацию в ListBoxItem по клику, ListBoxItem может быть несколько десятков. Создавать для каждого Animation накладно.
       
       
      Update:
      Нашел решение в теме http://fire-monkey.ru/topic/1073-smena-roditelskogo-komponenta-dlia-animatora/ :
      но мне нужно также событие AnimationFinish, по нему происходит смена содержимого ListBox. (Пишу компонент файл-менеджера для одного проекта).
       
      Update:
      Вроде нашел решение, все работает. Подскажите корректно ли я это делаю? 
       
      procedure TFormMain.FormCreate(Sender: TObject); begin   FloatAnimation.Parent:=Nil;  // FloatAnimation создан в дизайнатйме, лежит на форме, поэтому нужно так сделать.   FloatAnimation.Enabled:=False; end; procedure TFormMain.ListBoxFilesItemClick(const Sender: TCustomListBox;  const Item: TListBoxItem); begin   CurrentItem:=Item;   if CurrentItem.Tag=1 then // Смена папки   begin     FloatAnimation.Parent:=Item;     FloatAnimation.PropertyName:='Opacity';     FloatAnimation.Enabled:=True;     FloatAnimation.Start;   end; end; procedure TFormMain.FloatAnimationFinish(Sender: TObject); begin   FloatAnimation.Enabled:=False;   FloatAnimation.Parent:=Nil;   FillListBoxFile(CurrentItem.TagString); end; Причем без этого куска кода:
        FloatAnimation.Enabled:=False;   FloatAnimation.Parent:=Nil; работать не хочет. 
      Хотя работает и ладно... ;-)
       
       
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу