![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
В XE3 Delphi FMX менять стили легко. для этого там есть компонент.
а как программно менять стили в VCL . Короче как программно управлять стилями в XE3 Delphi VCL именно программно. Конечно можно заранее подключить все стили а потом их переключать но я люблю делать загрузкой так что их надо загружать и активировать программно. Скажите как. |
|
#2
|
|||
|
|||
|
Только начал изучать FireMonkey. Насколько я понял, стили это особенность программирования в этой библиотеке (она не совместима с VCL). На VCL можете использовать темы Windows, но советую полностью перейти на FM, т.к. 1) возможности стилей больше, чем у тем Windows, 2) в FM много эффектов и анимаций, легко совмещаются 2D и 3D, 3) можно сделать приложения не для Windows.
|
|
#3
|
||||
|
||||
|
Цитата:
Совместима раз можно в опциях выбрать стиль для VCL то можно и программно. в опциях они выбираются в Application-->appearance перешел бы но проект с нуля писать ужас. я и так его уже 4 месяца пишу. Также есть там мину в FMX не возможно иконку программно загрузить. еще пару 10сяток недостатков. так как FMX отличается от VCL да и притом книг по нему мало то не могу Последний раз редактировалось AlexandrV, 19.06.2013 в 12:14. |
|
#4
|
||||
|
||||
|
Может кто скажет как прграмно управлять стилями в VCL
|
|
#5
|
||||
|
||||
|
Делал по этому коду но он мне стиль не грузит
Код:
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
|
||||
|
||||
|
Используйте методы класса TStyleManager, конкретно
Код:
IsValidStyle(const FileName: string): boolean или Код:
IsValidStyle(const FileName: string; var StyleInfo: TStyleInfo): boolean Код:
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 После загрузки стили необходимо применить Код:
TrySetStyle(const Name: string; ShowErrorDialog: Boolean): Boolean А чтобы узнать какой стиль сейчас используется, или какие стили доступны можно воспользоваться свойствами класса ActiveStyle возвращает используемый в настоящее время стиль в оформлении. IsCustomStyleActive возвращает True в случае, если используется стиль отличный от стиля Windows Style возвращает объект стиля по его имени. StyleNames возвращает список названий зарегистрированных стилей. SystemStyle возвращает системный стиль, т.е. стиль Windows. На семёрке это не действует, (нету стилей в D7 окромя AlphaControls:-) поэтому проверить нет возможности, но вроде источник надёжный, скопипащенному верить. |
|
#7
|
||||
|
||||
|
Можешь написать загрузку и регистрацию используя путь к стили
|
|
#8
|
||||
|
||||
|
Код:
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
|
||||
|
||||
|
Вот эту строчку
Код:
StyleManager:=TStyleManager.Create; Код:
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
|
||||
|
||||
|
Это у меня модальная форма а форма 2 является главной долго объяснять почему так вышло
|
|
#11
|
||||
|
||||
|
Нет все равно при втором открытие системная ошибка а при закрытии программы такая вот системная ошибка
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; Последний раз редактировалось AlexandrV, 20.06.2013 в 10:49. |
|
#12
|
||||
|
||||
|
Может кто подскажет компонент для работы со стилями а если нету сделаете.
В Fmx такой прекрасный компонент нет в Vcl почему та не сделали. Пожалуйста сделайте компонент для работы со стилями для XE3 Delphi Vcl по аналогии как это сделано в FMX. |
|
#13
|
||||
|
||||
|
Пожалуйста. Напишите код применения стиля при создании формы используя файл. Очень нужно
|