Delphi XE2 и VCL стилове
Продължаваме, макар и бавно, но сигурно, да разглеждаме новостите, които ни представи новата версия на RAD Studio - XE2. И днес ще разгледаме друга иновация - VCL стилове, с които можете да организирате поддръжка за кожи във вашата програма. Преди пускането на Delphi XE2 можехме да използваме стилове по два начина: или да напишем собствен двигател за поддръжка на кожи (дълги, скъпи), или да използваме готови компоненти и библиотеки, като библиотеката AlphaControls и поддръжка на кожи без много време. С пускането на Delphi XE2 необходимостта от компоненти на трети страни може да изчезне от само себе си. Сега няма да кажа нещо като "VCL Styles ще фалира разработчиците на AlphaControls" и т.н. - тук времето ще постави всичко на мястото си и мисля, че ще има достатъчно място под слънцето за всички. Днес просто ще разгледам колкото се може повече от опциите за скиниране в Delphi, които можем да използваме, след като започнем да работим с Delphi XE2. Активиране на поддръжка на стил в проект на Delphi
За да активирате стилова поддръжка във вашия Delphi проект, трябва да отидете в настройките на проекта:
Проект -> Опции -> Приложение -> Външен вид
И изберете стиловете, които искате да използвате за работа:
След като са избрани необходимите стилове, те могат да се използват в програмата, а също така можете да изберете стила, който ще се използва в програмата по подразбиране. Тук читателите, които ценят размера на своите програми, могат веднага да зададат въпрос: колко ще се увеличи размерът на EXE файла, когато се включат стилове?
Да проверим. Създайте празен Delphi проект, в Project Manager изберете Build Configuration -> Освободете и изградете проекта.
В резултат на това получаваме размера на EXE файла, равен на 1596 416 байта.
Сега влизаме в настройките, включваме всички стилове и изграждаме проекта отново.
С включени всички стилове (13 броя) получаваме размера на EXE файла, равен на 2 602 496 байта.
Тоест получихме увеличение на размера с около 40%. Много? Може би, но можете да отидете по друг начин и да използвате стиловете, без да променяте размера на EXE файла. За да направим това, трябва да разберем малко за това как се зареждат стилове в Delphi XE2 и да проучим работата на класа TStyleManager. Клас TStyleManager
Класът TStyleManager се намира в модула Vcl.Themes и е запечатан клас ("sealed"), т.е. това означава, че не можете да създадете наследник от този клас и кода на формата:
тип TMyManager = class(TStyleManager) частен публичен край;
Извежда изключение при компилиране: "[DCC грешка]. E2353 Не може да се разшири запечатан клас 'TStyleManager'". Но за работа със стилове ще бъде достатъчен запечатан клас. Класът TStyleManager съдържа редица свойства и методи на класа, които можете да използвате за управление на стилове във вашето приложение. Помислете за основните характеристики на класа, които ще ни бъдат полезни в бъдеще за работа.
Методи на клас TStyleManager
функция на класа IsValidStyle(const FileName: string): Boolean; претоварване; функция на класа IsValidStyle(const FileName: string; var StyleInfo: TStyleInfo): Boolean; претоварване;
Методът връща True, ако файлът, указан в параметъра FileName, е лист със стилове. В този случай претовареният метод IsValidStyle може да върне информация за стил във втория параметър, който е запис на формуляра:
След като файлът бъде проверен, той може да бъде качен в мениджъра. За това се използва следният метод: class function LoadFromFile(const FileName: string):TStyleServicesHandle;
Методът LoadFromFile стилизира от файл и го регистрира в мениджъра.
Ако стиловете се съхраняват в ресурсите на проекта, тогава можете да използвате следните два метода за зареждане на стилове:
клас функция LoadFromResource(Екземпляр: HINST; const ResourceName: низ): TStyleServicesHandle; претоварване; функция на класа LoadFromResource(Екземпляр: HINST; const ResourceName: низ; ResourceType: PChar): TStyleServicesHandle; претоварване; функция на класа TryLoadFromResource(Екземпляр: HINST; const ResourceName: низ; ResourceType: PChar; var Handle: TStyleServicesHandle): Boolean;
Последният метод ще върне True, ако стилът е успешно зареден от ресурси.
След като стиловете се заредят, те трябва да бъдат приложени във вашето приложение. За това се използват следните два метода:
функция на класа TrySetStyle(const Име: низ; ShowErrorDialog: Boolean = True): Boolean; класна процедура SetStyle(Style: TCustomStyleServices); претоварване; класна процедура SetStyle(Handle: TStyleServicesHandle); претоварване;
Методът TrySetStyle се опитва да зададе стила с име Name в приложението и ако стилът е приложен успешно, методът връща True. Вторият параметър на метода (ShowErrorDialog) указва дали да се покаже съобщение за грешка, ако стиловото приложение е неуспешно. За да разберете какъв стил се използва в момента, какви стилове са налични и т.н. трябва да използвате свойствата на класа.
Свойства на класа TStyleManager
свойство на класа ActiveStyle: TCustomStyleServices чете GetActiveStyle;
Свойството връща текущия използван стил. class property Enabled: Boolean read GetEnabled;
Връща True, ако стиловете са активирани в приложениетостил. свойство на клас IsCustomStyleActive: Boolean read GetIsCustomStyleActive;
Връща True, ако се използва стил, различен от стандартния (т.е. НЕ Windows стил) class property Style[const Name: string]: TCustomStyleServices чете GetStyle;
Връща стилов обект по неговото име. свойство на класа StyleNames: TArray чете GetStyleNames;
Връща масив от регистрирани имена на стилове. свойство на клас SystemStyle: TCustomStyleServices чете GetSystemStyle;
Връща системния стил, т.е. Windows стил.
Има други методи и свойства на класа TStyleManager, които също могат да бъдат полезни при работа с VCL стилове, но ние няма да ги разглеждаме днес, а ще преминем към практическата част на статията и ще напишем малко приложение за работа със стилове във вашите приложения. Използване на стилове във вашите приложения
Първо, нека използваме най-простия начин за използване на стилове, т.е. активирайте ги незабавно в настройките на проекта.
Създаваме нов проект, отиваме на опциите и активираме всички стилове, както е показано в началото на статията. Сега нека изброим всички стилове и да напишем името им, например, в ComboBox. За да направим това, имаме нужда от свойството TStyleManager.StyleNames:
procedure TForm5.FormCreate(Sender: TObject); var i: integer; begin for i := 0 to Length(TStyleManager.StyleNames)-1 do cbRegistredStyles.Items.Add(TStyleManager.StyleNames[i]); cbRegistredStyles.ItemIndex:=0; край;
Тъй като във всеки случай поне един стил (Windows) ще бъде регистриран за приложението, в края на метода избрах първия стил от списъка. Сега нека направим следното: когато избираме следващия стил, ще се опитаме да приложим този стил в приложението:
процедура TForm5.cbRegistredStylesChange(Подател:TObject); begin TStyleManager.TrySetStyle(cbRegistredStyles.Items[cbRegistredStyles.ItemIndex], false); end;
Това всъщност е най-лесният начин да използвате стилове във вашето приложение. Но, както казах по-рано, този подход ще увеличи размера на вашия проект с около 40%. Сега нека използваме друг метод - зареждане на стил от файл. Ще направим следното: когато избираме файл със стил, ще го проверим за валидност и ще покажем цялата налична информация за него, след което ще въведем името на стила в нашия ComboBox и ще го приложим, когато бъде избран в списъка.
Първо се връщаме към настройките на проекта и изключваме всички предварително избрани стилове, за да не се натъкнем на изключения като „Този стил вече е регистриран“. Би било възможно да проверите уникалността на името, като използвате същото свойство StyleNames, но няма да се повтаряме - например можете просто да се защитите, като изключите стиловете в настройките на проекта.
Добавете следните компоненти към формуляра:
- TButtonedEdit
- TOpenDialog
- и няколко TLabels за показване на информация за стила.
Получих следната форма:
Къде мога да получа файлове с VCL стилове? Всички налични стилове в Delphi XE2 се намират в директорията:
c:\Program Files\Embarcadero\RAD Studio\9.0\Redist\styles\vcl\.
и имат разширение *.vsf. Така например можете да използвате тези файлове. Пишем манипулатор за отваряне на файл със стил:
procedure TForm5.ButtonedEdit1RightButtonClick(Sender: TObject); var si: TStyleInfo; begin if OpenDialog1.Execute then if TStyleManager.IsValidStyle(OpenDialog1.FileName,si) then begin ButtonedEdit1.Text:=OpenDialog1. Име на файл; label8.Caption:=si.Name; label9.Caption:=si.Author; label10.Caption:=si.AuthorEMail; label11.Caption:=si.AuthorURL; label12.Caption:=si.Version; ако TStyleManager.Style[si.Name]=nil тогава започнете TStyleManager.LoadFromFile(OpenDialog1.FileName); cbRegistredStyles.Items.Add(si.Name); край; end else ShowMessage('Този файл не съдържа визуални стилове'); end;
Тук първо показваме информация за избрания файл със стила, а след това, ако стилът със същото име все още не е регистриран, го регистрираме в мениджъра и го добавяме към списъка.
използва . IOUtils; [. ] var FileArray:TStringDynArray; begin FileArray:=TDirectory.GetFiles(Dir,'*.vsf'); за I := 0 до Length(FileArray)-1 направете ако TStyleManager.IsValidStyle(FileArray[i]) след това FFiles.Add(FileArray[i]); end;
Друг начин за работа със стилове е да ги съхранявате и зареждате от ресурси. По принцип този метод по отношение на изпълнението не се различава много от зареждането от файл, така че няма да се фокусираме върху него. Мога само да кажа, че за зареждане на стил от файл е по-добре да използвате метода TryLoadFromResource, така че ако възникнат изключения, можете да се справите сами с тях.
Да преминем към следващите два въпроса: Откъде мога да взема файлове с готови стилове? и Как да създадете свой собствен уникален стил?
Редактиране на стил. Създавайте персонализирани стилове за приложения, използващи VCL.
Инструменти-> VCL Style Designer