Шупрута В.В. - Delphi 2005 - Учимся программировать (1080891), страница 33
Текст из файла (страница 33)
5.12 • Форма программы просмотра изображенийизображений используется компонент PictureBox. Отображение выбранногофайла в списке осуществляет процедура обработки события S e l e c t e d l n dexChenged, которое происходит в результате щелчка по элементу списка или перемещения указателя текущего элемента списка при помощи клавиш клавиатуры.ГЛАВА 5 V Основные компоненты при программировании для .NETЛистинг 5.7 т Текст программы для просмотра изображенийunit WinForml;,interfaceusesSystem.Drawing, System.Collections, System.ComponentModel,System.Windows.Forms, System.Data, System.10,Borland.Vcl.SysUtils;typeTWinForml = clase(System.Windows.Forms.Form){$REGI0N 'Designer Managed Code'}strict privateComponents: System.ComponentModel.Container;ListBoxl: System.Windows.Forms.ListBox;Label1: System.Windows.Forms.Label;PictureBoxl: Systern.Windows.Forms.PictureBox;procedure InitializeComponent;procedure TWinForml_Load(sender: System.Object;e: System.EventArgs);procedure ListBoxl_SelectedIndexChanged(sender: System.Object;e: System.EventArgs);{$ENDREGION}strict protectedprocedure Dispose(Disposing: Boolean); override;private{ Private Declarations }publicconstructor Create;end;[assembly: RuntimeRequiredAttribute(TypeOf(TWinForml))]implementationvar current_dir:DirectoryInfo;// Содержит информацию о каталоге.dir_files:array of Filelnfo;// Содержит информацию о файлах// каталога.{$AUT0B0X ON}procedure TWinForml.Dispose(Disposing: Boolean);beginif Disposing thenbeginif Components <> nil thenComponents.Dispose();end;Компонент ListBoxinherited Dispose(Disposing);end;constructor TWinForml.Create;begininherited Create;InitializeComponent;end;procedure TWinForml.TWinForml_Load(sender: System.Object;e: System.EventArgs);var i:integer; // Счетчик цикла.num:integer; // Переменная для хранения количества файлов// в каталоге.s:string; // Переменная для хранения имени текущего каталога.begin// Узнаем текущий каталог программы.s:=GetCurrentDir();// Создаем объект типа Directorylnfo.trycurrent_dir:=DirectoryInfo.Create(s+'\Photos\');exceptOn e:Exception dobeginMessageBox.Show(e.Message) ;end ,end ;// Читаем файлы *.jpg из подкаталога photos.dir_files:=current_dir.GetFiles('*.jpg') ;// Запоминаем количество найденных файлов.num:=length(dir_files) ;// Устанавливаем признак необходимости сортировки в True.ListBoxl.Sorted:=True;// Добавляем найденные файлы в ListBox.for i:= 0 to num-1 doListBoxl.Items.Add(dir_files[i].Name);// Ставим указатель на первый элемент списка.ListBoxl.SelectedIndex:=O;end ;// Процедура отображения текущего элемента списка (файла)// в компонентеPictureBox.procedure TWinForml.ListBoxl_SelectedIndexChanged(sender:System.Object; e: System.EventArgs)var str:string;begin>игГЛАВА S • Основные компоненты при программировании для .NET// Формируем полное имя файла, который будем отображать.str:=current_dir.FullName+ListBoxl.Selecteditem.ToString()// Заносим это имя в свойство Image компонента PictureBox.PictureBoxl.Image:=System.Drawing.Bitmap.FromFile(str);end;end.Результат работы программы приведен на рис.
5.13.Выберите Фотографиюдля просмотреРис. 5.13т Результат работы программы просмотра изображенийКомпонент CheckedListBoxЭтот компонент также является списком, однако перед каждым его элементом находится переключатель CheckBox. Свойства компонента приведены в табл. 5.13.Таблица 5.13 т Основные свойства компонента CheckedListBoxСвойствоКомментарийNameИмя компонента, используемое для доступа в программе к компоненту и егосвойствамItemsЭлементы списка - коллекция строк11 ems.
CountОбщее количество элементов спискаКомпонент PktureBoxТаблица 5.13 т Основные свойства компонента checkedListBox (окончание)СвойствоКомментарийCheckOnClickСпособ пометки элементов списка. Если свойство установлено в True, то принажатии на элемент списка производится его выбор и изменение флажкапереключателя.
Если же свойство установлено в False, то при нажатиипроисходит выбор элемента списка, а изменение состояния переключателя только при повторном нажатии на элемент спискаКоллекция, содержащая выбранные элементы спискаКоличество выбранных элементов спискаКоллекция, содержащая номера выбранных элементов спискаПризнак необходимости(Sorted=True)сортировки элементов коллекции последобавления очередного элементаCheckedltemsCheckedltems.CountCheckedlndicesSortedSelectionModeСвойство определяет режим выбора элементов списка. Может приниматьследующие значения: One - только один элемент, M u l t i s i m p l e - возможенвыбор нескольких элементов, M u l t i E x t e n d e d - расширенный вариант выборанескольких элементов списка.
В последнем случае несколько элементов можновыбирать нажатием клавиши Ctrl, а также выбирать диапазон с помощьюнажатой клавиши ShiftScrollAlwaysVisibleПризнак необходимости всегда отображать вертикальную полосу прокрутки.Если свойство равно Faise, то полоса прокрутки отображаться не будет, чтоможет привести к тому, что не будут отображаться некоторые элементы спискаMultiColuinnПризнак необходимости отображать список в несколько колонок.
Количествоколонок зависит от количества элементов и размера компонентаСвойство, определяющее положение компонента на поверхности формыLocation.X,Location.-YSize.WidthSize.HeightFontРазмер компонента с учетом (для типа simple) или без учета (для типовDropDown и DropDownList) размера области списка или области вводаШрифт, используемый для отображения содержимого поля редактированияи элементов спискаФормируется список CheckedListBox также двумя способами - либо сиспользованием редактора свойств String Collection Editor, либо с использованием метода Add свойства Items.Компонент PictureBoxКомпонент PictureBox обеспечивает отображение иллюстрации (файла рисунка). Свойства компонента приведены в табл.
5.14.Таблица 5 . 1 4 т Основные свойства компонента P i c t u r e B o xСвойствоКомментарийNameИмя компонента, используемое для доступа в программе к компонентуи его свойствамИллюстрация, отображаемая в поле компонента,ImageГЛАВА 5 т Основные компоненты при программировании для .NETТаблица 5.14 т Основные свойства компонента PictureBox (окончание)IСвойствоКомментарийImage. p h y s i c a l D i m e n s i o nСвойство содержит информацию о размере иллюстрации, загруженнойв поле компонентаSizeModeСпособ отображения картинки. Существует четыре режима отображения так называемые способы масштабирования. Normal - обычный режим,без масштабирования, s t r e t c h l m a g e - масштабирование картинкидо размера области отображения компонента P i c t u r e B o x (если размеркартинки не пропорционален размеру иллюстрации, то она будетискажена), A u t o s i z e - размер компонента автоматически изменяетсядо размеров картинки, Center Image - центрирование картинки в полеотображения компонента, если размер иллюстрации меньше размераобласти отображенияBorderStyleВид границы компонента: None (граница отсутствует), F i x e d S i n g l e(обычная), Fixed3D («объемная» граница)Locat i o n .
x ,Location.YСвойство, определяющее положение компонента на поверхности формыSize.widthSize.HeightРазмер компонентаvisibleПризнак необходимости отображения компонента (и, соответственно,изображения)'GraphicsПоверхность, на которую можно выводить графикуЧтобы задать картинку во время дизайна формы, необходимо в строке свойстваImage щелкнуть на кнопке с тремя точками и в появившемся окне выбрать файлизображения. Добавленное таким образом в форму изображение будет обработаноDelphi и помещено в файл ресурсов проекта.
Соответственно, сам файлизображения нам больше не понадобится. Если же потребуется загружатькартинку во время выполнения программы, то следует воспользоваться методомFromFile (дословно - «Из файла»). В качестве параметра нужно указать полноеимя загружаемого в PictureBox файла. Например, инструкцияPictureBoxl.Image:=System.Drawing.Bitmap.FromFile('d:\example.bmp1)загрузит и отобразит в компоненте PictureBox файл d:\example.bmp. Компонент может отображать не только файлы формата bmp. Данным методом можно также загружать файлы jpg, gif, png.Помните, что при загрузке изображения компонент P i c t u r e B o x необеспечивает пропорционального масштабирования (без искажения).В качестве примера можно привести программу, иллюстрирующую особенностииспользования компонента PictureBox. Форма программы приведена на рис. 5.14.При выборе соответствующего переключателя устанавливаются режимымасштабирования.
Всего таких режимов четыре:>• Normal - масштабирование не производится;>• Centerlmage - изображение центрируется;Компонент PictureBoxот«5раж»««(мааи1га&чж«»в«1|картити *~NormalГ" Centertmage:—^~*"* SttetcNmage С" Д^Дсйет ', f граячжионвльньйРис. 5.14 т Форма программы, демонстрирующей использование компонента PictureBox>• S t r e t c h l m a g e - изображение «подгоняется» под размер компонента;> A u t o S i z e - автоматическое изменение размеров области отображения взависимости от размера картинки.Текст программы приведен в листинге 5.8.Листинг 5.8 т Текст программы, демонстрирующей использование компонента PictureBoxunitWinForml;interfaceusesSystem.Drawing, System.Collections, System.ComponentModel,System.Windows.Forms, System.Data, System.
Resources,typeTWinForml = class(System.Windows.Forms.Form){$REGION 'Designer Managed Code'}strict privateComponents:. Systern.ComponentModel.Container;PictureBoxl: System. Windows. Forms. PictureBox;GroupBoxl: System.Windows.Forms.GroupBox;RadioButtonl: System.Windows.Forms.RadioButton;RadioButton2: System.Windows.Forms.RadioButton;RadioButton3: System.Windows.Forms.RadioButton;RadioButton4: System.Windows.Forms.RadioButton;ГЛАВА 5 • Основные компоненты при программировании для .NETRadioButton5: System.Windows.Forms.RadioButton;procedure InitializeComponent; 'procedure RadioButton2_Click(sender: System.Object;e: System.EventArgs);procedure RadioButtonl_Click(sender: System.Object;e: System.EventArgs);procedure RadioButton3_Click(sender: System.Object;e: System.EventArgs);procedure RadioButton4_Click(sender: System.Object;e: System.EventArgs);procedure RadioButton5_CheckedChanged(sender: System.Object;e: System.EventArgs);{$ENDREGION}strict protectedprocedure Dispose(Disposing: B o o l e a n ) ; override;privateP_Size : Size;// Размер компонентаPictureBox,// задаваемый во время созданияформы.publicconstructor Create;end;[assembly:RuntimeRequiredAttribute(TypeOf(TWinForml))]imp 1 ement at i on{$AUTOBOX ON}procedure TWinForml.Dispose(Disposing:beginif Disposing thenbeginif Components <> nil thenComponents.Dispose() ;end;inherited Dispose(Disposing);end;Boolean);constructor TWinForml.Create;begininherited Create;InitializeComponent;// Получаем фактические размеры компонентаP_Size.Width:=PictureBoxl.Width;P_Size.Height:=PictureBoxl.Height;end;// Режимотображения-Normal.PictureBox.Компонент PictureBoxprocedure TWinForml.RadioButtonl_Click(sender: System.Object;e: System.EventArgs);beginPictureBoxl.SizeMode:=PiсtureBoxSizeMode.Normal;PictureBoxl.Size:=P_Size;end;// Режим отображения - Centerlmage.procedure TWinForml.RadioButton2_Click(sender: System.Object;e: System.EventArgs);beginPictureBoxl.SizeMode:=PictureBoxSizeMode.CenterImage;PictureBoxl.Size:=P_Size;end;// Режим отображения - Stretchlmage.procedure TWinForml.RadioButton3_Click(sender: System.Object;e: System.EventArgs);beginPictureBoxl.SizeMode:=PiсtureBoxSizeMode.Stretchlmage;PictureBoxl.Size:=P_Size;end;// Режим отображения - AutoSize.procedure TWinForml.RadioButton4_Click(sender: System.Object;e: System.EventArgs);beginPictureBoxl.SizeMode:=PiсtureBoxSizeMode.AutoSize;end;// Пропорциональное отображение картинки.procedure TWinForml.RadioButton5_CheckedChanged(sender:System.Object; e: System.EventArgs);vardx,dy,scale: real;begin// Режим отображения - без масштабирования.PictureBoxl.SizeMode:=PiсtureBoxSizeMode.Normal;PictureBoxl.Size:=P_Size;// Если ширина компонента PictureBox меньше ширины иллюстрации,// то вычислить коэффициент масштабирования по длинеif PictureBoxl.Width>PictureBoxl.Image.PhysicalDimension.Widththen dx:=lelse dx:=PictureBoxl.Width/PictureBoxl.Image.PhysicalDimension.Width;// и высоте.ГЛАВА 5 • Основные компоненты при программировании для .NETif PictureBoxl.Height > PictureBoxl.Image.PhysicalDimension.Heightthen dy:=1else dy:=PictureBoxl.Height/PictureBoxl.Image.PhysicalDimension.Height;// Определяем итоговый коэффициент масштабирования// (чтобы не было искажения картинки,// коэффициенты масштабирования должны быть одинаковыми// по обеим осям).if dx<dythenscale:=dxelsescale:=dy;if scale=lthen// Если масштабировать не надо, режим масштибирования // Normal.PictureBoxl.SizeMode := PictureBoxSizeMode.Normalelsebegin// В противном случае// выполняем масштабирование.PictureBoxl.SizeMode:=PictureBoxSizeMode.Stretchlmage;PictureBoxl .Width: =Round (PictureBoxl.