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

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 1995, 1996 AO ROSNO             }
  6. {         Copyright (c) 1997, 1998 Master-Bank          }
  7. {                                                       }
  8. {*******************************************************}
  9. { Note:
  10.   - in Delphi 4.0 you must add DCLSTD40 and DCLSMP40 to the requires
  11.     page of the package you install this components into.
  12.   - in Delphi 3.0 you must add DCLSTD30 and DCLSMP30 to the requires
  13.     page of the package you install this components into.
  14.   - in C++Builder 3.0 you must add DCLSTD35 to the requires page of the
  15.     package you install this components into. }
  16. unit RxCtlReg;
  17. {$I RX.INC}
  18. {$D-,L-,S-}
  19. interface
  20. { Register custom useful controls }
  21. procedure Register;
  22. implementation
  23. {$IFDEF WIN32}
  24.  {$R *.D32}
  25. {$ELSE}
  26.  {$R *.D16}
  27. {$ENDIF}
  28. uses {$IFDEF WIN32} Windows, {$ELSE} WinTypes, {$ENDIF} Classes, SysUtils,
  29.   RTLConsts, DesignIntf, DesignEditors, VCLEditors, TypInfo, Controls, Graphics, ExtCtrls, Tabs, Dialogs, Forms,
  30.   {$IFDEF RX_D3} DsnConst, ExtDlgs, {$ELSE} LibConst, {$ENDIF} 
  31. {$IFDEF DCS}
  32.   {$IFDEF RX_D4} ImgEdit, {$ENDIF} {$IFDEF WIN32} ImgList, {$ENDIF}
  33. {$ENDIF DCS}
  34.   {$IFDEF WIN32} RxRichEd, {$ENDIF} Menus, FiltEdit, StdCtrls, Buttons,
  35.   RxLConst, RxCtrls, RxGrids, CurrEdit, ToolEdit, HintProp, DateUtil,
  36.   PickDate, RxSplit, RxSlider, RxClock, Animate, RxCombos, RxSpin, Consts,
  37.   RxDice, RxSwitch, CheckItm, VCLUtils, RxColors, AniFile, RxGraph,
  38.   {$IFDEF USE_RX_GIF} RxGIF, GIFCtrl, {$ENDIF} RxHints, ExcptDlg, RxCConst,
  39.   FileUtil, RxDsgn;
  40. {$IFNDEF RX_D3}
  41. { TDateProperty }
  42. type
  43.   TDateProperty = class(TFloatProperty)
  44.   public
  45.     function GetValue: string; override;
  46.     procedure SetValue(const Value: string); override;
  47.   end;
  48. function TDateProperty.GetValue: string;
  49. begin
  50.   if GetFloatValue = NullDate then Result := ''
  51.   else Result := FormatDateTime(ShortDateFormat, GetFloatValue);
  52. end;
  53. procedure TDateProperty.SetValue(const Value: string);
  54. begin
  55.   if Value = '' then SetFloatValue(NullDate)
  56.   else SetFloatValue(StrToDateFmt(ShortDateFormat, Value));
  57. end;
  58. { TRxModalResultProperty }
  59. type
  60.   TRxModalResultProperty = class(TModalResultProperty)
  61.   public
  62.     function GetValue: string; override;
  63.     procedure GetValues(Proc: TGetStrProc); override;
  64.     procedure SetValue(const Value: string); override;
  65.   end;
  66. const
  67.   ModalResults: array[mrAll..mrYesToAll] of string = (
  68.     'mrAll',
  69.     'mrNoToAll',
  70.     'mrYesToAll');
  71. function TRxModalResultProperty.GetValue: string;
  72. var
  73.   CurValue: Longint;
  74. begin
  75.   CurValue := GetOrdValue;
  76.   case CurValue of
  77.     Low(ModalResults)..High(ModalResults):
  78.       Result := ModalResults[CurValue];
  79.     else Result := inherited GetValue;
  80.   end;
  81. end;
  82. procedure TRxModalResultProperty.GetValues(Proc: TGetStrProc);
  83. var
  84.   I: Integer;
  85. begin
  86.   inherited GetValues(Proc);
  87.   for I := Low(ModalResults) to High(ModalResults) do
  88.     Proc(ModalResults[I]);
  89. end;
  90. procedure TRxModalResultProperty.SetValue(const Value: string);
  91. var
  92.   I: Integer;
  93. begin
  94.   if (Value <> '') then
  95.     for I := Low(ModalResults) to High(ModalResults) do
  96.       if CompareText(ModalResults[I], Value) = 0 then begin
  97.         SetOrdValue(I);
  98.         Exit;
  99.       end;
  100.   inherited SetValue(Value);
  101. end;
  102. {$ENDIF RX_D3}
  103. function ValueName(E: Extended): string;
  104. begin
  105.   if E = High(Integer) then Result := 'MaxInt'
  106.   else if E = Low(Integer) then Result := 'MinInt'
  107.   else if E = High(Longint) then Result := 'MaxLong'
  108.   else if E = Low(Longint) then Result := 'MinLong'
  109.   else if E = High(ShortInt) then Result := 'MaxShort'
  110.   else if E = Low(ShortInt) then Result := 'MinShort'
  111.   else if E = High(Word) then Result := 'MaxWord'
  112.   else Result := '';
  113. end;
  114. function StrToValue(const S: string): Longint;
  115. begin
  116.   if CompareText(S, 'MaxLong') = 0 then Result := High(Longint)
  117.   else if CompareText(S, 'MinLong') = 0 then Result := Low(Longint)
  118.   else if CompareText(S, 'MaxInt') = 0 then Result := High(Integer)
  119.   else if CompareText(S, 'MinInt') = 0 then Result := Low(Integer)
  120.   else if CompareText(S, 'MaxShort') = 0 then Result := High(ShortInt)
  121.   else if CompareText(S, 'MinShort') = 0 then Result := Low(ShortInt)
  122.   else if CompareText(S, 'MaxWord') = 0 then Result := High(Word)
  123.   else Result := 0;
  124. end;
  125. { TRxIntegerProperty }
  126. type
  127.   TRxIntegerProperty = class(TIntegerProperty)
  128.   public
  129.     function GetValue: string; override;
  130.     procedure SetValue(const Value: string); override;
  131.   end;
  132. function TRxIntegerProperty.GetValue: string;
  133. begin
  134.   Result := ValueName(GetOrdValue);
  135.   if Result = '' then Result := IntToStr(GetOrdValue);
  136. end;
  137. procedure TRxIntegerProperty.SetValue(const Value: String);
  138. var
  139.   L: Longint;
  140. begin
  141.   L := StrToValue(Value);
  142.   if L = 0 then L := StrToInt(Value);
  143.   inherited SetValue(IntToStr(L));
  144. end;
  145. { TRxFloatProperty }
  146. type
  147.   TRxFloatProperty = class(TFloatProperty)
  148.   public
  149.     function GetValue: string; override;
  150.     procedure SetValue(const Value: string); override;
  151.   end;
  152. function TRxFloatProperty.GetValue: string;
  153. const
  154. {$IFDEF WIN32}
  155.   Precisions: array[TFloatType] of Integer = (7, 15, 18, 18, 18);
  156. {$ELSE}
  157.   Precisions: array[TFloatType] of Integer = (7, 15, 18, 18);
  158. {$ENDIF}
  159. begin
  160.   Result := ValueName(GetFloatValue);
  161.   if Result = '' then
  162.     Result := FloatToStrF(GetFloatValue, ffGeneral,
  163.       Precisions[GetTypeData(GetPropType)^.FloatType], 0);
  164. end;
  165. procedure TRxFloatProperty.SetValue(const Value: string);
  166. var
  167.   L: Longint;
  168. begin
  169.   L := StrToValue(Value);
  170.   if L <> 0 then SetFloatValue(L)
  171.   else SetFloatValue(StrToFloat(Value));
  172. end;
  173. { TPaintBoxEditor }
  174. type
  175.   TPaintBoxEditor = class(TDefaultEditor)
  176.   public
  177.     procedure EditProperty(const Prop: IProperty; var Continue: Boolean); override;
  178.   end;
  179. procedure TPaintBoxEditor.EditProperty(const Prop: IProperty; var Continue: Boolean);
  180. begin
  181.   if CompareText(Prop.GetName, 'OnPaint') = 0 then begin
  182.     Prop.Edit;
  183.     Continue := False;
  184.   end
  185.   else inherited EditProperty(Prop, Continue);
  186. end;
  187. { TAnimatedEditor }
  188. type
  189.   TAnimatedEditor = class(TComponentEditor)
  190.   private
  191.     FContinue: Boolean;
  192.     procedure CheckEdit(const Prop: IProperty);
  193.     procedure EditImage(Image: TAnimatedImage);
  194.     procedure LoadAniFile(Image: TAnimatedImage);
  195.   public
  196.     procedure ExecuteVerb(Index: Integer); override;
  197.     function GetVerb(Index: Integer): string; override;
  198.     function GetVerbCount: Integer; override;
  199.   end;
  200. procedure TAnimatedEditor.CheckEdit(const Prop: IProperty);
  201. begin
  202.   try
  203.     if FContinue and (CompareText(Prop.GetName, 'GLYPH') = 0) then
  204.     begin
  205.       Prop.Edit;
  206.       FContinue := False;
  207.     end;
  208.   finally
  209.     //Prop.Free;
  210.   end;
  211. end;
  212. procedure TAnimatedEditor.EditImage(Image: TAnimatedImage);
  213. var
  214.   Components: IDesignerSelections;
  215. begin
  216.   Components := CreateSelectionList;
  217.   try
  218.     FContinue := True;
  219.     Components.Add(Component);
  220.     GetComponentProperties(Components, tkAny, Designer, CheckEdit);
  221.   finally
  222.     //Components.Free;
  223.   end;
  224. end;
  225. procedure TAnimatedEditor.LoadAniFile(Image: TAnimatedImage);
  226. var
  227.   Dialog: TOpenDialog;
  228.   AniCursor: TAnimatedCursorImage;
  229.   CurDir: string;
  230. begin
  231.   CurDir := GetCurrentDir;
  232.   Dialog := TOpenDialog.Create(Application);
  233.   try
  234.     with Dialog do begin
  235.       Options := [ofHideReadOnly, ofFileMustExist];
  236.       DefaultExt := 'ani';
  237.       Filter := LoadStr(srAniCurFilter);
  238.       if Execute then begin
  239.         AniCursor := TAnimatedCursorImage.Create;
  240.         try
  241.           AniCursor.LoadFromFile(FileName);
  242.           AniCursor.AssignToBitmap(Image.Glyph, clFuchsia, True,
  243.             Image.Orientation = goVertical);
  244.           Image.Interval := AniCursor.DefaultRate;
  245.           Image.TransparentColor := clFuchsia;
  246.           Designer.Modified;
  247.         finally
  248.           AniCursor.Free;
  249.         end;
  250.       end;
  251.     end;
  252.   finally
  253.     Dialog.Free;
  254.     SetCurrentDir(CurDir);
  255.   end;
  256. end;
  257. procedure TAnimatedEditor.ExecuteVerb(Index: Integer);
  258. begin
  259.   if (Index = GetVerbCount - 1) then
  260.     LoadAniFile(TAnimatedImage(Component))
  261.   else if (Index = GetVerbCount - 2) then
  262.     EditImage(TAnimatedImage(Component))
  263.   else inherited ExecuteVerb(Index);
  264. end;
  265. function TAnimatedEditor.GetVerb(Index: Integer): string;
  266. begin
  267.   if (Index = GetVerbCount - 1) then Result := LoadStr(srLoadAniCursor)
  268.   else if (Index = GetVerbCount - 2) then Result := LoadStr(srEditPicture)
  269.   else Result := inherited GetVerb(Index);
  270. end;
  271. function TAnimatedEditor.GetVerbCount: Integer;
  272. begin
  273.   Result := inherited GetVerbCount + 2;
  274. end;
  275. {$IFDEF DCS}
  276. {$IFDEF WIN32}
  277. type
  278.   TRxImageListEditor = class(TComponentEditor)
  279.   private
  280.     procedure SaveAsBitmap(ImageList: TImageList);
  281.   public
  282.     procedure ExecuteVerb(Index: Integer); override;
  283.     function GetVerb(Index: Integer): string; override;
  284.     function GetVerbCount: Integer; override;
  285.   end;
  286. procedure TRxImageListEditor.SaveAsBitmap(ImageList: TImageList);
  287. var
  288.   Bitmap: TBitmap;
  289.   SaveDlg: TOpenDialog;
  290.   I: Integer;
  291. begin
  292.   if ImageList.Count > 0 then begin
  293. {$IFDEF RX_D3}
  294.     SaveDlg := TSavePictureDialog.Create(Application);
  295. {$ELSE}
  296.     SaveDlg := TSaveDialog.Create(Application);
  297. {$ENDIF}
  298.     with SaveDlg do
  299.     try
  300.       Options := [ofHideReadOnly, ofOverwritePrompt];
  301.       DefaultExt := GraphicExtension(TBitmap);
  302.       Filter := GraphicFilter(TBitmap);
  303.       if Execute then begin
  304.         Bitmap := TBitmap.Create;
  305.         try
  306.           with Bitmap do begin
  307.             Width := ImageList.Width * ImageList.Count;
  308.             Height := ImageList.Height;
  309.             if ImageList.BkColor <> clNone then
  310.               Canvas.Brush.Color := ImageList.BkColor
  311.             else Canvas.Brush.Color := clWindow;
  312.             Canvas.FillRect(Bounds(0, 0, Width, Height));
  313.             for I := 0 to ImageList.Count - 1 do
  314.               ImageList.Draw(Canvas, ImageList.Width * I, 0, I);
  315. {$IFDEF RX_D3}
  316.             HandleType := bmDIB;
  317.             if PixelFormat in [pf15bit, pf16bit] then try
  318.               PixelFormat := pf24bit;
  319.             except {} end;
  320. {$ENDIF}
  321.           end;
  322.           Bitmap.SaveToFile(FileName);
  323.         finally
  324.           Bitmap.Free;
  325.         end;
  326.       end;
  327.     finally
  328.       Free;
  329.     end;
  330.   end
  331.   else Beep;
  332. end;
  333. procedure TRxImageListEditor.ExecuteVerb(Index: Integer);
  334. begin
  335.   if Designer <> nil then
  336.     case Index of
  337.       0: if EditImageList(Component as TImageList) then Designer.Modified;
  338.       1: SaveAsBitmap(TImageList(Component));
  339.     end;
  340. end;
  341. function TRxImageListEditor.GetVerb(Index: Integer): string;
  342. begin
  343.   case Index of
  344. {$IFDEF RX_D3}
  345.     0: Result := SImageListEditor;
  346. {$ELSE}
  347.     0: Result := LoadStr(SImageEditor);
  348. {$ENDIF}
  349.     1: Result := LoadStr(srSaveImageList);
  350.     else Result := '';
  351.   end;
  352. end;
  353. function TRxImageListEditor.GetVerbCount: Integer;
  354. begin
  355.   Result := 2;
  356. end;
  357. {$ENDIF WIN32}
  358. {$ENDIF DCS}
  359. { TWeekDayProperty }
  360. type
  361.   TWeekDayProperty = class(TEnumProperty)
  362.     function GetAttributes: TPropertyAttributes; override;
  363.   end;
  364. function TWeekDayProperty.GetAttributes: TPropertyAttributes;
  365. begin
  366.   Result := [paMultiSelect, paValueList];
  367. end;
  368. {$IFDEF RX_D3}
  369. resourcestring
  370.   srSamples = 'Samples';
  371. {$ENDIF}
  372. procedure Register;
  373. const
  374. {$IFDEF RX_D3}
  375.   BaseClass: TClass = TPersistent;
  376. {$ELSE}
  377.   BaseClass: TClass = TComponent;
  378. {$ENDIF}
  379. begin
  380.   RegisterComponents(LoadStr(srRXControls), [TComboEdit, TFilenameEdit,
  381.     TDirectoryEdit, TDateEdit, TRxCalcEdit, TCurrencyEdit, TTextListBox,
  382.     TRxCheckListBox, TFontComboBox, TColorComboBox, TRxSplitter, TRxSlider,
  383.     TRxLabel, {$IFDEF WIN32} TRxRichEdit, {$ENDIF}
  384.     TRxClock, TAnimatedImage, TRxDrawGrid, TRxSpeedButton,
  385.     {$IFDEF USE_RX_GIF} TRxGIFAnimator, {$ENDIF} TRxSpinButton, TRxSpinEdit,
  386.     TRxSwitch, TRxDice]);
  387. {$IFDEF CBUILDER}
  388.  {$IFNDEF RX_V110} { C++Builder 1.0 }
  389.   RegisterComponents(ResStr(srAdditional), [TScroller]);
  390.  {$ELSE}
  391.   RegisterComponents(ResStr(srSamples), [TScroller]);
  392.  {$ENDIF}
  393. {$ELSE}
  394.   RegisterComponents(ResStr(srSamples), [TScroller]);
  395. {$ENDIF}
  396. {$IFDEF RX_D3}
  397.   RegisterNonActiveX([TCustomComboEdit, TCustomDateEdit, TCustomNumEdit,
  398.     TFileDirEdit, TRxCustomListBox, TRxRichEdit], axrComponentOnly);
  399.   RegisterNonActiveX([TScroller], axrComponentOnly);
  400. {$ENDIF RX_D3}
  401.   RegisterPropertyEditor(TypeInfo(TDayOfWeekName), nil, '', TWeekDayProperty);
  402. {$IFDEF RX_D3}
  403.   RegisterPropertyEditor(TypeInfo(string), TCustomNumEdit, 'Text', nil);
  404. {$ELSE}
  405.   RegisterPropertyEditor(TypeInfo(string), TCustomNumEdit, 'Text', TStringProperty);
  406. {$ENDIF}
  407.   RegisterPropertyEditor(TypeInfo(string), TFileDirEdit, 'Text', TStringProperty);
  408.   RegisterPropertyEditor(TypeInfo(string), TCustomDateEdit, 'Text', TStringProperty);
  409.   RegisterPropertyEditor(TypeInfo(string), TFileNameEdit, 'Filter', TFilterProperty);
  410.   RegisterPropertyEditor(TypeInfo(string), TFileNameEdit, 'FileName', TFilenameProperty);
  411.   RegisterPropertyEditor(TypeInfo(string), TDirectoryEdit, 'Text', TDirnameProperty);
  412.   RegisterPropertyEditor(TypeInfo(string), BaseClass, 'FolderName', TDirnameProperty);
  413.   RegisterPropertyEditor(TypeInfo(string), BaseClass, 'DirectoryName', TDirnameProperty);
  414.   RegisterPropertyEditor(TypeInfo(string), BaseClass, 'Hint', THintProperty);
  415.   RegisterPropertyEditor(TypeInfo(string), TMenuItem, 'Hint', TStringProperty);
  416.   RegisterPropertyEditor(TypeInfo(string), TCustomComboEdit, 'ButtonHint', THintProperty);
  417.   RegisterPropertyEditor(TypeInfo(TStrings), TRxCheckListBox, 'Items', TCheckItemsProperty);
  418.   RegisterPropertyEditor(TypeInfo(TControl), BaseClass, 'Gauge', TProgressControlProperty);
  419.   RegisterPropertyEditor(TypeInfo(TControl), BaseClass, 'ProgressBar', TProgressControlProperty);
  420. {$IFDEF RX_D3}
  421.   RegisterPropertyEditor(TypeInfo(Boolean), TFontComboBox, 'TrueTypeOnly', nil);
  422.   RegisterPropertyEditor(TypeInfo(TCursor), TRxSplitter, 'Cursor', nil);
  423. {$ELSE}
  424.   RegisterPropertyEditor(TypeInfo(TDateTime), TPersistent, '', TDateProperty);
  425.   RegisterPropertyEditor(TypeInfo(TModalResult), TPersistent, '', TRxModalResultProperty);
  426. {$ENDIF}
  427.   RegisterPropertyEditor(TypeInfo(TCaption), TLabel, 'Caption', THintProperty);
  428.   RegisterPropertyEditor(TypeInfo(TCaption), TRxLabel, 'Caption', THintProperty);
  429.   RegisterPropertyEditor(TypeInfo(TCaption), TRxSpeedButton, 'Caption', THintProperty);
  430.   RegisterPropertyEditor(TypeInfo(Integer), BaseClass, '', TRxIntegerProperty);
  431.   RegisterPropertyEditor(TypeInfo(ShortInt), BaseClass, '', TRxIntegerProperty);
  432.   RegisterPropertyEditor(TypeInfo(SmallInt), BaseClass, '', TRxIntegerProperty);
  433.   RegisterPropertyEditor(TypeInfo(Longint), BaseClass, '', TRxIntegerProperty);
  434.   RegisterPropertyEditor(TypeInfo(Word), BaseClass, '', TRxIntegerProperty);
  435.   RegisterPropertyEditor(TypeInfo(Byte), BaseClass, '', TRxIntegerProperty);
  436.   RegisterPropertyEditor(TypeInfo(Cardinal), BaseClass, '', TRxIntegerProperty);
  437.   RegisterPropertyEditor(TypeInfo(Single), BaseClass, '', TRxFloatProperty);
  438.   RegisterPropertyEditor(TypeInfo(Double), BaseClass, '', TRxFloatProperty);
  439.   RegisterPropertyEditor(TypeInfo(Extended), BaseClass, '', TRxFloatProperty);
  440. {$IFDEF WIN32}
  441.   RegisterPropertyEditor(TypeInfo(Currency), BaseClass, '', TRxFloatProperty);
  442. {$ENDIF}
  443.   RegisterComponentEditor(TPaintBox, TPaintBoxEditor);
  444.   RegisterComponentEditor(TAnimatedImage, TAnimatedEditor);
  445. {$IFDEF WIN32}
  446. {$IFDEF DCS}
  447.   RegisterComponentEditor(TCustomImageList, TRxImageListEditor);
  448.   RegisterComponentEditor(TImageList, TRxImageListEditor);
  449. {$ENDIF}
  450. {$ENDIF}
  451.   RegisterRxColors;
  452. end;
  453. end.