Механизм выбора стиля в приложениях, созданных в My Visual Database, напоминает покупку кота в мешке: до перезагрузки невозможно представить, как будет выглядеть программа с выбранным стилем. Несколько строчек кода помогут нам решить данную проблему.

Решение

К сожалению, визуализировать стиль программным способом не получится, но можно заранее приготовить изображения, на которых будут видны ключевые элементы интерфейса с применением выбранного стиля и отображать их синхронно со списком стилей.

Разместить картинки можно в той же папке, что и файлы стилей, с именами, совпадающими с названиями самих стилей. Также нужно добавить ещё одну картинку, на которой будет изображена программа без применения стиля (по умолчанию).

Внешний вид программы с применением стиля RubyGraphite

Скрипты

const STYLE_VIEWRE_FORM = 'frmStyleViewer'; procedure Style_StyleViewer; // отображение формы просмотра и выбора стиля var tmpForm: TForm; tmpList: TListBox; tmpImage: TImage; tmpPanel: TPanel; tmpButton: TdbButton; i: integer; begin tmpForm := GetFormByName(STYLE_VIEWRE_FORM); if tmpForm = nil then begin tmpForm := TForm.Create(Application); with tmpForm do begin Name := STYLE_VIEWRE_FORM; Caption := R('STYLE_VIEWRE_FORM_CAPTION',STYLE_VIEWRE_FORM_CAPTION); Width := STYLE_VIEWRE_FORM_WIDTH; Height := STYLE_VIEWRE_FORM_HEIGHT; Position := poScreenCenter; Scaled := False; BorderStyle := bsSingle; BorderIcons := biSystemMenu; onShow := 'Style_StyleViewer_OnShow'; end; // нижняя часть формы tmpPanel := TPanel.Create(tmpForm); with tmpPanel do begin Parent := tmpForm; Color := clGray; Height := 44; BorderWidth := 0; Align := alBottom; end; tmpButton := TdbButton.Create(tmpForm); AssignEvents(tmpButton); with tmpButton do begin Parent := tmpPanel; Name := 'btnCancel'; Font.Name := 'Segoe UI'; Font.Size := 11; Caption := R('BUTTON_CAPTION_CANCEL',BUTTON_CAPTION_CANCEL); dbActionType := adbCloseForm; Height := 36; Width := 109; Left := tmpPanel.Width - Width - 4; Top := 4; Anchors := akRight + akTop; Cancel := True; Default := False; end; Button_SetImage(tmpButton); // tmpButton := TdbButton.Create(tmpForm); AssignEvents(tmpButton); with tmpButton do begin Parent := tmpPanel; Name := 'btnSave'; Font.Name := 'Segoe UI'; Font.Size := 11; Caption := R('BUTTON_CAPTION_SAVE',BUTTON_CAPTION_SAVE); Height := 36; Width := 119; dbActionType := adbCloseForm; OnClick := 'Style_StyleViewer_btnSave_OnClick'; Left := tmpPanel.Width - Width - 4 - 109 - 4; Top := 4; Anchors := akRight + akTop; Cancel := False; Default := True; end; Button_SetImage(tmpButton); // основная часть формы tmpPanel := TPanel.Create(tmpForm); with tmpPanel do begin Parent := tmpForm; BorderWidth := 0; Align := alClient; end; tmpList := TListBox.Create(tmpForm); with tmpList do begin Name := 'lstStyles'; Font.Name := 'Segoe UI'; Font.Size := 11; Parent := tmpPanel; Width := 200; Align := alLeft; for i := 0 to Length(arStyles) - 1 do begin Items.add( arStyles[i] ); end; OnClick := 'Style_StyleViewer_ListOnClick'; end; tmpImage := TImage.Create( tmpForm ); with tmpImage do begin Parent := tmpPanel; Name := 'imgPreview'; Align := alClient; // Stretch := True; Proportional := True; Center := True; end; end; FindC(tmpForm,'lstStyles',tmpList); for i:=0 to tmpList.Items.Count - 1 do begin if tmpList.Items.Strings[ i ] = currentStyleName then begin tmpList.ItemIndex := i; Style_StyleViewer_ListOnClick(tmpList); // загрузить картинку break; end end; tmpForm.ShowModal; end;
Code language: Delphi (delphi)

Процедура Style_StyleViewer() служит для отображения формы просмотра и выбора стиля. Эта форма внешне напоминает форму редактирования: внизу расположена панель с кнопками “Сохранить” и “Отменить”, слева – список стилей, а посредине – изображение программы с выбранным стилем.

Форма выбора стиля
const STYLE_PREVIEW_EXT = '.png'; procedure Style_StyleViewer_ListOnClick(Sender: TObject); // клик или выбор элемента списка стрелками клавиатуры var tmpList: TListBox; tmpFileName: string; tmpStyleName: string; tmpForm: TForm; tmpImage: TImage; begin CForm(Sender,tmpForm); tmpList := TListBox(Sender); tmpStyleName := tmpList.Items.Strings[ tmpList.ItemIndex ]; tmpFileName := ExtractFilePath(Application.ExeName) + STYLE_DIR + tmpStyleName + STYLE_PREVIEW_EXT; FindC(tmpForm,'imgPreview',tmpImage); if not FileExists(tmpFileName) then tmpFileName := ExtractFilePath(Application.ExeName) + STYLE_DIR + 'default' + STYLE_PREVIEW_EXT; // tmpImage.Picture.LoadFromFile(tmpFileName); end;
Code language: Delphi (delphi)

При выборе стиля в списке процедура Style_StyleViewer_ListOnClick() находит соответствующую картинку и загружает её для просмотра. Если картинка не найдена (что вполне ожидаемо для первого пункта в списке стилей), то имя картинки меняется на default.png

procedure Style_StyleViewer_btnSave_OnClick(Sender: TObject; var Cancel:boolean); // сохранение и применение стиля var tmpList: TListBox; tmpStyleName: string; tmpForm: TForm; begin CForm(Sender,tmpForm); FindC(tmpForm,'lstStyles',tmpList); tmpStyleName := tmpList.Items.Strings[ tmpList.ItemIndex ]; Style_SetStyle(tmpStyleName); end;
Code language: Delphi (delphi)

При нажатии кнопки “Сохранить” происходит применение стиля посредством вызова процедуры Style_SetStyle().

Другие доработки

  • Style_StyleViewer_OnShow() – отображение формы просмотра стиля, фокус на список
  • Resource_CreateMenu() – добавлена опция, которая по умолчанию создает пункт выбора языка внутри пункта меню “Параметры”
  • Style_AddToMenu() – создание пункта меню для интерактивного выбора стиля.
  • Style_mniStyleViewer_OnClick() – обработчик пункта меню для вызова формы выбора стиля.
  • Button_SetImage() – упрощенная процедура назначения картинки на кнопку
  • english.txt, русский.txt – в файлы локализации ресурсов добавлены новые данные
  • Добавлена иконка приложения ClassExplorer.ico, она встроена в ClassExplorer_.exe, так как файл ClassExplorer.exe будет перезаписываться каждый раз при изменении проекта.

Ссылки

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *