(* ImageEn Build 7.0.0.06.2637 @ 7-4-17 14:58:42.679 *) (* Copyright (c) 1998-2017 by Carlotta Calandra. All rights reserved. Copyright (c) 2011-2017 by Xequte Software. This software comes without express or implied warranty. In no case shall the author be liable for any damage or unwanted behavior of any computer hardware and/or software. Author grants you the right to include the component in your application, whether COMMERCIAL, SHAREWARE, or FREEWARE. ImageEn, IEvolution and ImageEn ActiveX may not be included in any commercial, shareware or freeware libraries or components. www.ImageEn.com *) (* File version 1027 Doc revision 1004 *) unit ieopensavedlg; {$IFDEF FPC} {$MODE DELPHI} {$ENDIF} {$R-} {$Q-} {$I ie.inc} {$IFDEF IEINCLUDEOPENSAVEDIALOGS} interface uses Windows, Messages, SysUtils, {$ifndef FPC}CommDlg,{$endif} Classes, Graphics, Controls, Forms, comctrls, Clipbrd, stdctrls, buttons, extctrls, Dialogs, hyieutils, hyiedefs, ImageEnIO, ImageEnView, iexBitmaps, IEMView, IEMIO, ievect; const DWL_MSGRESULT = 0; type TIEOpenFileNameEx = {packed }record lStructSize: DWORD; hWndOwner: HWND; hInstance: HINST; lpstrFilter: pointer; lpstrCustomFilter: pointer; nMaxCustFilter: DWORD; nFilterIndex: DWORD; lpstrFile: pointer; nMaxFile: DWORD; lpstrFileTitle: pointer; nMaxFileTitle: DWORD; lpstrInitialDir: pointer; lpstrTitle: pointer; Flags: DWORD; nFileOffset: Word; nFileExtension: Word; lpstrDefExt: pointer; lCustData: LPARAM; lpfnHook: function(Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): UINT stdcall; lpTemplateName: pointer; pvReserved: Pointer; dwReserved: DWORD; FlagsEx: DWORD; end; PIEOpenFileNameEx = ^TIEOpenFileNameEx; {!! TIEFileDlgPreviewEvent Declaration TIEFileDlgPreviewEvent = procedure(Sender: TObject; Viewer: TObject; FileName: String; ParamsOnly: Boolean) of object; Description Occurs when the Open File Dialog needs to load an image for preview or get the parameters (file details) from an image. Viewer will be a object for single-frame images or a object for multi-frame images or videos. FileName contains the file name to load. ParamsOnly is true when the Preview Checkbox is not checked, so the user doesn't want to display the image. !!} TIEFileDlgPreviewEvent = procedure(Sender: TObject; Viewer: TObject; FileName: String; ParamsOnly: Boolean) of object; {!! TIEDBorderStyle Declaration TIEDBorderStyle = (iepsDefault, iepsCropped, iepsCropShadow, iepsSoftShadow); Description Value Description iepsDefault 3D border displayed around the preview box iepsCropped 3D border displayed around the image iepsCropShadow Shadow is displayed around the image iepsSoftShadow Soft (high quality) shadow is displayed around the image
!!} TIEDBorderStyle = (iepsDefault, iepsCropped, iepsCropShadow, iepsSoftShadow); {!! TIECommonDialogView Declaration TIECommonDialogView = (iedvDefault, iedvSmallIcons, iedvMediumIcons, iedvLargeIcons, iedvExtraLargeIcons, iedvTiles, iedvList, iedvDetails); Description The default file view for the
and . iedvLargeIcons is the standard thumbnail view. iedvDetails is the standard columnar report view. Note: On Windows XP iedvLargeIcons and iedvExtraLargeIcons are treated as iedvMediumIcons !!} TIECommonDialogView = (iedvDefault, iedvSmallIcons, iedvMediumIcons, iedvLargeIcons, iedvExtraLargeIcons, iedvTiles, iedvList, iedvDetails); {!! TIEPreviewSize Declaration TIEPreviewSize = (iespDefault, iespTall, iespLarge); Description Value Description iespDefault Normal size preview window (smallest) iespTall Preview is same width as iepsDefault, but taller iespLarge Much larger preview window
!!} TIEPreviewSize = (iespDefault, iespTall, iespLarge); {!! TIEShowFormats Declaration TIEShowFormats = (iesfImagesAndVideos, iesfImagesOnly, iesfVideosOnly, iesfAllOnly); Description Specifies the file types are listed in the drop down filter selector of the TOpenImageEnDialog. Also determines which formats are included in the "All Common Graphic Files" filter (which is the default filter). Value Description iesfImagesAndVideos All ImageEn supported image formats are included, AVI videos, and also WMV and MPEG videos if DirectShow is enabled iesfImagesOnly All ImageEn supported image formats are included (no videos) iesfVideosOnly AVI videos, and also WMV and MPEG videos if DirectShow is enabled (no images) iesfAllOnly Does not show the "All Common Graphic Files" filter. Default is to show "All Files"
!!} TIEShowFormats = (iesfImagesAndVideos, iesfImagesOnly, iesfVideosOnly, iesfAllOnly); {!! TIECommonDialog Description The common parent class of
and . Properties - - - !!} TIECommonDialog = class(TComponent) private fCtl3D: Boolean; fDefWndProc: Pointer; fHelpContext: THelpContext; fHandle: HWnd; fObjectInstance: Pointer; fTemplate: PWideChar; fOnClose: TNotifyEvent; fOnShow: TNotifyEvent; fShowPlacesBar: boolean; fFileView : TIECommonDialogView; fWatchTimer: TTimer; procedure WMDestroy(var Message: TWMDestroy); message WM_DESTROY; procedure WMInitDialog(var Message: TWMInitDialog); message WM_INITDIALOG; procedure WMNCDestroy(var Message: TWMNCDestroy); message WM_NCDESTROY; procedure MainWndProc(var Message: TMessage); protected fExtendedDialog: boolean; procedure DoClose; dynamic; procedure DoShow; dynamic; procedure WndProc(var Message: TMessage); virtual; function MessageHook(var Msg: TMessage): Boolean; virtual; function TaskModalDialog(DialogFunc: Pointer; var DialogData): Bool; virtual; function Execute: Boolean; virtual; abstract; property Template: PWideChar read fTemplate write fTemplate; function ExtractFilter(ss: pointer; idx: Integer): WideString; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure DefaultHandler(var Message); override; property Handle: HWnd read fHandle; published property Ctl3D: Boolean read fCtl3D write fCtl3D; property HelpContext: THelpContext read fHelpContext write fHelpContext default 0; property OnClose: TNotifyEvent read fOnClose write fOnClose; property OnShow: TNotifyEvent read fOnShow write fOnShow; {!! TIECommonDialog.ShowPlacesBar Declaration property ShowPlacesBar: Boolean; Description Whether the standard Windows "Places" bar is shown. !!} property ShowPlacesBar: boolean read fShowPlacesBar write fShowPlacesBar default true; {!! TIECommonDialog.FileView Declaration property FileView: ; Description Overrides the default file view of the Open/Save dialogs, e.g. iedvLargeIcons forces thumbnails, whereas iedvDetails provides a columnar report view. !!} property FileView : TIECommonDialogView read fFileView write fFileView default iedvDefault; {!! TIECommonDialog.ExtendedDialog Declaration property ExtendedDialog: Boolean; Description Extends the Open/Save dialog with extra features, such as file information. Default: True !!} property ExtendedDialog: boolean read fExtendedDialog write fExtendedDialog default true; end; {!! TOpenImageEnDialog Description Displays a modal Windows dialog box for selecting and opening image files. It includes all properties, methods and events of the standard TOpenDialog. It also includes a preview window which displays all ImageEn supported file formats. If the file is an animated GIF, AVI video or a multi page TIFF, all images will be shown in sequence: the "Play" button will be activated to animate the sequence. Image information such as dimensions, colors, dpi, file type, compression and file-memory sizes is also shown. See Also - TOpenDialog - Methods and Properties Events !!} {$ifdef IEHASPLATFORMATTRIBUTE} [ComponentPlatformsAttribute(pidWin32 or pidWin64)] {$endif} TOpenImageEnDialog = class(TIECommonDialog) private m_blnInSelectionChange: Boolean; fImageEnView: TImageEnVect; {$IFDEF IEINCLUDEMULTIVIEW} fImageEnMView: TImageEnMView; {$ENDIF} fPicturePanel: TPanel; fPicLabel1: TLabel; fPicLabel2: TLabel; fPicLabel3: TLabel; fInfoPanel: TPanel; fInfoLabel1: TLabel; fInfoLabel2: TLabel; fPreviewButton: TSpeedButton; fZoomComboBox: TComboBox; fProgressBar: TProgressBar; {$IFDEF IEINCLUDEMULTIVIEW} fPlayButton: TSpeedButton; {$ENDIF} fAdvancedButton: TButton; fPreviewCheck: TCheckBox; fFileSize: integer; // size of last file loaded fFrames: integer; // page count of last file loaded fSelType: WideString; fAutoSetFilter: boolean; fAutoSetFilterFileType : TIOFileType; {$IFDEF IEINCLUDEMULTIVIEW} fAlwaysAnimate: boolean; {$ENDIF} fAutoAdjustDPI: boolean; fFilteredAdjustDPI: boolean; fGetExifThumbnail : boolean; // fHistoryList: TStrings; fOptions: TOpenOptions; fFilter: string; fFilterIndex: Integer; fFilterDefault : TIOFileType; fCurrentFilterIndex: Integer; fInitialDir: string; fTitle: string; fDefaultExt: string; fFileNameW: WideString; fFiles: TStrings; fFilesW: TIEWideStrings; fFileEditStyle: TFileEditStyle; fOnSelectionChange: TNotifyEvent; fOnFolderChange: TNotifyEvent; fOnTypeChange: TNotifyEvent; fOnCanClose: TCloseQueryEvent; fPreviewBorderStyle: TIEDBorderStyle; fShowFormats : TIEShowFormats; fExtendedFilters: string; fShowAllFrames: boolean; fSelectedFrame: Integer; OpenFileNameExShadow: pointer; fOnCreateCustomControls: TNotifyEvent; fOnDestroyCustomControls: TNotifyEvent; fOnPreviewFile: TIEFileDlgPreviewEvent; fPreviewIsFullSize : Boolean; fPreviewSize : TIEPreviewSize; function GetFileName: TFileName; function GetFileNameW: WideString; function GetLongFileName: WideString; function GetFileName2: WideString; function GetFilterIndex: Integer; procedure ReadFileEditStyle(Reader: TReader); procedure SetHistoryList(Value: TStrings); procedure SetInitialDir(const Value: string); procedure PreviewClick(Sender: TObject); procedure PreviewKeyPress(Sender: TObject; var Key: Char); procedure ZoomComboChange(Sender: TObject); procedure ImageEnIOProgress(Sender: TObject; per: integer); procedure ShowIOParams(params: TIOParams); procedure DoCheckPreview(Sender: TObject); procedure SetPreviewBorderStyle(v: TIEDBorderStyle); procedure SetZoomFilter(v: TResampleFilter); function GetZoomFilter: TResampleFilter; function FileExtToFilterIndex(e : string; bExcludeCommon : Boolean = False) : integer; function FileTypeToFilterIndex(FileType : TIOFileType) : integer; {$IFDEF IEINCLUDEMULTIVIEW} procedure SetAlwaysAnimate(value: Boolean); {$endif} procedure SetFileName(value: TFileName); procedure SetPreviewSize(const v : TIEPreviewSize); procedure UpdateBackground(); protected fShowPreview: boolean; // if true show the preview of images // procedure PlayClick(Sender: TObject); function CanClose(var OpenFileName: TIEOpenFileNameEx): Boolean; function DoCanClose: Boolean; dynamic; function DoExecute(Func: Pointer): Bool; procedure DoSelectionChange; dynamic; procedure DoFolderChange; dynamic; procedure DoTypeChange; dynamic; procedure DefineProperties(Filer: TFiler); override; procedure GetFileNames(var OpenFileName: TIEOpenFileNameEx); function GetStaticRect: TRect; virtual; procedure WndProc(var Message: TMessage); override; // procedure SetZoom; virtual; procedure DoClose; override; procedure DoShow; override; procedure SetLang; procedure OnMViewSelect(Sender: TObject; idx: integer); procedure DoAllDisplayed(Sender: TObject); function LoadPreview(LoadImage, FullSize: Boolean) : Boolean; function NeedLoadPreviewFullSize: Boolean; function SelectedZoom : Integer; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; function BuildFilterStr(LimitToType : TIOFileType = -1; bMultiFrameSaveOnly : Boolean = False) : string; {!! TOpenImageEnDialog.Execute Declaration property SelectedFrame: Integer; Description Displays the ImageEn Open dialog, returning true if the user selects a file and clicks OK. If the user cancels the dialog, Execute returns false. Example // Browse for an image and display it in an ImageEnView If OpenImageEnDialog1.Execute then ImageEnView1.LoadFromFile( OpenImageEnDialog1.FileName ); See Also - !!} function Execute: Boolean; override; property FileEditStyle: TFileEditStyle read fFileEditStyle write fFileEditStyle; {!! TOpenImageEnDialog.Files Declaration property Files: TStrings; Description A string list that contains all selected filenames (with a full directory path). Notes: - Set the ofAllowMultiSelect flag in Options to allow multiple selection - If you require widestring support use . See Also - - !!} property Files: TStrings read fFiles; {!! TOpenImageEnDialog.FilesW Declaration property FilesW: TIEWideStrings; Description A widestring equivalent of , which provides access to all selected filenames (with a full directory path). See Also - - !!} property FilesW: TIEWideStrings read fFilesW; property HistoryList: TStrings read fHistoryList write SetHistoryList; {!! TOpenImageEnDialog.PicturePanel Declaration property PicturePanel: TPanel; Description The TPanel object that shows a preview of the image (it contains both a and a component). This property can be used to customize the open/save dialogs with new controls. See Also - - !!} property PicturePanel: TPanel read fPicturePanel; {!! TOpenImageEnDialog.InfoPanel Declaration property InfoPanel: TPanel; Description The TPanel object that displays image information and additional controls. It contains labels for file detail, a button for Advanced Save settings and a preview checkbox. This property can be used to customize the open/save dialogs with new controls. See Also - - !!} property InfoPanel: TPanel read fInfoPanel; property PreviewCheckBox: TCheckBox read fPreviewCheck; {!! TOpenImageEnDialog.ExtendedFilters Declaration property ExtendedFilters: String; Description Specifies additional file formats to include when is True. Example // Add the "Fun" file type to the file formats list OpenImageEnDialog1.ExtendedFilters := 'Fun Bitmap|*.fun;*.fan;' !!} property ExtendedFilters: string read fExtendedFilters write fExtendedFilters; {!! TOpenImageEnDialog.SelectedFrame Declaration property SelectedFrame: Integer; Description Returns the selected page (or frame) in the open dialog for multipage files like TIFF, GIF. Example // Prompt the user to select a TIFF file and load the page that they select If OpenImageEnDialog1.Execute then Begin ImageEnView1.IO.Params.TIFF_ImageIndex := OpenImageEnDialog1.SelectedFrame; ImageEnView1.IO.LoadFromFile( OpenImageEnDialog1.FileName ); End; !!} property SelectedFrame: Integer read fSelectedFrame write fSelectedFrame; {!! TOpenImageEnDialog.FileNameW Declaration property FileNameW: WideString; Description Returns the name and complete directory path of the most recently selected file. FileNameW is the same as but uses WideString instead of String. See Also - - - !!} property FileNameW: WideString read GetFileNameW write fFileNameW; published property DefaultExt: string read fDefaultExt write fDefaultExt; {!! TOpenImageEnDialog.FileName Declaration property FileName : String; Description Returns the name and complete directory path of the most recently selected file. The value of FileName is the same as the first item in the property. To specify a default filename appear for the dialog's edit box, assign it to this property before calling Execute. If you require widestring support, use . Example // Select an image to load in an ImageEnView If OpenImageEnDialog1.Execute then ImageEnView1.IO.LoadFromFile(OpenImageEnDialog1.FileName); See Also - - !!} property FileName: TFileName read GetFileName write SetFileName; {!! TOpenImageEnDialog.Filter Declaration property Filter : string; Description The Open/Save dialog includes a drop-down list of file types under the edit box. When the user picks a file type from the list, only files of the selected type are displayed in the dialog. If is true then ImageEn will automatically fill the dialog with all supported file types that it supports (or a specific one if you use ). If you wish to override the default handling, set to false and specify your prefered filter. Example // Only allow the user to open GIF and BMP Files OpenImageEnDialog1.Filter := 'Supported Images |*.gif;*.bmp|GIF Images (*.gif)|*.gif|Bitmaps (*.bmp)|*.bmp' See Also - - - - - !!} property Filter: string read fFilter write fFilter; {!! TOpenImageEnDialog.FilterIndex Declaration property FilterIndex : Integer; Description Determines which of the file types in is selected by default when the dialog opens. Set FilterIndex to 1 to choose the first file type in the list as the default, or 2 to choose the second file type, etc. Generally it is better to use to choose a particular format such as JPEG or AVI. Note: this setting is ignored if you have specified a filename or set a type for . See Also - !!} property FilterIndex: Integer read GetFilterIndex write fFilterIndex default 1; {!! TOpenImageEnDialog.FilterDefault Declaration property FilterDefault : ; Description Specifies a file type which is the default selection for the , e.g. if you choose ioGIF then GIF will be the default save type. This setting overrides , but is ignored if you have specified a . See Also - - - !!} property FilterDefault : TIOFileType read fFilterDefault write fFilterDefault default -1; property InitialDir: string read fInitialDir write SetInitialDir; property Options: TOpenOptions read fOptions write fOptions default [ofHideReadOnly]; property Title: string read fTitle write fTitle; property OnCanClose: TCloseQueryEvent read fOnCanClose write fOnCanClose; property OnFolderChange: TNotifyEvent read fOnFolderChange write fOnFolderChange; property OnSelectionChange: TNotifyEvent read fOnSelectionChange write fOnSelectionChange; property OnTypeChange: TNotifyEvent read fOnTypeChange write fOnTypeChange; {!! TOpenImageEnDialog.AutoSetFilter Declaration property AutoSetFilter : boolean; Description When AutoSetFilter is True, TOpenImageEnDialog/TSaveImageEnDialog ignores the property and fills it with all supported ImageEn file formats (with custom file formats) or a specific format if is used. Default: True Example // Allow loading of all file types OpenImageEnDialog1.AutoSetFilter := True; OpenImageEnDialog1.AutoSetFilterFileType := -1; // Only allow the user to save to GIF format SaveImageEnDialog1.AutoSetFilter := True; SaveImageEnDialog1.AutoSetFilterFileType := ioGIF; See Also - - !!} property AutoSetFilter: boolean read fAutoSetFilter write fAutoSetFilter default true; {!! TOpenImageEnDialog.AutoSetFilterFileType Declaration property AutoSetFilterFileType : ; Description If AutoSetFilter is enabled, then the value of AutoSetFilterFileType will specify what formats are assigned to . By default (-1), all supported formats are added but you can specify an ImageEn type to limit the filter to that type. Note: With the filter will always include a line item for "Supported Types" and "All Files" even if if AutoSetFilterFileType is used. Example // Allow loading of all file types OpenImageEnDialog1.AutoSetFilter := True; OpenImageEnDialog1.AutoSetFilterFileType := -1; // Only allow the user to save to GIF format SaveImageEnDialog1.AutoSetFilter := True; SaveImageEnDialog1.AutoSetFilterFileType := ioGIF; See Also - - !!} property AutoSetFilterFileType: TIOFileType read fAutoSetFilterFileType write fAutoSetFilterFileType default -1; {$IFDEF IEINCLUDEMULTIVIEW} property AlwaysAnimate: boolean read fAlwaysAnimate write SetAlwaysAnimate default false; {$ENDIF} property PreviewBorderStyle: TIEDBorderStyle read fPreviewBorderStyle write SetPreviewBorderStyle default iepsDefault; {!! TOpenImageEnDialog.AutoAdjustDPI Declaration property AutoAdjustDPI : Boolean; Description When True and the last loaded/scanned image has a horizontal DPI not equal to the vertical DPI, ImageEn will resize the image so that DPIX = DPIY. Default: False !!} property AutoAdjustDPI: boolean read fAutoAdjustDPI write fAutoAdjustDPI default false; {!! TOpenImageEnDialog.GetExifThumbnail Declaration property GetExifThumbnail : Boolean; Description If enabled, preview is sped up by loading the thumbnail for JPEG, IEN and Raw files. Default: False See Also - - - !!} property GetExifThumbnail: boolean read fGetExifThumbnail write fGetExifThumbnail default false; {!! TOpenImageEnDialog.FilteredAdjustDPI Declaration property FilteredAdjustDPI : boolean; Description The FilteredAdjustDPI property is valid when is True. If set, ImageEn applies a resampling filter to the image to enhance quality. This can slow down the loading process. !!} property FilteredAdjustDPI: boolean read fFilteredAdjustDPI write fFilteredAdjustDPI default false; property ZoomFilter: TResampleFilter read GetZoomFilter write SetZoomFilter default rfFastLinear; {!! TOpenImageEnDialog.ShowAllFrames Declaration property ShowAllFrames: Boolean; Description When previewing a multi-page file (TIFF, GIF or AVI) if ShowAllFrames is true, it shows and loads all frames, otherwise only the first is shown. !!} property ShowAllFrames: boolean read fShowAllFrames write fShowAllFrames default true; {!! TOpenImageEnDialog.ShowFormats Declaration property ShowFormats: ; Description Specifies the file types listed in the drop down filter selector of the TOpenImageEnDialog. Also determines which formats are included in the "All Common Graphic Files" filter (which is the default filter). Default: iesfImagesAndVideos !!} property ShowFormats: TIEShowFormats read fShowFormats write fShowFormats default iesfImagesAndVideos; property PreviewSize: TIEPreviewSize read fPreviewSize write SetPreviewSize default iespDefault; {!! TOpenImageEnDialog.OnCreateCustomControls Declaration property OnCreateCustomControls: TNotifyEvent; Description Occurs immediately before an open/save dialog is executed (shown). This event is often used to add your own controls to the dialog. You should free custom controls in event. Example var MyCbx : TCheckBox; procedure TForm1.OpenImageEnDialogCreateCustomControls(Sender: TObject); var p: TWinControl; begin p := (sender as TOpenImageEnDialog).InfoPanel; MyCbx := TCheckBox.Create(p); MyCbx.parent := p; MyCbx.Caption := 'Test'; MyCbx.SetBounds(280, 0, 130, 23); end; procedure TForm1.OpenImageEnDialogDestroyCustomControls(Sender: TObject); begin MyCbx.free; end; !!} property OnCreateCustomControls: TNotifyEvent read fOnCreateCustomControls write fOnCreateCustomControls; {!! TOpenImageEnDialog.OnDestroyCustomControls Declaration property OnDestroyCustomControls: TNotifyEvent; Description Occurs immediately after an open/save dialog is executed (shown). It is generally used to destroy objects, that have been added using . See Also - OnCreateCustomControls example - - !!} property OnDestroyCustomControls: TNotifyEvent read fOnDestroyCustomControls write fOnDestroyCustomControls; {!! TOpenImageEnDialog.OnPreviewFile Declaration property OnPreviewFile: ; Description Occurs whenever a file is selected and needs to be previewed. You can change the method that is used to load images by handling this event. Example // this is the default behavior procedure TForm1.OnPreviewFile(Sender: TObject; Viewer: TObject; FileName: String; ParamsOnly: Boolean; begin if ParamsOnly then (Viewer as TImageEnView).IO.ParamsFromFile(FileName) else if Viewer is TImageEnView then (Viewer as TImageEnView).IO.LoadFromFileAuto(FileName) else if Viewer is TImageEnMView then (Viewer as TImageEnMView).LoadFromFileOnDemand(FileName); end; !!} property OnPreviewFile: TIEFileDlgPreviewEvent read fOnPreviewFile write fOnPreviewFile; end; {!! TIESaveDlgOpt Declaration type TIESaveDlgOpt = set of (sdShowPreview, sdShowAdvanced); Description Specifies further options for the Save dialog: - sdShowPreview: Show a preview and information on the selected image - sdShowAdvanced: Show an "Advanced" button to configure image properties !!} TIESaveDlgOpt = set of (sdShowPreview, sdShowAdvanced); {!! TSaveImageEnDialog Description TSaveImageEnDialog is the same as the , but with an "Advanced" button to display and modify advanced specific file format parameters. Also you can hide the image preview (using ). TSaveImageEnDialog should be attached to a , , or component to get/set properties (when the user clicks the "Advanced" button). If it is not attached it will function as a standard save dialog with a preview, but without the ability to modify image properties. See Also - TSaveDialog - Methods and Properties Events !!} {$ifdef IEHASPLATFORMATTRIBUTE} [ComponentPlatformsAttribute(pidWin32 or pidWin64)] {$endif} TSaveImageEnDialog = class(TOpenImageEnDialog) private fExOptions: TIESaveDlgOpt; fAttachedImageEnIO: TComponent; procedure OnWatchTimer(Sender: TObject); procedure DoAdvanced(Sender: TObject); procedure SetAttachedImageEnIO(v: TComponent); protected procedure DoTypeChange; override; procedure SetFileNameExt; virtual; procedure Notification(AComponent: TComponent; Operation: TOperation); override; procedure GetAdvancedType(var pp: TPreviewParams; var ft: TIOFileType); procedure EnableDisableAdvanced; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; {!! TSaveImageEnDialog.Execute Declaration function Execute : Boolean; Description Displays the ImageEn Save dialog, returning true if the user selects a file and clicks Save. If the user cancels the save operation, Execute returns false. Note: If you have not set the user will be unable to set advanced parameters. Example // Save the displayed image in an ImageEnView SaveImageEnDialog1.AttachedImageEnIO := ImageEnView1; If SaveImageEnDialog1.Execute then ImageEnView1.SaveToFile(SaveImageEnDialog1ImageEnDialog1.FileName); See Also - - !!} function Execute : Boolean; override; published {!! TSaveImageEnDialog.ExOptions Declaration property ExOptions: ; Description Options to hide/show the image preview and "Advanced" button. Note: If the "Advanced" button does not display, ensure you have correctly set . !!} property ExOptions: TIESaveDlgOpt read fExOptions write fExOptions; property AttachedImageEnIO: TComponent read fAttachedImageEnIO write SetAttachedImageEnIO; end; implementation uses {$ifdef IEHASSTRUTILS}StrUtils, {$endif} dlgs, ieview, iewic, imageenproc, iexThemes, iesettings; {$R-} {$R IEOpenSaveDlg.res} var CreationControl: TIECommonDialog = nil; HelpMsg: Cardinal; HookCtl3D: Boolean; type TIENMHdr = record hwndFrom: HWND; idFrom: pointer; code: integer; { NM_ code } end; TIEOFNotify = record hdr: TIENMHdr; lpOFN: PIEOpenFileNameEx; pszFile: pointer; end; PIEOFNotify = ^TIEOFNotify; // in '*.jpg;*.jpeg' result= '.jpg' function ExtractFirstExt(s: WideString): WideString; var p1, p2: integer; begin p1 := pos('.', s); p2 := pos(';', s); if p2 = 0 then p2 := length(s) + 1; result := copy(s, p1, p2 - p1); end; function DialogHook(Wnd: HWnd; Msg: UINT; WParam: WPARAM; LParam: LPARAM): UINT; stdcall; begin Result := 0; case Msg of WM_INITDIALOG: begin if HookCtl3D then begin {$WARNINGS OFF} Subclass3DDlg(Wnd, CTL3D_ALL); SetAutoSubClass(True); {$WARNINGS ON} end; IECenterWindow(Wnd); CreationControl.fHandle := Wnd; CreationControl.fDefWndProc := Pointer(SetWindowLong(Wnd, GWL_WNDPROC, NativeInt(CreationControl.fObjectInstance))); CallWindowProc(CreationControl.fObjectInstance, Wnd, Msg, WParam, LParam); CreationControl := nil; end; WM_DESTROY: {$WARNINGS OFF} if HookCtl3D then SetAutoSubClass(False); {$WARNINGS ON} end; end; constructor TIECommonDialog.Create(AOwner: TComponent); begin inherited Create(AOwner); fCtl3D := False; fExtendedDialog := true; {$WARNINGS OFF} fObjectInstance := MakeObjectInstance(MainWndProc); {$WARNINGS ON} fShowPlacesBar := true; fFileView := iedvDefault; fWatchTimer := nil; end; destructor TIECommonDialog.Destroy; begin {$WARNINGS OFF} if fObjectInstance <> nil then FreeObjectInstance(fObjectInstance); {$WARNINGS ON} inherited Destroy; end; function TIECommonDialog.MessageHook(var Msg: TMessage): Boolean; begin Result := False; if (Msg.Msg = HelpMsg) and (fHelpContext <> 0) then begin if assigned(Application) then Application.HelpContext(fHelpContext); Result := True; end; end; procedure TIECommonDialog.DefaultHandler(var Message); begin if fHandle <> 0 then with TMessage(Message) do Result := CallWindowProc(fDefWndProc, fHandle, Msg, WParam, LParam) else inherited DefaultHandler(Message); end; procedure TIECommonDialog.MainWndProc(var Message: TMessage); begin try WndProc(Message); except if assigned(Application) then Application.HandleException(Self); end; end; procedure TIECommonDialog.WndProc(var Message: TMessage); const // Command codes for SHELLDLL_DefView (Paul DiLascia, MSDN Magazine - March 2004) // W2K/XP XP_ODM_VIEW_ICONS = $7029; XP_ODM_VIEW_LIST = $702b; XP_ODM_VIEW_DETAIL = $702c; XP_ODM_VIEW_THUMBS = $702d; XP_ODM_VIEW_TILES = $702e; // Vista/Win 7 Vista_FVM_EXTRALARGE = $704d; Vista_FVM_TILES = $704c; Vista_FVM_MEDIUMICON = $704e; Vista_FVM_LARGE = $704f; Vista_FVM_SMALL = $7050; Vista_FVM_LIST = $7051; Vista_FVM_DETAILS = $704b; Vista_FVM_CONTENT = $7052; // Win 7 Only XP_View_Consts : array[TIECommonDialogView] of integer = (-1, // iedvDefault XP_ODM_VIEW_ICONS, // iedvSmallIcons XP_ODM_VIEW_THUMBS, // iedvMediumIcons XP_ODM_VIEW_THUMBS, // iedvLargeIcons XP_ODM_VIEW_THUMBS, // iedvExtraLargeIcons XP_ODM_VIEW_TILES, // iedvTiles XP_ODM_VIEW_LIST, // iedvList XP_ODM_VIEW_DETAIL); // iedvDetails Vista_View_Consts : array[TIECommonDialogView] of integer = (-1, // iedvDefault Vista_FVM_SMALL, // iedvSmallIcons Vista_FVM_MEDIUMICON, // iedvMediumIcons Vista_FVM_LARGE, // iedvLargeIcons Vista_FVM_EXTRALARGE, // iedvExtraLargeIcons Vista_FVM_TILES, // iedvTiles Vista_FVM_LIST, // iedvList Vista_FVM_DETAILS); // iedvDetails function GetView : Integer; begin Result := -1; if IEGlobalSettings().OpSys in [ieosWin2000, ieosWinXP, ieosWin2003] then Result := XP_View_Consts[fFileView] else if IEIsWindowsVistaOrNewer then Result := Vista_View_Consts[fFileView]; end; var hList : THandle; begin Dispatch(Message); // Assign default view if (fFileView <> iedvDefault) and (Message.Msg = WM_NOTIFY) and (POFNotify(Message.LParam)^.hdr.code = CDN_FOLDERCHANGE) then begin hList := FindWindowEx( GetParent(handle), 0, 'SHELLDLL_DefView', ''); if (hList <> 0) and (GetView > -1) then SendMessage(hList, WM_COMMAND, GetView, 0); end; end; procedure TIECommonDialog.WMDestroy(var Message: TWMDestroy); begin inherited; DoClose; end; procedure TIECommonDialog.WMInitDialog(var Message: TWMInitDialog); begin { Called only by non-explorer style dialogs } DoShow; { Prevent any further processing } Message.Result := 0; end; procedure TIECommonDialog.WMNCDestroy(var Message: TWMNCDestroy); begin inherited; fHandle := 0; end; function TIECommonDialog.TaskModalDialog(DialogFunc: Pointer; var DialogData): Bool; type TDialogFunc = function(var DialogData): Bool; stdcall; var {$IFNDEF OCXVERSION} ActiveWindow: HWnd; {$ENDIF} WindowList: Pointer; {$ifdef IEHASFOCUSSTATE} FocusState: TFocusState; {$endif} fpExpDisabler: TIE8087ExceptionsDisabler; begin {$IFNDEF OCXVERSION} ActiveWindow := GetActiveWindow; {$ENDIF} WindowList := DisableTaskWindows(0); {$ifdef IEHASFOCUSSTATE} FocusState := SaveFocusState; {$endif} if assigned(Application) then Application.HookMainWindow(MessageHook); CreationControl := Self; fpExpDisabler := TIE8087ExceptionsDisabler.Create(); try Result := TDialogFunc(DialogFunc)(DialogData); finally fpExpDisabler.Free(); if assigned(Application) then Application.UnhookMainWindow(MessageHook); EnableTaskWindows(WindowList); {$IFNDEF OCXVERSION} SetActiveWindow(ActiveWindow); {$ENDIF} {$ifdef IEHASFOCUSSTATE} RestoreFocusState(FocusState); {$endif} end; end; procedure TIECommonDialog.DoClose; begin if Assigned(fOnClose) then fOnClose(Self); end; procedure TOpenImageEnDialog.DoClose; begin inherited DoClose; {$IFDEF IEINCLUDEMULTIVIEW} fImageEnMView.Playing := false; fImageEnMView.clear; {$ENDIF} fImageEnView.Blank; if assigned(Application) then Application.HideHint; end; procedure TIECommonDialog.DoShow; begin if Assigned(fOnShow) then fOnShow(Self); end; function ExplorerHook(Wnd: HWnd; Msg: UINT; WParam: WPARAM; LParam: LPARAM): UINT; stdcall; begin Result := 0; if Msg = WM_INITDIALOG then begin CreationControl.fHandle := Wnd; CreationControl.fDefWndProc := Pointer(SetWindowLong(Wnd, GWL_WNDPROC, NativeInt(CreationControl.fObjectInstance))); CallWindowProc(CreationControl.fObjectInstance, Wnd, Msg, WParam, LParam); CreationControl := nil; end else if (Msg = WM_NOTIFY) and (PIEOFNotify(LParam)^.hdr.code = CDN_INITDONE) then IECenterWindow(GetWindowLong(Wnd, GWL_HWNDPARENT)); end; function TOpenImageEnDialog.BuildFilterStr(LimitToType : TIOFileType = -1; bMultiFrameSaveOnly : Boolean = False) : string; var q, w2: integer; sCommon, sLimitToFormat, sCommonFilter : string; c: char; w, cc : Integer; s1, s2, ex, anex : string; bIsSaveDialog: Boolean; bIncludeExt: Boolean; ShowEx: string; function _TrimRightSemi(const s : string) : string; begin Result := s; if (Length(Result) > 0) and (Result[Length(Result)] = ';') then SetLength(Result, Length(Result) - 1); end; begin IEUpdateGIFStatus; result := ''; sCommon := ''; sLimitToFormat := ''; bIsSaveDialog := self is TSaveImageEnDialog; if not (fShowFormats = iesfVideosOnly) then for q := 0 to IEGlobalSettings().FileFormats.Count - 1 do with TIEFileFormatInfo(IEGlobalSettings().FileFormats[q]) do begin if bIsSaveDialog = False then bIncludeExt := @ReadFunction <> nil else begin bIncludeExt := @WriteFunction <> nil; // Need only saveable multi-frame formats {$ifdef IEINCLUDEMULTIVIEW} if bIncludeExt and bMultiFrameSaveOnly then bIncludeExt := IsMultiFrameSaveFormat( FileType ); {$endif} end; if ( Extensions <> '' ) and bIncludeExt then begin ex := ''; cc := IEFileFormatGetExtCount(FileType); for w := 0 to cc - 1 do begin anex := '*.' + LowerCase(IEFileFormatGetExt(FileType, w)); ex := ex + anex + ';'; sCommon := sCommon + anex + ';'; end; // Remove trailing semi colon ex := _TrimRightSemi(ex); ShowEx := ex; if FileType = ioRAW then // too many extensions to show all ShowEx := '*.cr2;*.crw;*.dng;*.nef;*.raw;*.orf;*.nrw...'; // add the new item // Make JPEG the default type if FileType = ioJPEG then result := '|' + FullName + ' (' + ShowEx + ')|' + ex + result else result := result + '|' + FullName + ' (' + ShowEx + ')|' + ex; if FileType = LimitToType then sLimitToFormat := FullName + ' (' + ShowEx + ')|' + ex; end; end; // Video files if not (fShowFormats = iesfImagesOnly) then begin sCommon := sCommon + '*.avi;'; result := result + '|' + iemsg(IEMSG_VIDEOFORWINDOWS) + ' (*.avi)|*.avi'; if LimitToType = ioAVI then sLimitToFormat := iemsg(IEMSG_VIDEOFORWINDOWS) + ' (*.avi)|*.avi'; {$ifdef IEINCLUDEDIRECTSHOW} if not bIsSaveDialog then begin // MPEG sCommon := sCommon + '*.mpeg;*.mpg;'; result := result + '|MPEG Video (*.mpeg;*.mpg)|*.mpeg;*.mpg'; if LimitToType = ioMPEG then sLimitToFormat := 'MPEG Video (*.mpeg;*.mpg)|*.mpeg;*.mpg'; // WMV sCommon := sCommon + '*.wmv;'; result := result + '|Windows Media Video (*.wmv)|*.wmv'; if LimitToType = ioWMV then sLimitToFormat := 'Windows Media Video (*.wmv)|*.wmv'; end; {$endif} end; // Extended filters (example: 'Fun Bitmap|*.fun;*.fan|etc...' s1 := ''; // to result s2 := ''; // to all graphics q := 1; w2 := -1; while q <= length(fExtendedFilters) do begin c := fExtendedFilters[q]; if w2 = -1 then begin s1 := s1 + c; if c = '|' then w2 := q; end else begin if (c = '|') or (q = length(fExtendedFilters)) then begin w2 := -1; s1 := s1 + c; if c <> '|' then s2 := s2 + c; if q < length(fExtendedFilters) then s2 := s2 + ';'; end else begin s1 := s1 + c; s2 := s2 + c; end; end; inc(q); end; s1 := Trim(s1); s2 := Trim(s2); if s1 <> '' then result := result + '|' + s1; if (s1 <> '') and (sLimitToFormat <> '') then sLimitToFormat := sLimitToFormat + '|' + s1; if s2 <> '' then sCommon := sCommon + s2 + ';'; if bIsSaveDialog then begin if sLimitToFormat <> '' then Result := sLimitToFormat else result := Copy(result, 2, length(result)) end else begin if fShowFormats = iesfAllOnly then sCommonFilter := '' else sCommonFilter := iemsg(IEMSG_ALLCOMMONGRAPHICFILES) + '|' + _TrimRightSemi(sCommon) + '|'; if sLimitToFormat <> '' then Result := sLimitToFormat + '|' + // Users desired filter sCommonFilter + // ImageEn Supported Files iemsg(IEMSG_ALLFILES) + ' (*.*)|*.*' // All Files else result := sCommonFilter + // ImageEn Supported Files iemsg(IEMSG_ALLFILES) + ' (*.*)|*.*' + // All Files result; // Individual filters end; end; procedure TOpenImageEnDialog.SetLang; begin fPreviewButton.Hint := iemsg(IEMSG_PREVIEW); fPreviewCheck.Caption := iemsg(IEMSG_PREVIEW); fAdvancedButton.Caption := iemsg(IEMSG_ADVANCED) + '...'; {$IFDEF IEINCLUDEMULTIVIEW} FPlayButton.Hint := iemsg(IEMSG_ANIMATE); {$ENDIF} end; const ORIGThumbHeight = 109+80; ORIGThumbWidth = 100+75; ORIGHorizBorder = 4; ORIGVertBOrder = 4; constructor TOpenImageEnDialog.Create(AOwner: TComponent); begin inherited Create(AOwner); fOnPreviewFile := nil; fOnCreateCustomControls := nil; fOnDestroyCustomControls := nil; IEUpdateGIFStatus; fSelectedFrame := 0; fShowFormats := iesfImagesAndVideos; fShowAllFrames := true; fPreviewBorderStyle := iepsDefault; {$IFDEF IEINCLUDEMULTIVIEW} fAlwaysAnimate := false; {$ENDIF} fSelType := ''; fHistoryList := TStringList.Create; fOptions := [ofHideReadOnly]; fFiles := TStringList.Create; fFilesW := TIEWideStrings.Create; fFilterIndex := 1; fFilterDefault := -1; fFileEditStyle := fsEdit; fAutoAdjustDPI := false; fGetExifThumbnail := false; fFilteredAdjustDPI := false; fPreviewSize := iespDefault; fExtendedFilters := ''; // fShowPreview := true; fAutoSetFilter := true; fAutoSetFilterFileType := -1; Filter := BuildFilterStr; // fInfoPanel := TPanel.Create(Self); with fInfoPanel do begin Name := 'InfoPanel'; Caption := ''; Ctl3D := fCtl3D; SetBounds(204, 5, 169, 200); BevelOuter := bvNone; BorderWidth := 6; TabOrder := 1; end; fInfoLabel1 := TLabel.Create(Self); with fInfoLabel1 do begin Name := 'InfoLabel1'; Parent := fInfoPanel; Caption := ''; SetBounds(6, 6, 157, 23); AutoSize := true; end; fInfoLabel2 := TLabel.Create(Self); with fInfoLabel2 do begin Name := 'InfoLabel2'; Parent := fInfoPanel; Caption := ''; SetBounds(6, 29, 157, 23); AutoSize := true; end; fAdvancedButton := TButton.Create(Self); with FAdvancedButton do begin Name := 'AdvancedButton'; Parent := fInfoPanel; if fShowPlacesBar then SetBounds(474, 0, 75, 23) else SetBounds(333, 0, 75, 23); Enabled := true; visible := false; end; fPreviewCheck := TCheckBox.Create(Self); with fPreviewCheck do begin Name := 'PreviewCheck'; Parent := fInfoPanel; SetBounds(195, 0, 130, 23); Enabled := true; checked := true; visible := false; OnClick := DoCheckPreview; end; // fPicturePanel := TPanel.Create(Self); with fPicturePanel do begin Name := 'PicturePanel'; align := alLeft; Caption := ''; Ctl3D := fCtl3D; SetBounds(204, 5, 233, 200); // Also see SetPreviewSize BevelOuter := bvNone; BorderWidth := 6; TabOrder := 1; end; fPicLabel1 := TLabel.Create(Self); with fPicLabel1 do begin Name := 'PicLabel1'; Parent := fPicturePanel; Caption := ''; SetBounds(6, 180 + 80, 227, 23); // Also see SetPreviewSize AutoSize := true; end; fPicLabel2 := TLabel.Create(Self); with fPicLabel2 do begin Name := 'PicLabel2'; Parent := fPicturePanel; Caption := ''; SetBounds(6, 203 + 80, 227, 23); // Also see SetPreviewSize AutoSize := true; end; fPicLabel3 := TLabel.Create(Self); with fPicLabel3 do begin Name := 'PicLabel3'; Parent := fPicturePanel; Caption := ''; SetBounds(6, 226 + 80, 227, 23); // Also see SetPreviewSize AutoSize := true; end; fZoomComboBox := TComboBox.Create(Self); with fZoomComboBox do begin Name := 'ZoomCombo'; Parent := fPicturePanel; Style := csDropDownList; SetBounds(6, 5, 50+20, 21); Enabled := True; Hint := 'Zoom'; ParentShowHint := False; ShowHint := True; OnChange := ZoomComboChange; end; fPreviewButton := TSpeedButton.Create(Self); with fPreviewButton do begin Name := 'PreviewButton'; Parent := fPicturePanel; SetBounds(85, 5, 23, 22); Flat := True; Enabled := False; Glyph.LoadFromResourceName(HInstance, 'IDB_PREVIEW'); OnClick := PreviewClick; ShowHint := true; end; {$IFDEF IEINCLUDEMULTIVIEW} fPlayButton := TSpeedButton.Create(Self); with FPlayButton do begin Name := 'PlayButton'; Parent := fPicturePanel; SetBounds(60+20+30, 5, 23, 22); Flat := true; Enabled := false; groupindex := 1; allowallup := true; Glyph.LoadFromResourceName(HInstance, 'IDB_PLAY'); onclick := playclick; visible := true; ShowHint := true; end; {$ENDIF} fImageEnView := TImageEnVect.Create(Self); with fImageEnView do begin LegacyBitmap := false; Name := 'ImageEnView'; SetBounds(6, 36, 133 + 100, 139 + 78); // Also see SetPreviewSize TabOrder := 0; Cursor := crDefault; Ctl3d := fCtl3D; OnDblClick := PreviewClick; MouseInteract := [miScroll]; BorderStyle := bsSingle; Center := true; ZoomFilter := IEGlobalSettings().DefaultResampleFilter; DelayZoomFilter := false; EnableAlphaChannel := true; SetChessboardStyle(12, bsSolid); OnProgress := ImageEnIOProgress; IO.Params.OutputICCProfile.Clear; // this disables ICC loading Blank(); end; // {$IFDEF IEINCLUDEMULTIVIEW} fImageEnMView := TImageEnMView.Create(Self); with fImageEnMView do begin Name := 'ImageEnMView'; SetBounds(6, 36, 133 + 100, 139 + 78); // Also see SetPreviewSize TabOrder := 0; Cursor := crDefault; BorderStyle := bsSingle; Ctl3d := fCtl3D; MouseInteract := [mmiScroll, mmiSelect]; ScrollBars := ssHorizontal; KeyInteract := [mkiMoveSelected]; ThumbHeight := ORIGThumbHeight; ThumbWidth := ORIGThumbWidth; HorizBorder := ORIGHorizBorder; VertBorder := ORIGVertBorder; Visible := false; EnableAlphaChannel := true; FillThumbnail := false; Style := iemsFlat; SetChessboardStyle(12, bsSolid); OnImageSelect := OnMViewSelect; OnProgress := ImageEnIOProgress; OnAllDisplayed := DoAllDisplayed; SoftShadow.Enabled := true; end; {$ENDIF} fProgressBar := TProgressBar.Create(Self); with fProgressBar do begin Name := 'ProgressBar'; SetBounds(0, 55+35, 127+100, 19); min := 0; max := 100; Visible := false; end; SetLang; end; procedure TOpenImageEnDialog.OnMViewSelect(Sender: TObject; idx: integer); begin {$IFDEF IEINCLUDEMULTIVIEW} fSelectedFrame := idx; if fSelectedFrame<0 then fSelectedFrame := 0; if idx < fImageEnMView.MIO.ParamsCount then ShowIOParams(fImageEnMView.MIO.Params[idx]); {$ENDIF} end; destructor TOpenImageEnDialog.Destroy; begin FreeAndNil(fZoomComboBox); FreeAndNil(fPreviewButton); {$IFDEF IEINCLUDEMULTIVIEW} FreeAndNil(fPlayButton); {$ENDIF} FreeAndNil(fProgressBar); FreeAndNil(fPicLabel1); FreeAndNil(fPicLabel2); FreeAndNil(fPicLabel3); FreeAndNil(fInfolabel1); FreeAndNil(fInfoLabel2); FreeAndNil(fAdvancedButton); FreeAndNil(fPreviewCheck); {$IFDEF IEINCLUDEMULTIVIEW} FreeAndNil(fImageEnMView); {$ENDIF} FreeAndNil(fImageEnView); FreeAndNil(fInfoPanel); FreeAndNil(fPicturePanel); // FreeAndNil(fFiles); FreeAndNil(fFilesW); FreeAndNil(fHistoryList); inherited Destroy; end; function TOpenImageEnDialog.CanClose(var OpenFileName: TIEOpenFileNameEx): Boolean; begin GetFileNames(OpenFileName); Result := DoCanClose; fFiles.Clear; fFilesW.Clear; end; function wstrlen(s: PWideChar): Integer; begin result := 0; while s^ <> #0 do begin inc(s); inc(result); end; end; function TIECommonDialog.ExtractFilter(ss: pointer; idx: integer): WideString; var sa: PAnsiChar; sw: PWideChar; begin if IEGlobalSettings().UnicodeOS then begin sw := ss; while idx > 1 do begin inc(sw, wstrlen(sw) + 1); inc(sw, wstrlen(sw) + 1); dec(idx); end; inc(sw, wstrlen(sw) + 1); result := WideString(sw); end else begin sa := ss; while idx > 1 do begin inc(sa, IEStrLen(sa) + 1); inc(sa, IEStrLen(sa) + 1); dec(idx); end; inc(sa, IEStrLen(sa) + 1); result := WideString(AnsiString(sa)); end; end; procedure TOpenImageEnDialog.WndProc(var Message: TMessage); var Index, q: integer; ss: WideString; begin Message.Result := 0; if (Message.Msg = WM_INITDIALOG) and not (ofOldStyleDialog in Options) then exit else if (Message.Msg = WM_NOTIFY) then case (PIEOFNotify(Message.LParam)^.hdr.code) of CDN_FILEOK: begin if not CanClose(PIEOFNotify(Message.LParam)^.lpOFN^) then begin Message.Result := 1; SetWindowLong(Handle, DWL_MSGRESULT, Message.Result); Exit; end; end; CDN_INITDONE: begin fSelType := ExtractFilter(PIEOFNotify(Message.LParam)^.lpOFN^.lpstrFilter, fCurrentFilterIndex); if assigned(fWatchTimer) then fWatchTimer.Enabled := True; DoShow; end; CDN_SELCHANGE: DoSelectionChange; CDN_FOLDERCHANGE: DoFolderChange; CDN_TYPECHANGE: begin Index := PIEOFNotify(Message.LParam)^.lpOFN^.nFilterIndex; fSelType := ExtractFilter(PIEOFNotify(Message.LParam)^.lpOFN^.lpstrFilter, Index); ss := fSelType; Delete(ss, 1, 1); q := pos(';', ss); Delete(ss, q, length(ss)); if IEGlobalSettings().UnicodeOS then PIEOFNotify(Message.LParam)^.lpOFN^.lpstrDefExt := PWideChar(ss) else PIEOFNotify(Message.LParam)^.lpOFN^.lpstrDefExt := PAnsiChar(AnsiString(ss)); if Index <> fCurrentFilterIndex then begin fCurrentFilterIndex := Index; DoTypeChange; end; end; end; inherited WndProc(Message); end; function TOpenImageEnDialog.DoCanClose: Boolean; begin Result := True; if Assigned(fOnCanClose) then fOnCanClose(Self, Result); end; procedure TOpenImageEnDialog.DoFolderChange; begin if Assigned(fOnFolderChange) then fOnFolderChange(Self); end; procedure TOpenImageEnDialog.DoTypeChange; begin if Assigned(fOnTypeChange) then fOnTypeChange(Self); end; procedure TOpenImageEnDialog.ReadFileEditStyle(Reader: TReader); begin Reader.ReadIdent; end; procedure TOpenImageEnDialog.DefineProperties(Filer: TFiler); begin inherited DefineProperties(Filer); Filer.DefineProperty('FileEditStyle', ReadFileEditStyle, nil, False); end; function TOpenImageEnDialog.FileExtToFilterIndex(e : string; bExcludeCommon : Boolean = False) : integer; // NPC: 27/10/11 {$IFNDEF IEHASPOSEX} function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer; var I, X: Integer; Len, LenSubStr: Integer; begin if Offset = 1 then Result := Pos(SubStr, S) else begin I := Offset; LenSubStr := Length(SubStr); Len := Length(S) - LenSubStr + 1; while I <= Len do begin if S[I] = SubStr[1] then begin X := 1; while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do Inc(X); if (X = LenSubStr) then begin Result := I; exit; end; end; Inc(I); end; Result := 0; end; end; {$ENDIF} var q, q2, w, z, i : integer; begin e := LowerCase(e); q := Pos(e, Filter); // Exclude "Common File Types which is shown in the open dialog if bExcludeCommon and (( self is TSaveImageEnDialog) = False ) then begin q2 := q; for i := 1 to 2 do q2 := PosEx(e, Filter, q2 + 1); if q2 > 0 then q := q2; end; z := 0; for w := 1 to q do if Filter[w] = '|' then inc(z); result := ( z div 2 ) + 1; end; function TOpenImageEnDialog.FileTypeToFilterIndex(FileType : TIOFileType) : integer; // NPC: 27/10/11 var e : string; begin Result := 0; e := IEFileFormatGetExt(FileType, 0); if e <> '' then Result := FileExtToFilterIndex('.' + e, True); end; function WideStrScan(const Str: PWideChar; Chr: WideChar): PWideChar; begin Result := Str; while Result^ <> Chr do begin if Result^ = #0 then begin Result := nil; Exit; end; Inc(Result); end; end; function TOpenImageEnDialog.DoExecute(Func: Pointer): Bool; const MultiSelectBufferSize = High(Word) - 16; OpenOptions: array[TOpenOption] of DWORD = ( OFN_READONLY, OFN_OVERWRITEPROMPT, OFN_HIDEREADONLY, OFN_NOCHANGEDIR, OFN_SHOWHELP, OFN_NOVALIDATE, OFN_ALLOWMULTISELECT, OFN_EXTENSIONDIFFERENT, OFN_PATHMUSTEXIST, OFN_FILEMUSTEXIST, OFN_CREATEPROMPT, OFN_SHAREAWARE, OFN_NOREADONLYRETURN, OFN_NOTESTFILECREATE, OFN_NONETWORKBUTTON, OFN_NOLONGNAMES, OFN_EXPLORER, OFN_NODEREFERENCELINKS, OFN_ENABLEINCLUDENOTIFY, OFN_ENABLESIZING {$ifdef IEHASOPENOPTIONSEX} , OFN_DONTADDTORECENT, OFN_FORCESHOWHIDDEN {$endif} ); function AllocFilterStrW(const S: WideString): WideString; var P: PWideChar; begin Result := ''; if S <> '' then begin Result := S + #0; P := WideStrScan(PWideChar(Result), '|'); while P <> nil do begin P^ := #0; Inc(P); P := WideStrScan(P, '|'); end; end; end; function AllocFilterStrA(const S: AnsiString): AnsiString; var P: PAnsiChar; begin Result := ''; if S <> '' then begin Result := S + #0; P := IEAnsiStrScan(PAnsiChar(Result), '|'); while P <> nil do begin P^ := #0; Inc(P); P := IEAnsiStrScan(P, '|'); end; end; end; var Option: TOpenOption; OpenFilename: TIEOpenFileNameEx; TempFilterW, TempFilenameW, TempExt: WideString; TempFilterA, TempFilenameA: AnsiString; q: integer; OpenFileNameEx: TIEOpenFileNameEx; begin {$IFDEF IEINCLUDEMULTIVIEW} fPlayButton.visible := not fAlwaysAnimate; {$ENDIF} fSelectedFrame := 0; fFiles.Clear; fFilesW.Clear; FillChar(OpenFileName, SizeOf(OpenFileName), 0); OpenFileNameExShadow := @OpenFileName; with OpenFilename do begin {$IFDEF Delphi6orNewer} if (Win32MajorVersion >= 5) and (Win32Platform = VER_PLATFORM_WIN32_NT) or { Win2k }((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and (Win32MajorVersion >= 4) and (Win32MinorVersion >= 90)) then { WinME } lStructSize := SizeOf(TOpenFilenameW) else lStructSize := SizeOf(TOpenFilenameW) - (SizeOf(DWORD) shl 1) - SizeOf(Pointer); { subtract size of added fields } {$ELSE} lStructSize := SizeOf(TOpenFilenameW); {$ENDIF} hInstance := SysInit.HInstance; if ofAllowMultiSelect in fOptions then nMaxFile := MultiSelectBufferSize else nMaxFile := MAX_PATH; if FileNameW <> '' then fFilterIndex := FileExtToFilterIndex(IEExtractFileExtS(FileNameW)); if ( fFilterDefault > ioUnknown ) and (( FileNameW = '' ) or ( IEFilenameToFileFormat( FileNameW ) = fFilterDefault ))then fFilterIndex := FileTypeToFilterIndex(fFilterDefault); if fFilterIndex = 0 then fFilterIndex := 1; nFilterIndex := fFilterIndex; fCurrentFilterIndex := fFilterIndex; if IEGlobalSettings().UnicodeOS then begin // lpstrFilter TempFilterW := AllocFilterStrW(fFilter); lpstrFilter := PWideChar(TempFilterW); // lpstrFile SetLength(TempFilenameW, nMaxFile + 2); FillChar(TempFilenameW[1], sizeof(WideChar)*(nMaxFile+2), 0); lpstrFile := PWideChar(TempFilenameW); CopyMemory(@TempFilenameW[1], @fFileNameW[1], imin(length(fFileNameW), nMaxFile)*sizeof(WideChar)); // lpstrInitialDir lpstrInitialDir := PWideChar(WideString(fInitialDir)); // lpstrTitle lpstrTitle := PWideChar(WideString(fTitle)); end else begin // lpstrFilter TempFilterA := AllocFilterStrA(AnsiString(fFilter)); lpstrFilter := PAnsiChar(TempFilterA); // lpstrFile SetLength(TempFilenameA, nMaxFile + 1); FillChar(TempFilenameA[1], sizeof(AnsiChar)*(nMaxFile+1), 0); lpstrFile := PAnsiChar(TempFilenameA); CopyMemory(@TempFilenameA[1], @AnsiString(fFileNameW)[1], imin(length(fFileNameW), nMaxFile)*sizeof(AnsiChar)); // lpstrInitialDir lpstrInitialDir := PAnsiChar(AnsiString(fInitialDir)); // lpstrTitle lpstrTitle := PAnsiChar(AnsiString(fTitle)); end; Flags := OFN_ENABLEHOOK; for Option := Low(Option) to High(Option) do if Option in fOptions then Flags := Flags or OpenOptions[Option]; if NewStyleControls then Flags := Flags xor OFN_EXPLORER else Flags := Flags and not OFN_EXPLORER; TempExt := fDefaultExt; if (TempExt = '') and (Flags and OFN_EXPLORER = 0) then begin TempExt := IEExtractFileExtW(fFilenameW); Delete(TempExt, 1, 1); end; if TempExt = '' then begin TempExt := ExtractFilter(lpstrFilter, fCurrentFilterIndex); Delete(TempExt, 1, 1); q := pos(';', TempExt); Delete(TempExt, q, length(TempExt)); end; if IEGlobalSettings().UnicodeOS then lpstrDefExt := PWideChar(TempExt) else lpstrDefExt := PAnsiChar(AnsiString(TempExt)); if (ofOldStyleDialog in Options) or not NewStyleControls then lpfnHook := DialogHook else lpfnHook := ExplorerHook; if Template <> nil then begin Flags := Flags or OFN_ENABLETEMPLATE; if IEGlobalSettings().UnicodeOS then lpTemplateName := Template else lpTemplateName := PAnsiChar(AnsiString(WideString(Template))); end; {$ifndef OCXVERSION} if assigned(Application) then begin {$ifdef IEHASACTIVEFORMHANDLE} // V5.2.1: Changed from Application.ActiveFormHandle to address loss of Windows messages from calling component hWndOwner := Application.Handle {$else} hWndOwner := Application.Handle {$endif} end else hWndOwner := IEFindHandle(Owner); {$else} hWndOwner := IEFindHandle(Owner); {$endif} if IEGlobalSettings().OpSys <> ieosWin98 then begin Move(OpenFileName, OpenFileNameEx, sizeof(OpenFileName)); if fShowPlacesBar then OpenFileNameEx.FlagsEx := 0 else OpenFileNameEx.FlagsEx := 1; OpenFileNameEx.lStructSize := sizeof(TIEOpenFileNameEx); Result := TaskModalDialog(Func, OpenFileNameEx); Move(OpenFileNameEx, OpenFileName, SizeOf(OpenFileName)); end else Result := TaskModalDialog(Func, OpenFileName); if Result then begin GetFileNames(OpenFilename); if (Flags and OFN_EXTENSIONDIFFERENT) <> 0 then Include(fOptions, ofExtensionDifferent) else Exclude(fOptions, ofExtensionDifferent); if (Flags and OFN_READONLY) <> 0 then Include(fOptions, ofReadOnly) else Exclude(fOptions, ofReadOnly); fFilterIndex := nFilterIndex; end; end; end; function WideStrEnd(s: PWideChar): PWideChar; begin result := s; while result^ <> #0 do inc(result); end; function AnsiStrEnd(s: PAnsiChar): PAnsiChar; begin result := s; while result^ <> #0 do inc(result); end; procedure TOpenImageEnDialog.GetFileNames(var OpenFileName: TIEOpenFileNameEx); var SeparatorW: WideChar; SeparatorA: AnsiChar; function ExtractFileNameW(P: PWideChar; var S: WideString): PWideChar; begin Result := WideStrScan(P, SeparatorW); if Result = nil then begin S := WideString(P); Result := WideStrEnd(P); end else begin SetString(S, P, Result - P); Inc(Result); end; end; procedure ExtractFileNamesW(P: PWideChar); var DirName, FileName: WideString; begin P := ExtractFileNameW(P, DirName); P := ExtractFileNameW(P, FileName); if FileName = '' then begin fFiles.Add(DirName); fFilesW.Add(DirName); end else begin if AnsiLastChar(DirName)^ <> '\' then DirName := DirName + '\'; repeat if (FileName[1] <> '\') and ((Length(FileName) <= 3) or (FileName[2] <> ':') or (FileName[3] <> '\')) then FileName := DirName + FileName; fFiles.Add(FileName); fFilesW.Add(FileName); P := ExtractFileNameW(P, FileName); until FileName = ''; end; end; function ExtractFileNameA(P: PAnsiChar; var S: AnsiString): PAnsiChar; begin Result := IEAnsiStrScan(P, SeparatorA); if Result = nil then begin S := AnsiString(P); Result := AnsiStrEnd(P); end else begin SetString(S, P, Result - P); Inc(Result); end; end; procedure ExtractFileNamesA(P: PAnsiChar); var DirName, FileName: AnsiString; begin P := ExtractFileNameA(P, DirName); P := ExtractFileNameA(P, FileName); if FileName = '' then begin fFiles.Add(string(DirName)); fFilesW.Add(WideString(DirName)); end else begin if AnsiLastChar(string(DirName))^ <> '\' then DirName := DirName + '\'; repeat if (FileName[1] <> '\') and ((Length(FileName) <= 3) or (FileName[2] <> ':') or (FileName[3] <> '\')) then FileName := DirName + FileName; fFiles.Add(string(FileName)); fFilesW.Add(WideString(FileName)); P := ExtractFileNameA(P, FileName); until FileName = ''; end; end; var sa: AnsiString; begin SeparatorA := #0; SeparatorW := #0; if (ofAllowMultiSelect in fOptions) and ((ofOldStyleDialog in fOptions) or not NewStyleControls) then begin SeparatorA := ' '; SeparatorW := ' '; end; with OpenFileName do begin if ofAllowMultiSelect in fOptions then begin if IEGlobalSettings().UnicodeOS then ExtractFileNamesW(lpstrFile) else ExtractFileNamesA(lpstrFile); fFileNameW := fFilesW[0]; end else begin if IEGlobalSettings().UnicodeOS then ExtractFileNameW(lpstrFile, fFileNameW) else begin ExtractFileNameA(lpstrFile, sa); fFileNameW := WideString(sa); end; fFiles.Add(fFileNameW); fFilesW.Add(fFileNameW); end; end; end; function TOpenImageEnDialog.GetStaticRect: TRect; begin if fHandle <> 0 then begin if not (ofOldStyleDialog in Options) then begin GetWindowRect(GetDlgItem(fHandle, stc32), Result); MapWindowPoints(0, fHandle, Result, 2); end else GetClientRect(fHandle, Result) end else Result := Rect(0, 0, 0, 0); end; function TOpenImageEnDialog.GetLongFileName: WideString; var PathW: PWideChar; PathA: PAnsiChar; begin if NewStyleControls and (fHandle <> 0) then begin if IEGlobalSettings().UnicodeOS then begin getmem(PathW, 65536 * SizeOf(WideChar)); try GetDlgItemTextW(GetParent(fHandle), cmb13, PathW, 65535); Result := IEExtractFilePathW(GetFileName) + WideString(PathW); finally freemem(PathW); end; end else begin getmem(PathA, 65536 * SizeOf(AnsiChar)); try GetDlgItemTextA(GetParent(fHandle), cmb13, PathA, 65535); Result := IEExtractFilePathW(GetFileName) + WideString(AnsiString(PathA)); finally freemem(PathA); end; end; end else Result := fFileNameW; end; function TOpenImageEnDialog.GetFileName: TFileName; begin result := TFileName(GetFileNameW); end; function TOpenImageEnDialog.GetFileNameW: WideString; var PathW: array[0..MAX_PATH] of WideChar; PathA: array[0..MAX_PATH] of AnsiChar; begin if NewStyleControls and (fHandle <> 0) then begin if IEGlobalSettings().UnicodeOS then begin SendMessageW(GetParent(fHandle), CDM_GETFILEPATH, Length(PathW), NativeInt(@PathW)); Result := WideString(PathW); end else begin SendMessageA(GetParent(fHandle), CDM_GETFILEPATH, Length(PathA), NativeInt(@PathA)); Result := WideString(AnsiString(PathA)); end; end else Result := fFileNameW; end; // only file name function TOpenImageEnDialog.GetFileName2: WideString; var PathW: array[0..MAX_PATH] of WideChar; PathA: array[0..MAX_PATH] of AnsiChar; begin if NewStyleControls and (fHandle <> 0) then begin if IEGlobalSettings().UnicodeOS then begin SendMessageW(GetParent(fHandle), CDM_GETSPEC, Length(PathW), NativeInt(@PathW)); Result := WideString(PathW); end else begin SendMessageA(GetParent(fHandle), CDM_GETSPEC, Length(PathA), NativeInt(@PathA)); Result := WideString(AnsiString(PathA)); end; end else Result := fFileNameW; end; function TOpenImageEnDialog.GetFilterIndex: Integer; begin if fHandle <> 0 then Result := fCurrentFilterIndex else Result := fFilterIndex; end; procedure TOpenImageEnDialog.SetHistoryList(Value: TStrings); begin fHistoryList.Assign(Value); end; procedure TOpenImageEnDialog.SetInitialDir(const Value: string); var L: Integer; begin L := Length(Value); if (L > 1) and IsPathDelimiter(Value, L) and not IsDelimiter(':', Value, L - 1) then Dec(L); fInitialDir := Copy(Value, 1, L); end; function TOpenImageEnDialog.Execute: Boolean; begin if assigned(fOnCreateCustomControls) then fOnCreateCustomControls(self); try if fPreviewSize = iespLarge then Template := 'IDD_IETEMPLATE2' else Template := 'IDD_IETEMPLATE'; SetLang; fPreviewCheck.visible := true; if fAutoSetFilter then Filter := BuildFilterStr(fAutoSetFilterFileType); if IEGlobalSettings().UnicodeOS then Result := DoExecute(@GetOpenFileNameW) else Result := DoExecute(@GetOpenFileNameA); finally if assigned(fOnDestroyCustomControls) then fOnDestroyCustomControls(self); fPicturePanel.ParentWindow := 0; fInfoPanel.ParentWindow := 0; end; end; function GetFirstFileName(s: WideString): WideString; var path: WideString; names: WideString; cur: WideString; quot: Boolean; i: Integer; begin path := IEExtractFilePathW(s); names := IEExtractFileNameW(s) + ' '; if names[1]<>#34 then // single file name, fail result := '' else begin // multiple file names cur := ''; quot := false; for i := 1 to length(names) do begin if names[i] = #34 then quot := not quot else if (names[i] = #32) and not quot then break else cur := cur + names[i]; end; result := path + cur; end; end; function TOpenImageEnDialog.NeedLoadPreviewFullSize: Boolean; const Maximum_Thumbnail_Load_Size = 10; begin Result := SelectedZoom >= Maximum_Thumbnail_Load_Size; end; function TOpenImageEnDialog.LoadPreview(LoadImage, FullSize: Boolean) : Boolean; function ValidFile(const FileName: WideString): Boolean; begin if IEGlobalSettings().UnicodeOS then result := GetFileAttributesW(PWideChar(FileName)) <> $FFFFFFFF else result := GetFileAttributesA(PAnsiChar(AnsiString(FileName))) <> $FFFFFFFF; end; var sFilename: WideString; CursorBak: TCursor; ss: WideString; {$IFDEF IEINCLUDEMULTIVIEW} ff: TIOFileType; additionalMultipageExts: TStringList; {$ENDIF} begin if ofAllowMultiSelect in Options then begin sFilename := GetFirstFileName(GetLongFileName); // first file name is the last selected if sFilename = '' then sFilename := FileNameW; end else begin sFilename := FileNameW; end; // Valid picture? Result := IEFileExistsW(sFilename) and ValidFile(sFilename); fPreviewButton.Enabled := Result; if Result = False then exit; fPreviewIsFullSize := True; try fFileSize := IEGetFileSize(sFilename); // fFileSize is assignable only here (!?) if not LoadImage then begin // do not show the image if assigned(fOnPreviewFile) then fOnPreviewFile(self, fImageEnView, sFilename, true) else fImageEnView.IO.ParamsFromFile(WideString(sFilename)); fFrames := 1; if fImageEnView.IO.Params.FileType <> ioUnknown then ShowIOParams(fImageEnView.IO.Params) else ShowIOParams(nil); end else begin // show the image CursorBak := Screen.Cursor; try Screen.Cursor := crHourGlass; fImageEnView.blank; fImageEnView.Paint; {$IFDEF IEINCLUDEMULTIVIEW} fImageEnMView.Clear; fImageEnMView.Paint; fPlayButton.down := false; {$ENDIF} ss := IEExtractFileExtS(sFilename); {$IFDEF IEINCLUDEMULTIVIEW} ff := FindFileFormat(WideString(sFilename), ffContentOnly); additionalMultipageExts := TStringList.Create; additionalMultipageExts.CommaText := LowerCase(IEGlobalSettings().PreviewAdditionalMultipageExts); if ( (ff=ioAVI) or ((ff=ioGIF) and (@IEFileFormatGetInfo(ioGIF).ReadFunction <> nil) and (EnumGIFIm(WideString(sFilename)) > 1)) or ((ff=IOTIFF) and (EnumTIFFIm(WideString(sFilename)) > 1)) or (ff=ioDCX) or (additionalMultipageExts.IndexOf( copy(ss, 2, length(ss)) ) > -1) {$ifdef IEINCLUDEDICOM} or ((ff=ioDICOM) and (IEGetFileFramesCount(WideString(sFilename))>1)) {$endif} {$ifdef IEINCLUDEWIC} or ((ff=ioHDP) and IEWICAvailable() and (IEGetFileFramesCount(WideString(sFilename))>1)) {$endif} ) and fShowAllFrames then begin // animated images fImageEnMView.ThumbWidth := ORIGThumbWidth; fImageEnMView.ThumbHeight := ORIGThumbHeight; fImageEnMView.HorizBorder := ORIGHorizBorder; fImageEnMView.VertBorder := ORIGVertBorder; fPlayButton.enabled := true; fZoomComboBox.enabled := false; fImageEnMView.show; fImageEnView.hide; with fProgressBar do begin Parent := fImageEnMView; position := 0; show; repaint; end; fImageEnMView.MIO.AutoAdjustDPI := fAutoAdjustDPI; fImageEnMView.MIO.FilteredAdjustDPI := fFilteredAdjustDPI; if assigned(fOnPreviewFile) then fOnPreviewFile(self, fImageEnMView, sFilename, false) else fImageEnMView.LoadFromFileOnDemand(WideString(sFilename)); fFrames := fImageEnMView.MIO.ParamsCount; fImageEnMView.SelectSeek(iskFirst); fPreviewButton.Enabled := True; fZoomComboBox.Enabled := False; if fFrames>0 then ShowIOParams(fImageEnMView.MIO.Params[0]); if fAlwaysAnimate and ((ss = '.avi') or ((ss = '.gif') and (@IEFileFormatGetInfo(ioGIF).ReadFunction <> nil))) then begin fPlayButton.down := True; PlayClick(self); end; end else begin // static images fPlayButton.enabled := false; {$ENDIF} fZoomComboBox.enabled := true; fImageEnView.Show; {$IFDEF IEINCLUDEMULTIVIEW} fImageEnMView.hide; {$ENDIF} with fProgressBar do begin Parent := fImageEnView; position := 0; show; repaint; end; if FullSize then begin fImageEnView.IO.Params.Width := Screen.Width; fImageEnView.IO.Params.Height := Screen.Height; fImageEnView.IO.Params.JPEG_Scale := ioJPEG_AUTOCALC; {$ifdef IEINCLUDERAWFORMATS} fImageEnView.IO.Params.RAW_HalfSize := true; // Keep as true. Raw files will invariably be huge {$endif} fImageEnView.IO.Params.GetThumbnail := False; end else begin // Scaled or embedded thumbnail size fImageEnView.IO.Params.Width := fImageEnView.Width; fImageEnView.IO.Params.Height := fImageEnView.Height; fImageEnView.IO.Params.JPEG_Scale := ioJPEG_AUTOCALC; {$ifdef IEINCLUDERAWFORMATS} fImageEnView.IO.Params.RAW_HalfSize := true; {$endif} fImageEnView.IO.Params.GetThumbnail := fGetExifThumbnail; // BUT show thumbnail for layer files if smaller than the window fImageEnView.IO.Params.IEN_GetThumbnail := ( fImageEnView.Width <= IEGlobalSettings().ThumbnailSize ) and ( fImageEnView.Height <= IEGlobalSettings().ThumbnailSize ); fPreviewIsFullSize := False; end; fImageEnView.IO.AutoAdjustDPI := fAutoAdjustDPI; fImageEnView.IO.FilteredAdjustDPI := fFilteredAdjustDPI; fImageEnView.RemoveAllObjects; fImageEnView.LayersClear; if assigned(fOnPreviewFile) then fOnPreviewFile(self, fImageEnView, sFilename, false) else begin fImageEnView.IO.LoadFromFileAuto(WideString(sFilename)); fImageEnView.LayersMergeAll( True ); end; if fImageEnView.IO.Params.FileType = ioAVI then fFrames := fImageEnView.IO.Params.AVI_FrameCount else if fImageEnView.IO.Params.FileType = ioGIF then fFrames := EnumGIFIm(WideString(sFilename)) else if fImageEnView.IO.Params.FileType = ioTIFF then fFrames := EnumTIFFIm(WideString(sFilename)) else if fImageEnView.IO.Params.FileType = ioICO then fFrames := EnumICOIm(WideString(sFilename)) else if fImageEnView.IO.Params.FileType = ioDCX then fFrames := EnumDCXIm(WideString(sFilename)) {$ifdef IEINCLUDEDICOM} else if fImageEnView.IO.Params.FileType = ioDICOM then fFrames := IEGetFileFramesCount(WideString(sFilename)) {$endif} {$ifdef IEINCLUDEWIC} else if fImageEnView.IO.Params.FileType = ioHDP then fFrames := IEGetFileFramesCount(WideString(sFilename)) {$endif} else fFrames := 1; // Minimize reloading if we launch a preview if (fImageEnView.IO.Params.FileType in [ioJPEG, ioRaw]) = False then fPreviewIsFullSize := True; ShowIOParams(fImageEnView.IO.Params); fPreviewButton.Enabled := True; fZoomComboBox.Enabled := true; {$IFDEF IEINCLUDEMULTIVIEW} end; additionalMultipageExts.Free; {$ENDIF} SetZoom; finally Screen.Cursor := CursorBak; fProgressBar.hide; end; end; // if LoadImage except Result := False; end; end; procedure TOpenImageEnDialog.DoSelectionChange; var bLoadedPreview: Boolean; begin if m_blnInSelectionChange then Exit; if (not fShowPreview) then begin if Assigned(fOnSelectionChange) then fOnSelectionChange(Self); exit; end; m_blnInSelectionChange := True; try bLoadedPreview := LoadPreview( fPreviewCheck.Checked, NeedLoadPreviewFullSize ); if not bLoadedPreview then begin fInfoLabel1.Caption := ''; fInfoLabel2.Caption := ''; fPreviewButton.Enabled := False; fZoomComboBox.Enabled := false; fImageEnView.blank; fPicLabel1.Caption := ''; fPicLabel2.Caption := ''; fPicLabel3.Caption := ''; {$IFDEF IEINCLUDEMULTIVIEW} fImageEnMView.Clear; fPlayButton.Enabled := false; {$ENDIF} end; if Assigned(fOnSelectionChange) then fOnSelectionChange(Self); finally m_blnInSelectionChange := False; end; end; procedure TOpenImageEnDialog.PreviewClick(Sender: TObject); var PreviewForm: TForm; begin PreviewForm := TForm.Create(Self); with PreviewForm do try Name := 'PreviewForm'; Caption := Self.FileNameW; BorderStyle := bsSizeToolWin; KeyPreview := True; Position := poScreenCenter; OnKeyPress := PreviewKeyPress; if ( fImageEnView.IsEmpty and ( fImageEnMView.ImageCount = 0 )) or ( fPreviewIsFullSize = False ) then LoadPreview( True, True ); // get full size image with TImageEnVect.Create(PreviewForm) do begin Name := 'ImageEnView'; Parent := PreviewForm; Align := alClient; Cursor := crDefault; MouseInteract := [miScroll, miZoom]; if fImageEnView.visible then Assign(fImageEnView) {$IFDEF IEINCLUDEMULTIVIEW} else if fImageEnMView.visible then Assign(fImageEnMView.Bitmap); {$ENDIF}; Background := IEGlobalSettings().PreviewImageBackgroundColor; BackgroundStyle := IEGlobalSettings().PreviewImageBackgroundStyle; EnableAlphaChannel := True; Center := True; ScrollBars := ssBoth; if (Bitmap.Width > 100) then begin if (Bitmap.Width < Screen.Width) then PreviewForm.ClientWidth := Bitmap.Width else PreviewForm.Width := Round(Screen.Width * 0.8); end else PreviewForm.Width := 100; if (Bitmap.Height > 100) then begin if (Bitmap.Height < Screen.Height) then PreviewForm.ClientHeight := Bitmap.Height else PreviewForm.Height := Round(Screen.Height * 0.8); end else PreviewForm.Height := 100; end; ShowModal; finally Free; end; end; procedure TOpenImageEnDialog.PlayClick(Sender: TObject); begin {$IFDEF IEINCLUDEMULTIVIEW} fImageEnMView.Playing := fPlayButton.down; fPreviewButton.Enabled := not fPlayButton.down; //fZoomComboBox.Enabled := not fPlayButton.down; if fImageEnMView.Playing then begin fImageEnMView.ThumbWidth := fImageEnMView.Width - IEGlobalSettings().EdgeX * 2; fImageEnMView.ThumbHeight := fImageEnMView.Height - IEGlobalSettings().EdgeY * 2; fImageEnMView.HorizBorder := 0; fImageEnMView.VertBorder := 0; end; {$ENDIF} end; procedure TOpenImageEnDialog.PreviewKeyPress(Sender: TObject; var Key: Char); begin if Key = #27 then TForm(Sender).Close; end; procedure TOpenImageEnDialog.ZoomComboChange(Sender: TObject); begin SetZoom; end; procedure TOpenImageEnDialog.ImageEnIOProgress(Sender: TObject; per: integer); begin fProgressBar.position := per; end; function ConcatAndIns(const Value1, Value2: string; const sDelimiter: string = ','): string; begin if (Value1 <> '') and (Value2 <> '') then Result := Value1 + sDelimiter + Value2 else Result := Value1 + Value2; end; // if params=nil then empties fields procedure TOpenImageEnDialog.ShowIOParams(params: TIOParams); const SIXTEEN_MILLION_COLORS = 16777216; INCLUDE_COLOR_BIT_COUNT = False; function _ColorCountToStr(iColors : Integer) : string; var bEnglish: Boolean; begin bEnglish := (IEGlobalSettings().MsgLanguage = msEnglish) or ((IEGlobalSettings().MsgLanguage = msSystem) and (syslocale.PriLangID = LANG_ENGLISH)); if bEnglish and (iColors = SIXTEEN_MILLION_COLORS) then result := '16M' else result := string(IEIntToFormattedStr(iColors)); end; var ss: string; mdim, bitcount, ww, hh: integer; sSize: string; begin if assigned(Params) then begin with Params do begin ww := OriginalWidth; hh := OriginalHeight; // Width X Height Pixel (frames) if (ww>0) and (hh>0) then sSize := IntToStr(ww) + ' x ' + IntToStr(hh) + ' '+iemsg(IEMSG_PIXELS) else sSize := ''; if fFrames > 1 then sSize := ConcatAndIns(sSize, IntToStr(fFrames) + ' ' + iemsg(IEMSG_FRAMES), ', '); // xxx colors if (SamplesPerPixel = 4) and (BitsPerSample = 8) then ss := _ColorCountToStr(SIXTEEN_MILLION_COLORS) else if (SamplesPerPixel = 3) and (BitsPerSample = 16) then ss := '48 bit' else ss := _ColorCountToStr(1 shl (SamplesPerPixel * BitsPerSample)); ss := ss + ' ' + iemsg(IEMSG_COLORS); if INCLUDE_COLOR_BIT_COUNT then begin ss := ss + ' (' + IntToStr(SamplesPerPixel * BitsPerSample) + ' '+iemsg(IEMSG_BIT)+')'; end; fPicLabel2.caption := ConcatAndIns(sSize, ss, ', '); // file size ss := string(IEBytesToStr(fFileSize, 1024)) + ' (' + iemsg(IEMSG_FILE) + ')'; // memory size // solo pf1bit e pf24bit sono attualmente supportati if (SamplesPerPixel = 1) and (BitsPerSample = 1) then bitcount := 1 else bitcount := 24; mdim := (((ww * BitCount) + 31) div 32) * 4 * hh; // only one frames is calculated ss := ss + ', ' + string(IEBytesToStr(mdim, 1024)) + ' (' + iemsg(IEMSG_MEM) + ')'; if fShowPreview then fInfoLabel2.Caption := '' else fInfoLabel2.Caption := ss; fPicLabel3.caption := ss; // compression ss := FileTypeStr; if fShowPreview then fInfoLabel1.Caption := '' else fInfoLabel1.Caption := ss; fPicLabel1.caption := ss; end; end else begin fPicLabel1.caption := ''; fPicLabel3.caption := ''; fPicLabel2.caption := ''; fInfoLabel2.Caption := ''; fInfoLabel1.Caption := ''; end; end; // Result is -1 if Zoom box is set to Autofit, otherwise a zoom level, e.g. 100 function TOpenImageEnDialog.SelectedZoom : Integer; var intItemIndex: integer; begin Result := -1; if not Assigned(fZoomComboBox) then Exit; if not Assigned(fImageEnView) then Exit; intItemIndex := fZoomComboBox.ItemIndex; if (intItemIndex < 0) then Exit; if Assigned(fZoomComboBox.Items.Objects[intItemIndex]) then Result := Integer(fZoomComboBox.Items.Objects[intItemIndex]) end; procedure TOpenImageEnDialog.SetZoom; begin if (Assigned(fZoomComboBox) = False) or (Assigned(fImageEnView) = False) then Exit; if SelectedZoom > 0 then begin fImageEnView.LockPaint; if (fPreviewIsFullSize = False) and NeedLoadPreviewFullSize then LoadPreview( fPreviewCheck.Checked, True ); fImageEnView.AutoFit := false; fImageEnView.Zoom := SelectedZoom; fImageEnView.UnlockPaint; end else begin fImageEnView.AutoFit := true; fImageEnView.Update; end; end; procedure TOpenImageEnDialog.DoShow; var ClientRect, PreviewRect, StaticRect: TRect; begin GetClientRect(handle, ClientRect); StaticRect := GetStaticRect(); if fShowPreview then begin // PicturePanel PreviewRect := ClientRect; PreviewRect.Left := StaticRect.Right; PreviewRect.Top := StaticRect.Top; PreviewRect.Bottom := imax(StaticRect.Bottom, StaticRect.Top + fPicLabel3.BoundsRect.Bottom); fPicturePanel.BoundsRect := PreviewRect; fPicturePanel.ParentWindow := handle; {$IFDEF IEINCLUDEMULTIVIEW} fImageEnMView.ParentWindow := fPicturePanel.handle; {$ENDIF} fImageEnView.ParentWindow := fPicturePanel.handle; fPicturePanel.Color := GetThemeColor( ietpPanel, clBtnFace, True ); with fZoomComboBox, Items do begin AddObject(iemsg(IEMSG_FIT), nil); AddObject('25%', TObject(25)); AddObject('50%', TObject(50)); AddObject('75%', TObject(75)); AddObject('100%', TObject(100)); AddObject('125%', TObject(125)); AddObject('150%', TObject(150)); AddObject('175%', TObject(175)); AddObject('200%', TObject(200)); AddObject('300%', TObject(300)); AddObject('400%', TObject(400)); ItemIndex := 0; end; fImageEnView.Center := True; {$IFDEF IEINCLUDEMULTIVIEW} fPlayButton.Down := false; fImageEnMView.Playing := false; fPlayButton.Enabled := false; {$ENDIF} end; // Info panel if fExtendedDialog then begin fInfoPanel.Top := StaticRect.Bottom; fInfoPanel.Left := StaticRect.Left; fInfoPanel.Width := Clientrect.Right; fInfoPanel.Height := ClientRect.Bottom; fInfoPanel.ParentWindow := handle; fInfoPanel.Color := GetThemeColor( ietpPanel, clBtnFace, True ); end else begin fPicLabel1.Visible := false; fPicLabel2.Visible := false; fPicLabel3.Visible := false; fZoomComboBox.Visible := false; end; UpdateBackground(); inherited DoShow; end; function TSaveImageEnDialog.Execute: Boolean; var fBackParams: TIOParams; begin fBackParams := TIOParams.Create( nil ); try if assigned(fOnCreateCustomControls) then fOnCreateCustomControls(self); fShowPreview := sdShowPreview in fExOptions; if fShowPreview = False then Template := 'IDD_IETEMPLATE1' else if fPreviewSize = iespLarge then Template := 'IDD_IETEMPLATE2' else Template := 'IDD_IETEMPLATE'; if fAutoSetFilter then Filter := BuildFilterStr(fAutoSetFilterFileType {$ifdef IEINCLUDEMULTIVIEW} ,( fAttachedImageEnIO is TImageEnMIO ) or ( fAttachedImageEnIO is TImageEnMView ) {$endif} ); fAdvancedButton.OnClick := DoAdvanced; {$IFDEF IEINCLUDEDIALOGIO} fAdvancedButton.visible := Assigned(fAttachedImageEnIO) and (sdShowAdvanced in fExOptions); {$ENDIF} SetLang; if fShowPlacesBar then fAdvancedButton.SetBounds(474, 0, 75, 23) else fAdvancedButton.SetBounds(333, 0, 75, 23); fPreviewCheck.visible := sdShowPreview in fExOptions; // save Params in fBackParams if fAttachedImageEnIO is TImageEnIO then fBackParams.Assign((fAttachedImageEnIO as TImageEnIO).Params) {$IFDEF IEINCLUDEMULTIVIEW} else if fAttachedImageEnIO is TImageEnMIO then with fAttachedImageEnIO as TImageEnMIO do begin if ParamsCount > 0 then fBackParams.Assign(Params[0]) else begin result := false; exit; end; end else if fAttachedImageEnIO is TImageEnMView then with (fAttachedImageEnIO as TImageEnMView).MIO do begin if ParamsCount > 0 then fBackParams.Assign(Params[0]) else begin result := false; exit; end; end {$ENDIF} else if fAttachedImageEnIO is TImageEnView then fBackparams.Assign((fAttachedImageEnIO as TImageEnView).IO.Params); // EnableDisableAdvanced; if IEGlobalSettings().UnicodeOS then Result := DoExecute(@GetSaveFileNameW) else Result := DoExecute(@GetSaveFileNameA); if result = false then begin // restore Params if fAttachedImageEnIO is TImageEnIO then (fAttachedImageEnIO as TIMageEnIO).Params.Assign(fBackParams) {$IFDEF IEINCLUDEMULTIVIEW} else if fAttachedImageEnIO is TImageEnMIO then (fAttachedImageEnIO as TImageEnMIO).Params[0].Assign(fBackParams) else if fAttachedImageEnIO is TImageEnMView then (fAttachedImageEnIO as TImageEnMView).MIO.Params[0].Assign(fBackParams) {$ENDIF} else if fAttachedImageEnIO is TImageEnView then (fAttachedImageEnIO as TImageEnView).IO.Params.Assign(fBackParams); end; // add the extension to the file name (if there isn't) if (FileNameW <> '') and (IEExtractFileExtW(FileNameW) = '') then FileNameW := FileNameW + WideString(ExtractFirstExt(fSelType)); finally if assigned(fOnDestroyCustomControls) then fOnDestroyCustomControls(self); FreeAndNil(fBackParams); fPicturePanel.ParentWindow := 0; fInfoPanel.ParentWindow := 0; end; end; constructor TSaveImageEnDialog.Create(AOwner: TComponent); begin inherited; fShowPreview := true; Filter := BuildFilterStr; // fExOptions := [sdShowPreview, sdShowAdvanced]; fAttachedImageEnIO := nil; fWatchTimer := TTimer.Create(self); fWatchTimer.Enabled := false; fWatchTimer.Interval := 100; fWatchTimer.OnTimer := OnWatchTimer; end; destructor TSaveImageEnDialog.Destroy; begin FreeAndNil(fWatchTimer); inherited; end; {!! TSaveImageEnDialog.AttachedImageEnIO Declaration property AttachedImageEnIO: TComponent; Description You can attach the dialog to a , , or . When it is attached the user can click the "Advanced" button in the save dialog to read/write the (which are only updated if the user clicks "OK"). If no ImageEn component is attached to the TSaveImageEnDialog it will function as a standard save dialog with an image preview, but without an "Advanced" button. !!} procedure TSaveImageEnDialog.SetAttachedImageEnIO(v: TComponent); begin if assigned(v) and ((v is TImageEnIO){$IFDEF IEINCLUDEMULTIVIEW} or (v is TImageEnMIO) or (v is TImageEnMView){$ENDIF} or (v is TImageEnView)) then begin fAttachedImageEnIO := v; fAttachedImageEnIO.FreeNotification(self); end; end; procedure TSaveImageEnDialog.Notification(AComponent: TComponent; Operation: TOperation); begin inherited Notification(AComponent, Operation); if (AComponent = fAttachedImageEnIO) and (Operation = opRemove) then begin fAttachedImageEnIO := nil; end; end; procedure TSaveImageEnDialog.EnableDisableAdvanced; var pp: TPreviewParams; ft: TIOFileType; begin GetAdvancedType(pp, ft); if fAttachedImageEnIO is TImageEnIO then (fAttachedImageEnIO as TImageEnIO).Params.FileType := ft; fAdvancedButton.Enabled := pp<>[]; end; procedure TSaveImageEnDialog.GetAdvancedType(var pp: TPreviewParams; var ft: TIOFileType); function ConvertExt(e: string; var ft: TIOFileType): TPreviewParams; var fi: TIEFileFormatInfo; begin fi := IEFileFormatGetInfo2(e); if fi <> nil then begin result := fi.DialogPage; ft := fi.FileType; end else begin result := []; ft := 0; end; end; var e: WideString; begin e := IEExtractFileExtW(FileNameW); if e <> '' then pp := ConvertExt(e, ft) else pp := ConvertExt(DefaultExt, ft); if (pp = []) and (ft=0) and (fSelType<>'') then pp := ConvertExt(IEExtractFileExtW(fSelType), ft); end; procedure TSaveImageEnDialog.DoAdvanced(Sender: TObject); {$IFDEF IEINCLUDEDIALOGIO} var pp: TPreviewParams; ft: TIOFileType; begin if assigned( fAttachedImageEnIO ) = False then exit; GetAdvancedType( pp, ft ); if pp <> [] then begin if fAttachedImageEnIO is TImageEnIO then begin (fAttachedImageEnIO as TImageEnIO).Params.FileType := ft; (fAttachedImageEnIO as TImageEnIO).DoPreviews( pp ); end else {$IFDEF IEINCLUDEMULTIVIEW} if fAttachedImageEnIO is TImageEnMIO then (fAttachedImageEnIO as TImageEnMIO).DoPreviews( -1, pp ) else if fAttachedImageEnIO is TImageEnMView then (fAttachedImageEnIO as TImageEnMView).MIO.DoPreviews( -1, pp ) else {$ENDIF} if fAttachedImageEnIO is TImageEnView then begin (fAttachedImageEnIO as TImageEnView).IO.Params.FileType := ft; (fAttachedImageEnIO as TImageEnView).IO.DoPreviews( pp ); end; end; end; {$ELSE} // {$ifdef IEINCLUDEDIALOGIO} begin end; {$ENDIF} procedure TSaveImageEnDialog.SetFileNameExt; var q: integer; s: WideString; begin s := IEExtractFileNameW(GetFileName2); q := pos('.', s); if q > 0 then s := copy(s, 1, q - 1); s := s + ExtractFirstExt(fSelType); if IEGlobalSettings().UnicodeOS then SendMessageW(GetParent(fHandle), CDM_SETCONTROLTEXT, edt1, LPARAM(PWideChar(s))) else SendMessageA(GetParent(fHandle), CDM_SETCONTROLTEXT, edt1, LPARAM(PAnsiChar(AnsiString(s)))); end; procedure TSaveImageEnDialog.DoTypeChange; begin SetFileNameExt; EnableDisableAdvanced; inherited; end; procedure TOpenImageEnDialog.DoCheckPreview(Sender: TObject); begin if fPreviewCheck.Checked then begin // reload image DoSelectionChange; end else begin // empty fields ShowIOParams(nil); fImageEnView.blank; fImageEnView.Zoom := 100; {$IFDEF IEINCLUDEMULTIVIEW} fImageEnMView.Clear; fImageEnMView.Hide; {$ENDIF} fPreviewButton.Enabled := False; fZoomComboBox.Enabled := false; end; end; procedure TOpenImageEnDialog.UpdateBackground(); begin case fPreviewBorderStyle of iepsCropped : fImageEnView.BackgroundStyle := iebsCropped; iepsCropShadow : fImageEnView.BackgroundStyle := iebsCropShadow; iepsSoftShadow : fImageEnView.BackgroundStyle := iebsSoftShadow; else { iepsDefault } fImageEnView.BackgroundStyle := IEGlobalSettings().PreviewImageBackgroundStyle; end; if fImageEnView.BackgroundStyle in [ iebsCropped, iebsCropShadow, iebsSoftShadow ] then fImageEnView.BorderStyle := bsNone else fImageEnView.BorderStyle := bsSingle; fImageEnView.Background := IEGlobalSettings().PreviewImageBackgroundColor; {$IFDEF IEINCLUDEMULTIVIEW} fImageEnMView.Background := IEGlobalSettings().PreviewImageBackgroundColor; fImageEnMView.BackgroundStyle := IEGlobalSettings().PreviewImageBackgroundStyle; {$ENDIF} end; {!! TOpenImageEnDialog.PreviewBorderStyle Declaration property PreviewBorderStyle: ; Description Specifies the border style for the preview box that is used for single frame images. Note: This values overrides the effect of Default: iepsDefault !!} procedure TOpenImageEnDialog.SetPreviewBorderStyle(v: TIEDBorderStyle); begin fPreviewBorderStyle := v; UpdateBackground(); end; procedure TOpenImageEnDialog.SetZoomFilter(v: TResampleFilter); begin fImageEnView.ZoomFilter := v; end; {!! TOpenImageEnDialog.ZoomFilter Declaration property ZoomFilter: ; Description Specifies the filter to apply when displaying an image preview (to improve its quality). !!} function TOpenImageEnDialog.GetZoomFilter: TResampleFilter; begin result := fImageEnView.ZoomFilter; end; {$IFDEF IEINCLUDEMULTIVIEW} {!! TOpenImageEnDialog.AlwaysAnimate Declaration property AlwaysAnimate: Boolean; Description When enabled, GIF and AVI files will be automatically animated/played in the preview window. !!} procedure TOpenImageEnDialog.SetAlwaysAnimate(value: Boolean); begin fAlwaysAnimate := value; if fAlwaysAnimate then ShowAllFrames := true; end; {$endif} {!! TOpenImageEnDialog.PreviewSize Declaration property PreviewSize : ; Description Specifies the size of the image preview that is shown on the right of the dialog. !!} procedure TOpenImageEnDialog.SetPreviewSize(const v : TIEPreviewSize); // Xequte: 19/11/12 const Height_Increase = 66; Width_Increase = 148; var iExtraHeight : integer; AAlignment : TAlignment; iExtraWidth: Integer; begin if fPreviewSize = v then exit; fPreviewSize := v; // Default iExtraHeight := 0; iExtraWidth := 0; AAlignment := taLeftJustify; // Tall or Large if v <> iespDefault then begin iExtraHeight := Height_Increase; AAlignment := taRightJustify; end; // Large if v = iespLarge then begin iExtraWidth := Width_Increase; end; // Note: must align TOpenImageEnDialog.Create fPicturePanel.SetBounds(204, 5, 233 + iExtraWidth, 200); fPicLabel1.SetBounds(6, 180 + 80 + iExtraHeight, 227 + iExtraWidth, 23); fPicLabel1.Alignment := AAlignment; fPicLabel2.SetBounds(6, 203 + 80 + iExtraHeight, 227 + iExtraWidth, 23); fPicLabel2.Alignment := AAlignment; fPicLabel3.SetBounds(6, 226 + 80 + iExtraHeight, 227 + iExtraWidth, 23); fPicLabel3.Alignment := AAlignment; fImageEnView.SetBounds(6, 36, 133 + 100 + iExtraWidth, 139 + 78 + iExtraHeight); {$IFDEF IEINCLUDEMULTIVIEW} fImageEnMView.SetBounds(6, 36, 133 + 100 + iExtraWidth, 139 + 78 + iExtraHeight); {$ENDIF} end; procedure TSaveImageEnDialog.OnWatchTimer(Sender: TObject); begin EnableDisableAdvanced; end; procedure TOpenImageEnDialog.DoAllDisplayed(Sender: TObject); begin {$IFDEF IEINCLUDEMULTIVIEW} if fImageEnMView.SelectedImage > -1 then ShowIOParams(fImageEnMView.MIO.Params[fImageEnMView.SelectedImage]); {$endif} end; procedure TOpenImageEnDialog.SetFileName(value: TFileName); begin FileNameW := WideString(value); end; {$ELSE} // {$ifdef IEINCLUDEOPENSAVEDIALOGS} interface implementation {$ENDIF} end.