Использование диалогов для загрузки и сохранения графических файлов
Приводимый ниже пример ModifDlg – усовершенствованная программа просмотра и сохранения файлов растровой графики, к которым относятся файлы форматов JPEG и BMP. Чтобы исключить метафайлы и значки (*.wmf, *.emf, *.ico), соответствующим образом настраиваются фильтры в диалогах открытия и сохранения.
Для изменения размеров диалогового окна нужно отыскать среди входящих в его состав компонентов панель picturePanel (так назвали ее разработчики Borland) и увеличить ее высоту. Следует также поменять и размеры родительских окон. Поскольку они не являются компонентами Delphi (стандартные диалоги являются составными частями Windows) для этой цели используются функции API GetWindowRect и SetWindowPos.
Обратите также внимание, что при загрузке используется событие OnProgress класса TGraphic. В его обработчике информация об объеме проделанной работы отображается на компоненте progressBar1. Для маленьких картинок обработчик вызывается только в начале и в конце операции, пользователь ничего не заметит. Зато при загрузке большого изображения он будет спокоен, видя, что процесс загрузки идет и машина не зависла.
Листинг 10.1. Исходный текст главного модуля программы ModifDlg.
unit mainUnit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtDlgs, StdCTRLs, ComCTRLs, ExtCTRLs, Buttons; type TForml = class(TForm) SavePictureDialogl: TSavePictureDialog; OpenPictureDialogl: TOpenPictureDialog; ScrollBoxl: TScrollBox; Imagel: TImage; ProgressBari: TProgressBar; OpenBitBtn: TBitBtn; SaveBitBtn: TBitBtn; procedure SavePictureDialoglTypeChange(Sender: TObject); procedure ImagelProgress(Sender: TObject; Stage: TProgressStage; PercentDone: Byte; RedrawNow: Boolean; const R: TRect; const Msg: String); procedure SavePictureDialoglClose(Sender: TObject); procedure FormCreate(Sender: TObject); procedure SavePictureDialoglShow(Sender: TObject); procedure OpenBitBtnClick(Sender: TObject); procedure SaveBitBtnClick(Sender: TObject); private public end; var Forml: TForml; implementation {$R *.DFM} uses jpeg; const DeltaH: Integer = 80; var Quality: TJpegQualityRange; ProgressiveEnc: Boolean; procedure TForml.OpenBitBtnClick(Sender: TObject); begin if OpenPictureDialogl.Execute then Imagel.Picture.LoadFromFile (OpenPictureDialogl.FileName); end; procedure TForml.SaveBitBtnClick(Sender: TObject); var ji: TJpeglmage; begin if SavePictureDialogl.Execute then begin ji: = TJpeglmage.Create; ji.CompressionQuality: = Quality; ji.ProgressiveEncoding: = ProgressiveEnc; j i.Assign(Imagel.Picture.Bitmap); ji.SaveToFile(SavePictureDialogl.FileName); ji.Free; end; end;