• 0
x11

Автоматизация работы со стилями

Вопрос

Посмотрел это видео

 

https://youtu.be/iM9lamNwmtc?t=20m51s

 

Там же просто копипастинг. Чтобы подключить ещё 2-5-10 стилей, нужно заниматься копипастой. Именовать/переименовывать.

Разве так можно?

А нельзя как-то автоматизировать процесс добавления стилей в список, где их может выбирать пользователь в процессе работы?

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


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

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

  • 0

Вы бы рассказали что там происходит в ролике, а то не у всех есть лишние 40 минут.

Offtop 

Есть один отличный прием, о котором мало кто знает.

Если вам нужно поработать со стилем от моб. платформы на Windows (так гораздо быстрее программировать и отлаживать GUI) - можно просто открыть в текстовом редакторе style файл, найти в нем строку platform и заменить ее с напр. ANDROID на MSWINDOWS, сохранить, а затем загрузить в текущий Default стиль.

 

 

Изменено пользователем ENERGY
Kitty понравилось это

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


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

Я специально поставил на нужной отметке.

Там автор видео добавляет в ресурсы проекта (Project/Resources and images) файлы *.style. Потом вместо цикла по стилям добавляет в Combobox новые строки/объекты копипастом.

Я уже посмотрел пару таких примеров с копипастом.

Но подозреваю, что можно как-то циклом получить стили в runtime, чтобы добавить их в combobox. И это было бы правильно.

 

Вот пример:

procedure TfmSelectStyle.FormCreate(Sender: TObject);
  Function NewItem(const aText: string): TListBoxItem;
  begin
    Result := TListBoxItem.Create(comboStyles);
    Result.Parent := comboStyles;
    Result.Text := aText;
  end;

begin

  comboStyles.AddObject(NewItem('Default'));
  comboStyles.AddObject(NewItem('Copper'));
  comboStyles.AddObject(NewItem('CopperDark'));
  comboStyles.AddObject(NewItem('CoralCrystal'));
  comboStyles.AddObject(NewItem('CoralDark'));
  comboStyles.AddObject(NewItem('Diamond'));
  comboStyles.AddObject(NewItem('EmeraldCrystal'));
  comboStyles.AddObject(NewItem('EmeraldDark'));
  comboStyles.AddObject(NewItem('Jet'));
  comboStyles.AddObject(NewItem('Radiant'));
  comboStyles.AddObject(NewItem('Sterling'));
  comboStyles.AddObject(NewItem('Vapor'));

end;

 

Так выбираем

procedure TfmSelectStyle.comboStylesChange(Sender: TObject);
 var
  aTos: String;
  aStyle: TFMXObject;

 const
   ToStr: Array[TOSVersion.TPlatform] of string = ('Windows', 'MacOS', 'iOS', 'Android', 'WinRT', 'Linux');
begin
   aStyle := nil;

   //если выбираем из ресурсов
   if comboStyles.ItemIndex > 0 then
   begin

     aTos   := ToStr[TOSVersion.Platform] + comboStyles.Selected.Text;
     aStyle := TStyleStreaming.LoadFromResource(HInstance, aTos, RT_RCDATA);

     if not assigned(aStyle) then
     begin
       ShowMessage('Стиль не найден: ' + aTos);
       exit;
     end;
   end;// if comboStyles.ItemIndex > 0 then

   TStyleManager.SetStyle(aStyle);
end;

 

Вот так загружены в проект стили

 

11cf24e265f54b5498a3a5901d932d20.png

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

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


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

К тому же приходится в редакторе ресурсов прописывать Identifier тоже ручками.

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


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

Есть другая идея: загрузить все ресурсные файлы в базу sqlite и оттуда их доставать.

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


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

А вам что нужно сделать? Я так понимаю вам нужно сделать список скинов?

В коде я вижу что загружают style файлы. Понятно что нет смысла хардкодить их имена, можно положить их в спец. папку и затем просто  собирать список файлов *.style  и загружать нужный . А вот чтобы их туда поместить, - под Windows это делается просто, просто помещаете в отдельную папку, а под Android придется добавлять эти файлы в APK в Deploy, они потом при установке APK будут скопированы  автоматом. https://community.embarcadero.com/article/articles-tutorials/151-ui/927-deploying-and-accessing-local-files-on-ios-and-android

 

Добавлять файлы в SQLite - не надо. Это лишнее процессорное время, ведь все равно придется формировать файл или TStream. А если вы имеете ввиду удаленную базу, то что мешает вам загружать эти файлы напрямую GET запросом, притом каждый лучше запаковать в ZIP - они же текстовые и раза в 3 будут меньше.

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

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


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

Под винду так, под андроид эдак, под др. ось ещё как-то перетак.

А хотелось бы, чтобы было одинаково везде.

Пока вижу все это хранить в базе. Даже не в ресурсах приложения.

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


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

Ведь из базы я могу SELECT запросом выбрать нужный тип стиля: для винды или для андроида.

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


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

Создайте аккаунт или войдите для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: AliZairov
      Здравствуйте. Я хотел бы позвонить из Java для создания и .so библиотеки с Delphi. Я получаю такие сообщения об ошибках
      A/libc: Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 16883 (com.nativefmx)
       
      Оригинальный шаблон кода C.
      #include <string.h> #include <jni.h> jstring Java_com_nativefmx_Main_getName(JNIEnv* pEnv, jobject pObj) { return (*pEnv)->NewStringUTF(pEnv, "Hello NDK!"); }  
      Delphi код библиотеки.
      library fmx; uses Androidapi.Jni; function Java_com_nativefmx_Main_getName(pEnv: PJNIEnv; pObj: JNIObject): JNIString; cdecl; begin Result := (PEnv^).NewStringUTF(pEnv, MarshaledAString(Utf8Encode('Delphi Native String'))); end; exports Java_com_nativefmx_Main_getName; begin end.  
      Java код.
      package com.nativefmx; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class Main extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView tv = (TextView) findViewById(R.id.tv); tv.setText(getName()); } public native String getName(); static { System.loadLibrary("fmx"); } }  
    • Автор: AliZairov
      Привет. Я сделал macos установку web installer с Delphi Berlin.

      Программа дает .bpl ошибка открытия файла.

    • Автор: AlexG
      Есть компонент TTaskBar, отвечающий за работу приложения со своим элементом приложения на Панели Задач. Он позволяет отображать "состояние" приложения и т.д.
      Но вся загвоздка в том, что этот элемент работает только с VCL. Что касается FMX, конкретно под Windows, то таковой реализации нет, и не удается использовать этот компонент "ручками".
      Короче. Проблема в том, чтобы отображать в "панели задач" состояние FMX приложения.
      Может кто-то подскажет, в особенности наши уважаемые гуру, - что делать и как быть?
    • Автор: Рагим
      Доброго времени суток. Пишу мобильное приложение на Delphi Berlin. Добавил вибрацию при нажатии на кнопку. На Андроид 4.4.2 все работает нормально, на Андроид 6 при нажатии на кнопку приложение вылетает. Проблема точно в вибрации, так как при отсутствии вибрации все работает нормально. В качестве процедуры вибрации использую следующий код:
      procedure Vibr; //Процедура вибрации var   VibratorObj: JObject;   Vibrator: JVibrator; begin   VibratorObj := SharedActivity.getSystemService(TJActivity.JavaClass.VIBRATOR_SERVICE);   Vibrator := TJVibrator.Wrap((VibratorObj as ILocalObject).GetObjectID);   if Vibrator.hasVibrator() then     Vibrator.vibrate(200); end;  
      Как по Вашему, в чем может быть причина?
    • Автор: rakhmet

      Добавьте, пожалуйста, в список подсветки синтаксиса кода пункт Pascal/Delphi. Вроде самая необходимая на данном форуме подсветка, а её до сих пор нет 
       
      Спасибо!
    • Автор: Error
      Ссылка: https://habrahabr.ru/post/318876/
      Автор: Error
      Описание:
      Delphi и C++Builder разработчики, использующие VCL не по наслышке знают о вездесущей проблеме мерцания контролов.
      Мерцание происходит при перерисовке, вследствие того, что сначала отрисовываеться фон компонента, и только потом сам компонент.
      И если в случае с наследниками от TWinControl частичным решением проблемы является установка свойства DoubleBuffered в True, что заставляет контрол отрисовываться в буфере(однако DoubleBuffered работает тоже не идеально, к прим.: контрол перестает быть прозрачным), то в случае с TGraphicControl решение с DoubleBuffered просто невозможно, из-за отсутствия у TGraphicControl окна, установка же DoubleBuffered в True у родителя не помогает, из-за того что отрисовка вложенных TGraphicControl-ов происходит уже после прорисовки родителя в буфере.
      Обычно остается только одно — смириться с мерцанием, и максимально упростить отрисовку для минимизации эффекта, или использовать по возможности исключительно TWinControl-ы, что не всегда возможно и удобно.
      Однажды намучившись с мерцанием, я не выдержал и решил решить эту проблему, раз и навсегда!
      ...
    • Автор: rakhmet
      Заполняю в рантайме ListView:
      procedure TAddForm.ConnectClick(Sender: TObject); var LI: TListViewItem; begin with Query do begin Open; while not Eof do begin LI := ListView1.Items.Add; LI.Text := Query.FieldByName('Type').AsString; LI.Detail := Query.FieldByName('Cargo').AsString + #13#10 + Query.FieldByName('Weight').AsString; Next; end; end; end; Как видно, Detail разбивается и заполняется в две строки (оказалось, что так удобнее смотреть).
       
      Но на обеих строках сухие цифры:

       
      Поэтому хотелось бы в начало обеих строчек вставить свои иконки, чтобы в конечном итоге выглядело как-то так:

       
       
      Есть идеи, как это можно сделать? А то товарищ kramler в другой теме писал, что не видит масла стоя перед открытым холодильником - так вот я сейчас уже в таком состоянии, что начинаю забывать, где мой собственный холодильник стоит, не говоря уже о масле в нём 
      И смешно, и грустно...
    • Автор: gresaggr
      Как избежать повторных нажатий/ закликиваний на кнопку?
      Имеется следующий код:
      procedure Tfm.ButtonPrevCardClick(Sender: TObject);
      begin
        ButtonPrevCard.Enabled := false;
        Application.ProcessMessages;

       // здесь код по смене карты + пауза в 2 секунды

        ButtonPrevCard.Enabled := true;
        Application.ProcessMessages;
      end;
      Под Windows повторных нажатий/закликиваний при этом не происходит.
      А под Андроид, если пользователь быстро подряд нажал несколько раз, то сработает также несколько раз.
       
    • Автор: rakhmet
      Для FMX-приложения понадобилось разместить кнопки с битмапами в заголовке OSX-окна:

      Здесь был, это читал, но подходящего Delphi-решения найти не смог. Есть какие-нибудь идеи?
    • Автор: Error
      Ссылка: https://habrahabr.ru/post/317814/
      Автор: Пётр (Error)
      Описание:
      За годы существования фреймворк Fire-Monkey(FMX) претерпел множество изменений, и если с самого начала он был очень сырым и ненадежным, то сейчас это намного более стабильная и надежная платформа.
      Данная заметка представляет из себя сборник из нескольких полезных советов для разработчиков использующих данный фреймворк...
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу