• 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 запросом выбрать нужный тип стиля: для винды или для андроида.

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


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

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

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

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

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


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

Войти

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


Войти сейчас

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

    • Автор: Роман Фил
      Привет Всем уважаемые! 
      Пытаюсь сделать растягивание по содержимому компонента. Как это реализовано в мессенджерах типа WhatsApp если большой текст то растягивает (выделяется) по содержимому большое поле, если короткий то малое. 
        Text2.Text := Memo1.Lines.Strings[4];   text2.Height := canvas.TextHeight(Text2.Text); //по высоте строки меняется т.к. там и есть одна строка в TText просто переносится WordWrap визуально.   text2.Height:=canvas.TextWidth(text2.Text); //  - так чушь  Как это вообще реализовано кто нибудь сталкивался?

    • Автор: Роман Фил
      Привет ребят! Помогите кто знает, попытаюсь доходчиво объяснить - 
      имеется набор компонентов KernowSoftwareFMX - в нем использую TksTableView для вывода данных с Tmemo, в нем так же есть Image.
      В Tmemo с сервера грузится файл txt внутри которого строки с ссылками на изображения вида http://бла-бла/1.png
      Для загрузки использую FMX.Features.Bitmap.Helpers.pas - позволяет по прямой ссылке загружать изображение в TImage.
      что пытаюсь сделать?
      Нужно наполнять список TksTableView с Memo содержащий ссылки и в строках TksTableView - они же ListItem тоже самое что в ListView  и загружать в image каждой строки картинки по ссылкам memo.
       
      AItem.Image.Bitmap := Image4.MultiResBitmap.Bitmaps[1].LoadFromUrl(Memo1.Lines.Strings[i]); - так ругается [DCC Error] untMain.pas(92): E2010 Incompatible types: 'TBitmap' and 'procedure, untyped pointer or untyped parameter' AItem.Image.Bitmap := Image4.Bitmap.LoadFromUrl(Memo1.Lines.Strings[i]); - так тожн не работает Глюк в том что первым делом создаются строки . а потом грузятся по очереди картинки в Image4.
      Как заставить подгружать картинки в  TksTableView?
      Как ожидать хавершения загрузки каждой картинки в Image4 и после создавать AItem.Image.Bitmap?
       
       
       
    • Автор: Роман Фил
      Всем привет пытаюсь грузить файлы изображения с телефона Android на сервер методом post запроса. Для этого один из параметров запроса должен содержать полный путь к файлу. В ActionList есть стандартная опция TakePhotoFromLibraryAction - к с нее выдрать путь??? Куда он ей передается и передается ли вообще? я и справки толком не нахожу или я слепой?
       
      imgfile.Text:=TakePhotoFromLibraryAction1.????  
    • Автор: Роман Фил
      Привет ребят, созрел такой вопрос который меня мучает ! Вобщем пытаюсь загрузить картинку по прямой слыке с сервера. Картинка не грузится, не сохраняется не отображается. 
      Конечная платформа - Андроид. Пишу на Delphi xe 10 seatle.
      Что я делаю? при нажатии на сам компонент TImage (созданный динамически), должна грузится картинка по адресу преждевременно записанное в hint (TImage) при создании вида (http://блаблабла.jpg)
      Раньше код ниже работал сейчас нет не пойму что не так. Почему стал ковырять? потому что форма встает колом при загрузке изображений.
       
      var s: string; fs: TFileStream; begin fs := TFileStream.Create(tpath.Combine(tpath.GetDownloadsPath, 'load.jpg'), fmCreate); NetHTTPClient1.Get((Sender as TImage).Hint, fs); fs.Free; (Sender as TImage).MultiResBitmap.Bitmaps[1].LoadFromFile (tpath.Combine(tpath.GetDownloadsPath, 'load.jpg')); подключал еще pas нашел на этом форуме FMX.Features.Bitmap.Helpers.pas
      (Sender as TImage).MultiResBitmap.Bitmaps[1].LoadFromUrl ((Sender as TImage).Hint); как проще сделать посоветуете чтоб и грузилось и форма не висла?
    • Автор: Rionn
      В этой ссылке показан пример работы в одной сети (написано курсивом). Не могу найти, чтобы PC работал по сети или по WiFi, а телефон по мобильным данным. Не подскажете?
    • Автор: dim
      сейчас модно показывать аватарки круглыми, можно ли на XE10 у timage это сделать?
      не могу вспомнить, но вроде где-то  наталкивался, что толи настройками, толи стилями это делается легко
    • Автор: Роман Фил
      ПРивет, есть ли возможность узнать как то номер сроки в memo на delphi FMX в memo при нажатии на текст в поле memo?

      для windows на vlc можно memo.CaretPos.Y либо через WinAPi заголовки. Как такое делать в FireMonkey FMX для андроид ума не приложу. Может кто делал, поделится опытом?
    • Автор: Роман Фил
      Привет ребята! Вобщем есть текст в Memo с которого нужно брать строки с конца файла т.е. memo.lines.count-1 в цикле, 
      после этого создавая отельно динамически компоненты,  заносить текстовые  строки с memo в эти созданные динамически компоненты, ниже пример:
      procedure TVKBaseForm.Button2Click(Sender: TObject); var rec: TRectangle; txt: Ttext; i: word; // - можно и integer сути не поменяет begin for i := Memo1.Lines.Count - 1 downto 0 do begin rec := TRectangle.Create(Self); rec.Parent := MainLayout1; rec.Height := 15; rec.Align := TAlignLayout.Top; txt := Ttext.Create(Self); txt.Parent := rec; txt.Align := TAlignLayout.Client; txt.Text := Memo1.Lines.Strings[i]; end; end; Работает, но не правильно. Почему выдает не правильный порядок при выводе? почему создает сначала первый файл? Почему создает не все? Может есть какая-то синхронизация? 
      Пробовал так же
      A: integer; begin A := 1; // Присваеваем единицу While A <> Memo1.Lines.Count - 1 do begin A := A + 1; s := Memo1.Lines.Strings[A]; Application.ProcessMessages; rec := TRectangle.Create(Self); rec.Parent := MainLayout1; rec.Height := 15; rec.Align := TAlignLayout.Top; txt := Ttext.Create(Self); txt.Parent := rec; txt.Align := TAlignLayout.Client; txt.Text := s; Помогите разобраться
    • Автор: Роман Фил
      Доброе время суток .
      Я только начал знакомится с потоками , не судите меня строго .
      Вот код . Смысл которого через отдельный поток загружать текст с сервера и отображать в memo. Что я делаю? На сервере из вне имеется файлкоторый по api запросам пополняется. Его нужно в потоке постоянно выводить в memo. подгружать каждый раз. При использовании на win вес работает, на андроид не качает и не сздает файл в чем может быть проблема?
      type ThreadHTTP = class(TThread) private public Stream: TMemoryStream; i: integer; procedure Execute; override; procedure ShowResult; end; {$R *.fmx} procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled := true; end; procedure TForm1.Timer1Timer(Sender: TObject); var MyHTTP: ThreadHTTP; begin ProgressBar1.Value := 0; MyHTTP := ThreadHTTP.Create(False); end; { ThreadHTTP } procedure ThreadHTTP.Execute; var j: integer; begin inherited; i := 0; j := 0; Stream := TMemoryStream.Create; Form1.IdHTTP1.Get('http://сайт/base.txt', Stream); Form1.ProgressBar1.Max := Stream.Size; while j <= Stream.Size do begin inc(i); Synchronize(ShowResult); inc(j); Form1.ProgressBar1.Value := Form1.ProgressBar1.Value + 1; end; Stream.SaveToFile(tpath.getdownloadspath + '/base.txt'); Form1.Memo1.Lines.LoadFromFile(tpath.getdownloadspath + '/base.txt'); Stream.Free; end; procedure ThreadHTTP.ShowResult; begin Form1.Label1.Text := IntToStr(i) + ' kbs'; end;  
    • Автор: Sashar333
      Здравствуйте!
      Есть замечательная русская программа ТЕХТРАН: http://www.tehtran.com/nestf.html
      Мне нужен максимум такой же - минимум что предложите алгоритм (раскладки деталей на листе) работы в DELPHI что бы я его мог сам в дальнейшем исправлять и доделывать
      ТРЕБУЕТСЯ ТОЛЬКО АЛГОРИТМ ЗАПОЛНЕНИЯ ПРЯМОУГОЛЬНИК ОПРЕДЕЛЕННЫМИ КОНТУРАМИ, вся программа ТЕХТРАН у меня уже есть.
      Будут входные данные:
      Минимум это простейшие фигуры:размеры прямоугольников и окружностей - максимум это фигуры сложной формы в формате DXF(AutoCad) и их количества(примерно безгранично) для каждой фигуры будут параметры: Размеры(для простейших это толщина,ширина и длина; для DXF это толщина и файл DXF) - все в миллиметрах Кол-во (шт) Размер листа прямоугольный(пример: 10х1500х6000мм, 5х2000х3000мм, 100х100х3000мм) и их кол-во, скажет так первое значение  это толщина, второе - ширина, третье - длинна. Разрешенные расстояния между фигурами и от края листа до фигур - все в миллиметрах Кол-во данных должно быть примерно безгранично
      На выходе надо получить требуемое-подходящее минимальное кол-во листов для всех фигур!
      Ну и соответственно визуализировать результат например на TImage

      Это не полное техзадание, но сколько примерно это будет стоить?
      Хотелось бы использовать это модуль на всех платформах, но как минимум это Windows.
      Заранее спасибо!
       
  • Сейчас на странице   0 пользователей

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