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

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Tel.: +0351-8012255                   =}
  7. {=  Loewenstr.7a                = info@swiftsoft.de                     =}
  8. {========================================================================}
  9. {=  Actual versions on http://www.swiftsoft.de/mmtools.html             =}
  10. {========================================================================}
  11. {=  This code is for reference purposes only and may not be copied or   =}
  12. {=  distributed in any format electronic or otherwise except one copy   =}
  13. {=  for backup purposes.                                                =}
  14. {=                                                                      =}
  15. {=  No Delphi Component Kit or Component individually or in a collection=}
  16. {=  subclassed or otherwise from the code in this unit, or associated   =}
  17. {=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
  18. {=  without express permission from SwiftSoft.                          =}
  19. {=                                                                      =}
  20. {=  For more licence informations please refer to the associated        =}
  21. {=  HelpFile.                                                           =}
  22. {========================================================================}
  23. {=  $Date: 02.03.98 - 21:26:34 $                                        =}
  24. {========================================================================}
  25. unit MMIdxPrp;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29. {$IFDEF DELPHI6}
  30.     DesignIntf,
  31.     DesignEditors,
  32. {$ELSE}
  33.     DsgnIntf,
  34. {$ENDIF}
  35.     Windows,
  36.     Messages,
  37.     SysUtils,
  38.     Classes,
  39.     Graphics,
  40.     Controls,
  41.     Forms,
  42.     Dialogs,
  43.     StdCtrls,
  44.     ExtCtrls,
  45.     MMObj,
  46.     MMUtils,
  47.     MMBmpLst,
  48.     MMFill;
  49. type
  50.   {-- TMMBMPIndexForm ---------------------------------------------------------}
  51.   TMMBMPIndexForm = class(TForm)
  52.     ClientPanel: TPanel;
  53.     ListHeader: THeader;
  54.     Panel4: TPanel;
  55.     ListBox: TListBox;
  56.     btnOK: TButton;
  57.     btnCancel: TButton;
  58.     procedure FormCreate(Sender: TObject);
  59.     procedure ListBoxDrawItem(Control: TWinControl; Index: Integer;
  60.                               Rect: TRect; State: TOwnerDrawState);
  61.     procedure ListHeaderSized(Sender: TObject; ASection, AWidth: Integer);
  62.     procedure ListBoxDblClick(Sender: TObject);
  63.   private
  64.      FBitmapList: TMMBitmapList;
  65.      procedure SetBitmapList(List: TMMBitmapList);
  66.      procedure UpdateListBox;
  67.   public
  68.     property BitmapList: TMMBitmapList read FBitmapList write SetBitmapList;
  69.   end;
  70.   {-- TMMBitmapIndexProperty --------------------------------------------------}
  71.   TMMBitmapIndexProperty = class(TIntegerProperty)
  72.   public
  73.     procedure Edit; override;
  74.     function  GetAttributes: TPropertyAttributes; override;
  75.   end;
  76.   {-- TMMBitmapBackIndexProperty --------------------------------------------}
  77.   TMMBitmapBackIndexProperty = class(TIntegerProperty)
  78.   public
  79.     procedure Edit; override;
  80.     function  GetAttributes: TPropertyAttributes; override;
  81.   end;
  82. var
  83.   MMBMPIndexForm: TMMBMPIndexForm;
  84. function ExecuteBitmapIndexEditor(List: TMMBitmapList; var Idx: integer): Boolean;
  85. implementation
  86. {$R *.DFM}
  87. {------------------------------------------------------------------------------}
  88. function ExecuteBitmapIndexEditor(List: TMMBitmapList; var Idx: integer): Boolean;
  89. begin
  90.    Result := False;
  91.    if (List <> nil) then
  92.    with TMMBMPIndexForm.Create(Application) do
  93.    try
  94.       BitmapList := List;
  95.       if (Idx < ListBox.Items.Count) then
  96.           ListBox.ItemIndex := Idx;
  97.       if (ShowModal = mrOK) then
  98.       begin
  99.          Result := True;
  100.          Idx := ListBox.ItemIndex;
  101.       end;
  102.    finally
  103.       Free;
  104.    end;
  105. end;
  106. {== TMMBitmapIndexProperty ====================================================}
  107. procedure TMMBitmapIndexProperty.Edit;
  108. var
  109.    Idx: integer;
  110.    List: TMMBitmapList;
  111.    Comp: TComponent;
  112. begin
  113.    Comp := (GetComponent(0) as TComponent);
  114.    if (Comp is TMMCustomBitmapListControl) then
  115.    begin
  116.       Idx  := (Comp as TMMCustomBitmapListControl).BitmapIndex;
  117.       List := (Comp as TMMCustomBitmapListControl).BitmapList;
  118.    end
  119.    else if (Comp is TMMFormFill) then
  120.    begin
  121.       Idx  := (Comp as TMMFormFill).BitmapIndex;
  122.       List := (Comp as TMMFormFill).BitmapList;
  123.    end
  124.    else if (Comp is TMMPanelFill) then
  125.    begin
  126.       Idx  := (Comp as TMMPanelFill).BitmapIndex;
  127.       List := (Comp as TMMPanelFill).BitmapList;
  128.    end
  129.    else exit;
  130.    if ExecuteBitmapIndexEditor(List,Idx) then
  131.       SetOrdValue(Idx);
  132. end;
  133. {-- TMMBitmapIndexProperty ----------------------------------------------------}
  134. function TMMBitmapIndexProperty.GetAttributes: TPropertyAttributes;
  135. begin
  136.    Result := [paMultiSelect, paDialog, paRevertable];
  137. end;
  138. {== TMMBitmapBackIndexProperty ================================================}
  139. procedure TMMBitmapBackIndexProperty.Edit;
  140. var
  141.    Idx: integer;
  142.    List: TMMBitmapList;
  143.    Comp: TComponent;
  144. begin
  145.    Comp := (GetComponent(0) as TComponent);
  146.    if (Comp is TMMCustomBitmapListControl) then
  147.    begin
  148.       Idx  := (Comp as TMMCustomBitmapListControl).BitmapBackIndex;
  149.       List := (Comp as TMMCustomBitmapListControl).BitmapList;
  150.    end
  151.    else if (Comp is TMMPanelFill) then
  152.    begin
  153.       Idx  := (Comp as TMMPanelFill).BitmapBackIndex;
  154.       List := (Comp as TMMPanelFill).BitmapList;
  155.    end
  156.    else exit;
  157.    if ExecuteBitmapIndexEditor(List,Idx) then
  158.       SetOrdValue(Idx);
  159. end;
  160. {-- TMMBitmapBackIndexProperty ------------------------------------------------}
  161. function TMMBitmapBackIndexProperty.GetAttributes: TPropertyAttributes;
  162. begin
  163.    Result := [paMultiSelect, paDialog, paRevertable];
  164. end;
  165. {== TMMBMPIndexForm ===========================================================}
  166. procedure TMMBMPIndexForm.FormCreate(Sender: TObject);
  167. begin
  168.    Icon.Handle := LoadResIcon(icoMMTools);
  169.    FBitmapList := nil;
  170. end;
  171. {-- TMMBMPIndexForm -----------------------------------------------------------}
  172. procedure TMMBMPIndexForm.SetBitmapList(List: TMMBitmapList);
  173. begin
  174.    FBitmapList := List;
  175.    UpdateListBox;
  176. end;
  177. {-- TMMBMPIndexForm -----------------------------------------------------------}
  178. procedure TMMBMPIndexForm.UpdateListBox;
  179. var
  180.    i: integer;
  181. begin
  182.    ListBox.Items.BeginUpdate;
  183.    try
  184.       ListBox.Clear;
  185.       if (FBitmapList <> nil) then
  186.       for i := 0 to FBitmapList.Count-1 do
  187.       begin
  188.          ListBox.Items.Add(IntToStr(i));
  189.       end;
  190.    finally
  191.       ListBox.Items.Endupdate;
  192.    end;
  193. end;
  194. {-- TMMBMPIndexForm -----------------------------------------------------------}
  195. procedure TMMBMPIndexForm.ListBoxDrawItem(Control: TWinControl;
  196.                                           Index: Integer; Rect: TRect;
  197.                                           State: TOwnerDrawState);
  198. var
  199.   R: TRect;
  200.   S: string;
  201.   C: array[0..255] of Char;
  202.   X,Y,iWidth,iHeight,W: integer;
  203.   Factor: Double;
  204. begin
  205.    with ListBox.Canvas do
  206.    begin
  207.       FillRect(Rect);
  208.       inc(Rect.Top);
  209.       dec(Rect.Bottom);
  210.       R := Rect;
  211.       { draw the ID }
  212.       S := ListBox.Items[Index];
  213.       R.Right := ListHeader.SectionWidth[0];
  214.       X := (R.Left + ((R.Right-R.Left) div 2)) - TextWidth(S) div 2;
  215.       Y := (R.Top + ((R.Bottom-R.Top) div 2)) - TextHeight(S) div 2;
  216.       ExtTextOut(ListBox.Canvas.Handle, X, Y, ETO_CLIPPED or
  217.                  ETO_OPAQUE, @R, StrPCopy(C, S), Length(S), nil);
  218.       R.Left := R.Right;
  219.       R.Right := Rect.Right;
  220.       inc(R.Top);
  221.       dec(R.Bottom);
  222.       iWidth  := FBitmapList.Items[index].Width;
  223.       iHeight := FBitmapList.Items[index].Height;
  224.       if (iWidth < (R.Right-R.Left)) and
  225.          (iHeight < (R.Bottom-R.Top)) then
  226.       begin
  227.          R.Right := R.Left+iWidth;
  228.          R.Top   := R.Top + (((R.Bottom-R.Top)-iHeight) div 2);
  229.          R.Bottom:= R.Top + iHeight;
  230.       end
  231.       else
  232.       begin
  233.          if (iWidth <= iHeight) then
  234.          begin
  235.             if (iHeight > R.Bottom-R.Top) then
  236.             begin
  237.                Factor  := (R.Bottom - R.Top)/iHeight;
  238.                iWidth  := Trunc(iWidth * Factor);
  239.                iHeight := R.Bottom-R.Top;
  240.             end;
  241.             Factor  := Min(R.Bottom-R.Top,iHeight)/iHeight;
  242.             iWidth  := Trunc(iWidth * Factor);
  243.             if (iWidth > R.Right-R.Left) then
  244.             begin
  245.                Factor  := (R.Right - R.Left)/iWidth;
  246.                iHeight := Trunc(iHeight * Factor);
  247.                iWidth  := R.Right-R.Left;
  248.                R.Top    := R.Top + (((R.Bottom-R.Top)-iHeight) div 2);
  249.                R.Bottom := R.Top + iHeight;
  250.             end;
  251.             R.Right  := R.Left + iWidth;
  252.          end
  253.          else
  254.          begin
  255.             if (iHeight > R.Bottom-R.Top) then
  256.             begin
  257.                Factor  := (R.Bottom - R.Top)/iHeight;
  258.                iWidth  := Trunc(iWidth * Factor);
  259.                iHeight := R.Bottom-R.Top;
  260.             end;
  261.             W := Min(R.Right-R.Left,iWidth);
  262.             Factor   := W/iWidth;
  263.             iHeight  := Trunc(iHeight * Factor);
  264.             R.Top    := R.Top + (((R.Bottom-R.Top)-iHeight) div 2);
  265.             R.Bottom := R.Top + iHeight;
  266.             R.Right := R.Left+W;
  267.          end
  268.       end;
  269.       StretchDraw(R, FBitmapList.Items[index]);
  270.    end;
  271. end;
  272. {-- TMMBMPIndexForm -----------------------------------------------------------}
  273. procedure TMMBMPIndexForm.ListHeaderSized(Sender: TObject; ASection, AWidth: Integer);
  274. begin
  275.    ListBox.Invalidate;
  276. end;
  277. {-- TMMBMPIndexForm -----------------------------------------------------------}
  278. procedure TMMBMPIndexForm.ListBoxDblClick(Sender: TObject);
  279. begin
  280.    ModalResult := mrOK;
  281. end;
  282. end.