Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.06.2013, 10:42
Аватар для AlexandrV
AlexandrV AlexandrV вне форума
Начинающий
 
Регистрация: 10.02.2013
Сообщения: 197
Версия Delphi: XE3
Репутация: -624
По умолчанию Стили в XE3 Delphi VCL

В XE3 Delphi FMX менять стили легко. для этого там есть компонент.

а как программно менять стили в VCL . Короче как программно управлять стилями в XE3 Delphi VCL именно программно. Конечно можно заранее подключить все стили а потом их переключать но я люблю делать загрузкой так что их надо загружать и активировать программно. Скажите как.
Ответить с цитированием
  #2  
Старый 19.06.2013, 11:53
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Только начал изучать FireMonkey. Насколько я понял, стили это особенность программирования в этой библиотеке (она не совместима с VCL). На VCL можете использовать темы Windows, но советую полностью перейти на FM, т.к. 1) возможности стилей больше, чем у тем Windows, 2) в FM много эффектов и анимаций, легко совмещаются 2D и 3D, 3) можно сделать приложения не для Windows.
Ответить с цитированием
  #3  
Старый 19.06.2013, 12:10
Аватар для AlexandrV
AlexandrV AlexandrV вне форума
Начинающий
 
Регистрация: 10.02.2013
Сообщения: 197
Версия Delphi: XE3
Репутация: -624
По умолчанию

Цитата:
Сообщение от AlexSku
Только начал изучать FireMonkey. Насколько я понял, стили это особенность программирования в этой библиотеке (она не совместима с VCL). На VCL можете использовать темы Windows, но советую полностью перейти на FM, т.к. 1) возможности стилей больше, чем у тем Windows, 2) в FM много эффектов и анимаций, легко совмещаются 2D и 3D, 3) можно сделать приложения не для Windows.

Совместима раз можно в опциях выбрать стиль для VCL то можно и программно. в опциях они выбираются в Application-->appearance

перешел бы но проект с нуля писать ужас. я и так его уже 4 месяца пишу.
Также есть там мину в FMX
не возможно иконку программно загрузить. еще пару 10сяток недостатков. так как FMX отличается от VCL да и притом книг по нему мало то не могу

Последний раз редактировалось AlexandrV, 19.06.2013 в 12:14.
Ответить с цитированием
  #4  
Старый 20.06.2013, 04:42
Аватар для AlexandrV
AlexandrV AlexandrV вне форума
Начинающий
 
Регистрация: 10.02.2013
Сообщения: 197
Версия Delphi: XE3
Репутация: -624
По умолчанию

Может кто скажет как прграмно управлять стилями в VCL
Ответить с цитированием
  #5  
Старый 20.06.2013, 08:42
Аватар для AlexandrV
AlexandrV AlexandrV вне форума
Начинающий
 
Регистрация: 10.02.2013
Сообщения: 197
Версия Delphi: XE3
Репутация: -624
По умолчанию

Делал по этому коду но он мне стиль не грузит
Код:
procedure TForm5.ButtonedEdit1RightButtonClick(Sender: TObject);
var si: TStyleInfo;
begin
  if OpenDialog1.Execute then
    if TStyleManager.IsValidStyle(OpenDialog1.FileName,si) then
      begin
        ButtonedEdit1.Text:=OpenDialog1.FileName;
        {выводим информацию}
        label8.Caption:=si.Name;
        label9.Caption:=si.Author;
        label10.Caption:=si.AuthorEMail;
        label11.Caption:=si.AuthorURL;
        label12.Caption:=si.Version;
        {грузим стиль}
        if TStyleManager.Style[si.Name]=nil then
          begin
            TStyleManager.LoadFromFile(OpenDialog1.FileName);
          {заносим имя стиля в список}
            cbRegistredStyles.Items.Add(si.Name);
          end;
      end
    else
      ShowMessage('Этот файл не содержит стилей оформления');
end;

но почему стиль не выбирается

Последний раз редактировалось Admin, 20.06.2013 в 19:49.
Ответить с цитированием
  #6  
Старый 20.06.2013, 08:55
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Используйте методы класса TStyleManager, конкретно
Код:
IsValidStyle(const FileName: string): boolean
этот просто для проверки валидности файла стилей, т.е. является ли файл из FileName стилем.

или
Код:
IsValidStyle(const FileName: string; var StyleInfo: TStyleInfo): boolean
более продвинутый вариант, не только проверяющий, но и возвращающий в StyleInfo основную информацию об этом файле
Код:
TStyleInfo = record
    Name: string;//наименование
    Author: string; //автор стиля
    AuthorEMail: string; //его email
    AuthorURL: string; //адрес сайта
    Version: string; //версия файла
  end;
Если файл успешно проверен то его можно загрузить и зарегистрировать в менеджере с помощью функции
Код:
LoadFromFile(const FileName: string): TStyleServicesHandle
Если стили хранятся в ресурсах проекта, т.е выбраны явно в менеджере ещё до сборки, то можно делать так
Код:
LoadFromResource(Instance: HINST; const ResourceName: string): TStyleServicesHandle

LoadFromResource(Instance: HINST; const ResourceName: string; ResourceType: PChar): TStyleServicesHandle

TryLoadFromResource(Instance: HINST; const ResourceName: string; ResourceType: PChar; var Handle: TStyleServicesHandle): Boolean
Последняя функция вернет True, если стиль успешно загружен из ресурсов.

После загрузки стили необходимо применить
Код:
TrySetStyle(const Name: string; ShowErrorDialog: Boolean): Boolean
где устанавливается стиль с именем Name, при успешном выполнении метод возвращает True. ShowErrorDialog указывает выводить ли сообщение об ошибке при неудаче, по умолчанию, true.

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

ActiveStyle возвращает используемый в настоящее время стиль в оформлении.
IsCustomStyleActive возвращает True в случае, если используется стиль отличный от стиля Windows
Style возвращает объект стиля по его имени.
StyleNames возвращает список названий зарегистрированных стилей.
SystemStyle возвращает системный стиль, т.е. стиль Windows.

На семёрке это не действует, (нету стилей в D7 окромя AlphaControls:-) поэтому проверить нет возможности, но вроде источник надёжный, скопипащенному верить.
Ответить с цитированием
  #7  
Старый 20.06.2013, 09:05
Аватар для AlexandrV
AlexandrV AlexandrV вне форума
Начинающий
 
Регистрация: 10.02.2013
Сообщения: 197
Версия Delphi: XE3
Репутация: -624
По умолчанию

Можешь написать загрузку и регистрацию используя путь к стили
Ответить с цитированием
  #8  
Старый 20.06.2013, 09:12
Аватар для AlexandrV
AlexandrV AlexandrV вне форума
Начинающий
 
Регистрация: 10.02.2013
Сообщения: 197
Версия Delphi: XE3
Репутация: -624
По умолчанию

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, Vcl.Buttons,
  Vcl.ExtCtrls,IniFiles,Vcl.Themes,unit2;

type
  TForm1 = class(TForm)
    Image1: TImage;
    BitBtn1: TBitBtn;
    RichEdit1: TRichEdit;
    ComboBox1: TComboBox;
    ListBox1: TListBox;
    procedure ComboBoxEx1Change(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
Type
TStyleIniVCL=Record
  PathStyleName:String;
  NameStyle,TextStyle:String;
  BmpPathNameStyle:String;
End;
Procedure LoadIniStyleData;
Function LoadStyleReadIni(TextOkno:String;TextButton1:String;TextMemo:String):Boolean;
var
  Form1: TForm1;
  STL:Array[1..9] of String;
  StyleIniVCL:Array of TStyleIniVCL;
  Strsi:String;
  StyleManager:TStyleManager;
implementation
uses un2;
{$R *.dfm}

Procedure LoadIniStyleData;
var tyhjk:Integer;
begin
  IniStyleData:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'LibxEditFiles\Style\cfgStyle.StyleData');
  SetLength(StyleIniVCL,IniStyleData.ReadInteger('Style','MaxStyle',8));
  for tyhjk := 0 to IniStyleData.ReadInteger('Style','MaxStyle',8) do
  begin
    Form1.ComboBox1.Items.Add(IniStyleData.ReadString('Style','Text'+inttostr(tyhjk),''));
    StyleIniVCL[tyhjk].PathStyleName:=ExtractFilePath(Application.ExeName)+IniStyleData.ReadString('Style','StylePath'+inttostr(tyhjk),'');
    StyleIniVCL[tyhjk].NameStyle:=IniStyleData.ReadString('Style','Name'+inttostr(tyhjk),'');
    StyleIniVCL[tyhjk].TextStyle:=IniStyleData.ReadString('Style','Text'+inttostr(tyhjk),'');
    StyleIniVCL[tyhjk].BmpPathNameStyle:=ExtractFilePath(Application.ExeName)+IniStyleData.ReadString('Style','BmpStyle'+inttostr(tyhjk),'');
  end;
  IniStyleData.Free;
  Lang:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'LibxEditFiles\Lang\'+Language+'.data');
  for tyhjk := 1 to 9 do begin
    STL[tyhjk]:=Lang.ReadString('Текст-->Style','STL'+Inttostr(tyhjk),'');
  end;
  StyleDLG3:=Lang.ReadString('Текст-->Dialog','StyleDLG3','');
  Lang.Free;
end;

Function LoadStyleReadIni(TextOkno:String;TextButton1:String;TextMemo:String):Boolean;
begin
  LoadIniStyleData;
  Form2.ImageList1.GetBitmap(6,Form1.BitBtn1.Glyph);
  Form1.Caption:=TextOkno;
  Form1.RichEdit1.Lines.Text:=TextMemo;
  Form1.BitBtn1.Caption:=TextButton1;
  Form1.BitBtn1.ModalResult:=mrOk;
  Result:=Form1.ShowModal=mrOk;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Form1.Close;
  StyleManager.TrySetStyle(form1.ListBox1.Items.Strings[Form1.ListBox1.ItemIndex],True);
  StyleManager.Free;
end;

procedure TForm1.ComboBoxEx1Change(Sender: TObject);
var si : TStyleInfo;
i:Integer;
begin
  StyleManager:=TStyleManager.Create;
  if StyleManager.IsValidStyle(StyleIniVCL[Form1.ComboBox1.ItemIndex].PathStyleName,si) then
  begin
    Form1.RichEdit1.Clear;
    AddColorText(STL[1]+' ',ClBlue,Form1.RichEdit1);
    AddColorText(si.Name,clPurple,Form1.RichEdit1);
    Form1.RichEdit1.Lines.Add('');
    AddColorText(STL[2]+' ',ClBlue,Form1.RichEdit1);
    AddColorText(StyleIniVCL[Form1.ComboBox1.ItemIndex].NameStyle,clPurple,Form1.RichEdit1);
    Form1.RichEdit1.Lines.Add('');
    AddColorText(STL[3]+' ',ClBlue,Form1.RichEdit1);
    AddColorText(StyleIniVCL[Form1.ComboBox1.ItemIndex].PathStyleName,clPurple,Form1.RichEdit1);
    Form1.RichEdit1.Lines.Add('');
    AddColorText(STL[4]+' ',ClBlue,Form1.RichEdit1);
    AddColorText(StyleIniVCL[Form1.ComboBox1.ItemIndex].BmpPathNameStyle,clPurple,Form1.RichEdit1);
    Form1.RichEdit1.Lines.Add('');
    AddColorText(STL[5]+' ',ClBlue,Form1.RichEdit1);
    AddColorText(si.Author,clPurple,Form1.RichEdit1);
    Form1.RichEdit1.Lines.Add('');
    AddColorText(STL[6]+' ',ClBlue,Form1.RichEdit1);
    AddColorText(si.AuthorEMail,clPurple,Form1.RichEdit1);
    Form1.RichEdit1.Lines.Add('');
    AddColorText(STL[7]+' ',ClBlue,Form1.RichEdit1);
    AddColorText(si.AuthorURL,clPurple,Form1.RichEdit1);
    Form1.RichEdit1.Lines.Add('');
    AddColorText(STL[8]+' ',ClBlue,Form1.RichEdit1);
    AddColorText(si.Version,clPurple,Form1.RichEdit1);
    Form1.RichEdit1.Lines.Add('');
    AddColorText(STL[4]+' ',ClBlue,Form1.RichEdit1);
    AddColorText(StyleIniVCL[Form1.ComboBox1.ItemIndex].TextStyle,clPurple,Form1.RichEdit1);
    Form1.RichEdit1.Lines.Add('');
    Form1.Image1.Picture.LoadFromFile(StyleIniVCL[Form1.ComboBox1.ItemIndex].BmpPathNameStyle);
    if StyleManager.Style[si.Name]=nil then
    begin
      StyleManager.LoadFromFile(StyleIniVCL[Form1.ComboBox1.ItemIndex].PathStyleName);
      ListBox1.Items.Clear;
      for i := 0 to Length(StyleManager.StyleNames)-1 do begin
        ListBox1.Items.Add(StyleManager.StyleNames[i]);
      end;
    end;
  end else begin
    ShowMessage(StyleDLG3);
  end;
end;

end.

при первом открытии окна нет ошибок но при втором открытии окна системная ошибка. скажте почему и как исправить

Последний раз редактировалось AlexandrV, 20.06.2013 в 10:18.
Ответить с цитированием
  #9  
Старый 20.06.2013, 10:34
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вот эту строчку
Код:
StyleManager:=TStyleManager.Create;
нужно переместить в OnCreate формы, а в OnDestroy желательно добавить это
Код:
StyleManager.Free{.Destroy};

З.Ы. Или может сделать так

Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  StyleManager.TrySetStyle(form1.ListBox1.Items.Strings[Form1.ListBox1.ItemIndex],True);
  StyleManager.Free;

  Form1.Close;
end;

Последний раз редактировалось Alegun, 20.06.2013 в 10:42.
Ответить с цитированием
  #10  
Старый 20.06.2013, 10:36
Аватар для AlexandrV
AlexandrV AlexandrV вне форума
Начинающий
 
Регистрация: 10.02.2013
Сообщения: 197
Версия Delphi: XE3
Репутация: -624
По умолчанию

Это у меня модальная форма а форма 2 является главной долго объяснять почему так вышло
Ответить с цитированием
  #11  
Старый 20.06.2013, 10:41
Аватар для AlexandrV
AlexandrV AlexandrV вне форума
Начинающий
 
Регистрация: 10.02.2013
Сообщения: 197
Версия Delphi: XE3
Репутация: -624
По умолчанию

Нет все равно при втором открытие системная ошибка а при закрытии программы такая вот системная ошибка

http://www.delphisources.ru/forum/at...d=137171043 3

Код:
Function LoadStyleReadIni(TextOkno:String;TextButton1:String;TextMemo:String):Boolean;
begin
  LoadIniStyleData;
  Form2.ImageList1.GetBitmap(6,Form1.BitBtn1.Glyph);
  Form1.Caption:=TextOkno;
  Form1.RichEdit1.Lines.Text:=TextMemo;
  Form1.BitBtn1.Caption:=TextButton1;
  Form1.BitBtn1.ModalResult:=mrOk;
  Result:=Form1.ShowModal=mrOk;
end;

Кажется в этом коде ошибка

Он вызывает модальную форму но после применения стиля выходит ошибка записи вот на это он начинает ругацца

Код:
Form2.ImageList1.GetBitmap(6,Form1.BitBtn1.Glyph);
  Form1.Caption:=TextOkno;
  Form1.RichEdit1.Lines.Text:=TextMemo;
  Form1.BitBtn1.Caption:=TextButton1;
  Form1.BitBtn1.ModalResult:=mrOk;
  Result:=Form1.ShowModal=mrOk;
Изображения
Тип файла: jpg 5.jpg (20.0 Кбайт, 9 просмотров)

Последний раз редактировалось AlexandrV, 20.06.2013 в 10:49.
Ответить с цитированием
  #12  
Старый 20.06.2013, 17:14
Аватар для AlexandrV
AlexandrV AlexandrV вне форума
Начинающий
 
Регистрация: 10.02.2013
Сообщения: 197
Версия Delphi: XE3
Репутация: -624
По умолчанию

Может кто подскажет компонент для работы со стилями а если нету сделаете.

В Fmx такой прекрасный компонент нет в Vcl почему та не сделали.

Пожалуйста сделайте компонент для работы со стилями для XE3 Delphi Vcl по аналогии как это сделано в FMX.
Ответить с цитированием
  #13  
Старый 25.06.2013, 10:48
Аватар для AlexandrV
AlexandrV AlexandrV вне форума
Начинающий
 
Регистрация: 10.02.2013
Сообщения: 197
Версия Delphi: XE3
Репутация: -624
По умолчанию

Пожалуйста. Напишите код применения стиля при создании формы используя файл. Очень нужно
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:09.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025