Icoledit.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:10k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {       Delphi VCL Extensions (RX)                      }
  4. {                                                       }
  5. {       Copyright (c) 1997 Master-Bank                  }
  6. {                                                       }
  7. {*******************************************************}
  8. unit IcoLEdit;
  9. {$I RX.INC}
  10. interface
  11. uses {$IFDEF WIN32} Windows, {$ELSE} WinTypes, WinProcs, {$ENDIF}
  12.   Messages, Classes, Graphics, Forms, Controls, Dialogs, Buttons, IcoList,
  13.   RTLConsts, DesignIntf, DesignEditors, VCLEditors, StdCtrls, ExtCtrls, Placemnt, {$IFDEF RX_D3} ExtDlgs, {$ELSE}
  14.   ImagPrvw, {$ENDIF} Menus, SpeedBar;
  15. type
  16. { TIconListDialog }
  17.   TIconListDialog = class(TForm)
  18.     OK: TButton;
  19.     Cancel: TButton;
  20.     Holder: TPanel;
  21.     Slot0: TPanel;
  22.     Slot1: TPanel;
  23.     Slot2: TPanel;
  24.     Slot3: TPanel;
  25.     Slot4: TPanel;
  26.     Image0: TImage;
  27.     Image1: TImage;
  28.     Image2: TImage;
  29.     Image3: TImage;
  30.     Image4: TImage;
  31.     Bevel1: TBevel;
  32.     Label1: TLabel;
  33.     CntLabel: TLabel;
  34.     Label3: TLabel;
  35.     IdxLabel: TLabel;
  36.     SpeedBar: TSpeedBar;
  37.     Load: TSpeedItem;
  38.     LoadAni: TSpeedItem;
  39.     Delete: TSpeedItem;
  40.     Clear: TSpeedItem;
  41.     Copy: TSpeedItem;
  42.     Paste: TSpeedItem;
  43.     ScrollBar: TScrollBar;
  44.     procedure FormCreate(Sender: TObject);
  45.     procedure FormDestroy(Sender: TObject);
  46.     procedure LoadClick(Sender: TObject);
  47.     procedure ClearClick(Sender: TObject);
  48.     procedure CopyClick(Sender: TObject);
  49.     procedure PasteClick(Sender: TObject);
  50.     procedure UpdateClipboard(Sender: TObject);
  51.     procedure ScrollBarChange(Sender: TObject);
  52.     procedure DeleteClick(Sender: TObject);
  53.     procedure ImageMouseDown(Sender: TObject; Button: TMouseButton;
  54.       Shift: TShiftState; X, Y: Integer);
  55.     procedure LoadAniClick(Sender: TObject);
  56.   private
  57.     Icons: TIconList;
  58.     FTopIndex, FSelected: Integer;
  59. {$IFDEF RX_D3}
  60.     FileDialog: TOpenPictureDialog;
  61. {$ELSE}
  62.     FileDialog: TOpenDialog;
  63. {$ENDIF}
  64.     procedure SetSelectedIndex(Index: Integer; Force: Boolean);
  65.     procedure ListChanged(Sender: TObject);
  66.     function GetSelectedIcon: TIcon;
  67.     procedure CheckButtons;
  68.     procedure ValidateImage;
  69.     procedure CheckEnablePaste;
  70.     procedure LoadAniFile;
  71.     procedure WMActivate(var Msg: TWMActivate); message WM_ACTIVATE;
  72.   public
  73.     Modified: Boolean;
  74.   end;
  75. { TIconListProperty }
  76.   TIconListProperty = class(TClassProperty)
  77.   public
  78.     procedure Edit; override;
  79.     function GetAttributes: TPropertyAttributes; override;
  80.     function GetValue: string; override;
  81.     procedure SetValue(const Value: string); override;
  82.   end;
  83. procedure EditIconList(IconList: TIconList);
  84. implementation
  85. uses TypInfo, SysUtils, Clipbrd, Consts, ClipIcon, VCLUtils, AppUtils,
  86.   RxConst, RxLConst, MaxMin, AniFile;
  87. {$B-}
  88. {$IFDEF WIN32}
  89.  {$D-}
  90. {$ENDIF}
  91. {$R *.DFM}
  92. const
  93.   sSlot = 'Slot%d';
  94.   sImage = 'Image%d';
  95. procedure EditIconList(IconList: TIconList);
  96. begin
  97.   with TIconListDialog.Create(Application) do
  98.   try
  99.     Icons.Assign(IconList);
  100.     Modified := False;
  101.     if (ShowModal = mrOk) and Modified then
  102.       IconList.Assign(Icons);
  103.   finally
  104.     Free;
  105.   end;
  106. end;
  107. { TIconListProperty }
  108. procedure TIconListProperty.Edit;
  109. var
  110.   Editor: TIconListDialog;
  111.   Comp: TPersistent;
  112.   CurDir: string;
  113.   Res: Integer;
  114. begin
  115.   Editor := TIconListDialog.Create(nil);
  116.   try
  117.     Comp := GetComponent(0);
  118.     if Comp is TComponent then
  119.       Editor.Caption := TComponent(Comp).Name + '.' + GetName;
  120.     Editor.Icons.Assign(TIconList(Pointer(GetOrdValue)));
  121.     Editor.Modified := False;
  122.     CurDir := GetCurrentDir;
  123.     try
  124.       Res := Editor.ShowModal;
  125.     finally
  126.       SetCurrentDir(CurDir);
  127.     end;
  128.     if (Res = mrOk) and Editor.Modified then begin
  129.       TIconList(Pointer(GetOrdValue)).Assign(Editor.Icons);
  130.       Designer.Modified;
  131.     end;
  132.   finally
  133.     Editor.Free;
  134.   end;
  135. end;
  136. function TIconListProperty.GetAttributes: TPropertyAttributes;
  137. begin
  138.   Result := [paDialog];
  139. end;
  140. function TIconListProperty.GetValue: string;
  141. var
  142.   List: TIconList;
  143. begin
  144.   List := TIconList(Pointer(GetOrdValue));
  145.   if (List = nil) or (List.Count = 0) then
  146.     Result := ResStr(srNone)
  147.   else Result := '(' + List.ClassName + ')';
  148. end;
  149. procedure TIconListProperty.SetValue(const Value: string);
  150. begin
  151.   if Value = '' then SetOrdValue(0);
  152. end;
  153. { TIconListDialog }
  154. procedure TIconListDialog.LoadAniFile;
  155. var
  156.   Dialog: TOpenDialog;
  157.   AniCursor: TAnimatedCursorImage;
  158. begin
  159.   Dialog := TOpenDialog.Create(Application);
  160.   try
  161.     with Dialog do begin
  162.       Options := [ofHideReadOnly, ofFileMustExist];
  163.       DefaultExt := 'ani';
  164.       Filter := LoadStr(srAniCurFilter);
  165.       if Execute then begin
  166.         AniCursor := TAnimatedCursorImage.Create;
  167.         try
  168.           AniCursor.LoadFromFile(FileName);
  169.           Icons.Assign(AniCursor);
  170.         finally
  171.           AniCursor.Free;
  172.         end;
  173.       end;
  174.     end;
  175.   finally
  176.     Dialog.Free;
  177.   end;
  178. end;
  179. function TIconListDialog.GetSelectedIcon: TIcon;
  180. begin
  181.   Result := nil;
  182.   if (Icons.Count > 0) and (FSelected < Icons.Count) then
  183.     Result := Icons[FSelected];
  184. end;
  185. procedure TIconListDialog.CheckEnablePaste;
  186. begin
  187.   Paste.Enabled := Clipboard.HasFormat(CF_ICON);
  188. end;
  189. procedure TIconListDialog.SetSelectedIndex(Index: Integer; Force: Boolean);
  190. begin
  191.   if Force or (Index <> FSelected) then begin
  192.     Index := Min(Icons.Count, Max(Index, 0));
  193.     while (FTopIndex < Index - 4) do Inc(FTopIndex);
  194.     if Index < FTopIndex then FTopIndex := Index;
  195.     FSelected := Index;
  196.     if FSelected <> ScrollBar.Position then ScrollBar.Position := FSelected;
  197.     ValidateImage;
  198.   end;
  199. end;
  200. procedure TIconListDialog.ListChanged(Sender: TObject);
  201. begin
  202.   ScrollBar.Max := Icons.Count;
  203.   SetSelectedIndex(FSelected, True);
  204.   Modified := True;
  205. end;
  206. procedure TIconListDialog.CheckButtons;
  207. var
  208.   Enable: Boolean;
  209. begin
  210.   Enable := (Icons.Count > 0) and (FSelected < Icons.Count) and
  211.     (FSelected >= 0);
  212.   Clear.Enabled := Icons.Count > 0;
  213.   Delete.Enabled := Enable;
  214.   Copy.Enabled := Enable;
  215.   CheckEnablePaste;
  216. end;
  217. procedure TIconListDialog.ValidateImage;
  218. var
  219.   Enable: Boolean;
  220.   I: Integer;
  221.   Image, Slot: TComponent;
  222. begin
  223.   for I := 0 to 4 do begin
  224.     Image := FindComponent(Format(sImage, [I]));
  225.     Slot := FindComponent(Format(sSlot, [I]));
  226.     if Image <> nil then
  227.       with TImage(Image).Picture do begin
  228.         if FTopIndex + I < Icons.Count then Assign(Icons[FTopIndex + I])
  229.         else Assign(nil);
  230. {$IFDEF RX_D3}
  231.         TImage(Image).Transparent := True;
  232. {$ENDIF}
  233.       end;
  234.     if Slot <> nil then TPanel(Slot).ParentColor := True;
  235.   end;
  236.   Slot := FindComponent(Format(sSlot, [FSelected - FTopIndex]));
  237.   if Slot <> nil then TPanel(Slot).Color := clActiveCaption;
  238.   CntLabel.Caption := IntToStr(Icons.Count);
  239.   Enable := (Icons.Count > 0) and (FSelected <= Icons.Count) and
  240.     (FSelected >= 0);
  241.   if Enable then IdxLabel.Caption := IntToStr(FSelected)
  242.   else IdxLabel.Caption := '';
  243.   CheckButtons;
  244. end;
  245. procedure TIconListDialog.FormCreate(Sender: TObject);
  246. {$IFDEF RX_D3}
  247. var
  248.   I: Integer;
  249.   Image: TComponent;
  250. {$ENDIF}
  251. begin
  252. {$IFDEF RX_D3}
  253.   FileDialog := TOpenPictureDialog.Create(Self);
  254.   for I := 0 to 4 do begin
  255.     Image := FindComponent(Format(sImage, [I]));
  256.     if Image <> nil then TImage(Image).Transparent := True;
  257.   end;
  258. {$ELSE}
  259.   FileDialog := TOpenDialog.Create(Self);
  260. {$ENDIF}
  261.   with FileDialog do begin
  262.     Title := LoadStr(srLoadIcon);
  263.     Options := [ofHideReadOnly, ofFileMustExist];
  264.     DefaultExt := GraphicExtension(TIcon);
  265.     Filter := GraphicFilter(TIcon);
  266.   end;
  267.   Icons := TIconList.Create;
  268.   Icons.OnChange := ListChanged;
  269.   FTopIndex := 0;
  270.   FSelected := 0;
  271.   Clear.Enabled := False;
  272.   Copy.Enabled := False;
  273.   Delete.Enabled := False;
  274.   CheckEnablePaste;
  275. end;
  276. procedure TIconListDialog.FormDestroy(Sender: TObject);
  277. begin
  278.   Icons.OnChange := nil;
  279.   Icons.Free;
  280. end;
  281. procedure TIconListDialog.UpdateClipboard(Sender: TObject);
  282. begin
  283.   CheckEnablePaste;
  284. end;
  285. procedure TIconListDialog.LoadClick(Sender: TObject);
  286. var
  287.   Ico: TIcon;
  288.   I: Integer;
  289. {$IFNDEF RX_D3}
  290.   FileName: string;
  291. {$ENDIF}
  292. begin
  293. {$IFNDEF RX_D3}
  294.   FileName := '';
  295.   if SelectImage(FileName, GraphicExtension(TIcon), GraphicFilter(TIcon)) then
  296.   begin
  297.     FileDialog.Filename := FileName;
  298. {$ELSE}
  299.   if FileDialog.Execute then begin
  300. {$ENDIF}
  301.     Ico := TIcon.Create;
  302.     try
  303.       Ico.LoadFromFile(FileDialog.Filename);
  304.       I := Min(FSelected + 1, Icons.Count);
  305.       Icons.Insert(I, Ico);
  306.       SetSelectedIndex(I, True);
  307.     finally
  308.       Ico.Free;
  309.     end;
  310.   end;
  311. end;
  312. procedure TIconListDialog.CopyClick(Sender: TObject);
  313. begin
  314.   CopyIconToClipboard(GetSelectedIcon, clBtnFace);
  315.   CheckEnablePaste;
  316. end;
  317. procedure TIconListDialog.PasteClick(Sender: TObject);
  318. var
  319.   Ico: TIcon;
  320. begin
  321.   if Clipboard.HasFormat(CF_ICON) then begin
  322.     Ico := CreateIconFromClipboard;
  323.     try
  324.       Icons[FSelected] := Ico;
  325.     finally
  326.       Ico.Free;
  327.     end;
  328.   end;
  329. end;
  330. procedure TIconListDialog.WMActivate(var Msg: TWMActivate);
  331. begin
  332.   if Msg.Active <> WA_INACTIVE then CheckEnablePaste;
  333.   inherited;
  334. end;
  335. procedure TIconListDialog.ClearClick(Sender: TObject);
  336. begin
  337.   Icons.Clear;
  338. end;
  339. procedure TIconListDialog.ScrollBarChange(Sender: TObject);
  340. begin
  341.   SetSelectedIndex(ScrollBar.Position, False);
  342. end;
  343. procedure TIconListDialog.DeleteClick(Sender: TObject);
  344. begin
  345.   Icons.Delete(FSelected);
  346. end;
  347. procedure TIconListDialog.ImageMouseDown(Sender: TObject;
  348.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  349. var
  350.   Index: Integer;
  351. begin
  352.   if Button = mbLeft then begin
  353.     for Index := 0 to 4 do begin
  354.       if TComponent(Sender).Name = Format(sImage, [Index]) then Break;
  355.       if TComponent(Sender).Name = Format(sSlot, [Index]) then Break;
  356.     end;
  357.     SetSelectedIndex(FTopIndex + Index, True);
  358.   end;
  359. end;
  360. procedure TIconListDialog.LoadAniClick(Sender: TObject);
  361. begin
  362.   LoadAniFile;
  363. end;
  364. end.