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

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Fax.: +49(0)351-8037944               =}
  7. {=  Loewenstr.7a                = info@swiftsoft.de                     =}
  8. {========================================================================}
  9. {=  Actual versions on http://www.swiftsoft.de/index.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: 16.11.98 - 12:58:27 $                                        =}
  24. {========================================================================}
  25. unit MMEdit;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29. {$IFDEF WIN32}
  30.     Windows,
  31. {$ELSE}
  32.     WinTypes,
  33.     WinProcs,
  34. {$ENDIF}
  35.     SysUtils,
  36.     Messages,
  37.     Classes,
  38.     Controls,
  39.     StdCtrls,
  40.     MMObj,
  41.     MMUtils;
  42. type
  43.     {-- TMMNumberEdit ---------------------------------------------------------}
  44.     TMMNumberEdit = class(TEdit)
  45.     private
  46.        FMinValue  : LongInt;
  47.        FMaxValue  : LongInt;
  48.        FAlignment : TAlignment;
  49.        function  GetValue: LongInt;
  50.        function  CheckValue (NewValue: LongInt): LongInt;
  51.        procedure SetValue (NewValue: LongInt);
  52.        procedure SetAlignment(Value: TAlignment);
  53.        procedure CMEnter(var Message: TCMGotFocus); message CM_ENTER;
  54.        procedure CMExit(var Message: TCMExit); message CM_EXIT;
  55.        procedure WMPaste(var Message: TWMPaste); message WM_PASTE;
  56.        procedure WMCut(var Message: TWMCut); message WM_CUT;
  57.     protected
  58.        function  IsValidChar(Key: Char): Boolean; virtual;
  59.        procedure KeyPress(var Key: Char); override;
  60.        procedure CreateParams(var Params: TCreateParams); override;
  61.     public
  62.        constructor Create(AOwner: TComponent); override;
  63.     published
  64.        property MaxValue: LongInt read FMaxValue write FMaxValue default 1000;
  65.        property MinValue: LongInt read FMinValue write FMinValue default 0;
  66.        property Value: LongInt read GetValue write SetValue default 0;
  67.        property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;
  68.     end;
  69.     {-- TMMFloatNumberEdit ----------------------------------------------------}
  70.     TMMFloatNumberEdit = class(TEdit)
  71.     private
  72.        FMinValue  : Double;
  73.        FMaxValue  : Double;
  74.        FAlignment : TAlignment;
  75.        function  GetValue: Double;
  76.        function  CheckValue(NewValue: Double): Double;
  77.        procedure SetValue (NewValue: Double);
  78.        procedure SetAlignment(Value: TAlignment);
  79.        procedure CMEnter(var Message: TCMGotFocus); message CM_ENTER;
  80.        procedure CMExit(var Message: TCMExit); message CM_EXIT;
  81.        procedure WMPaste(var Message: TWMPaste); message WM_PASTE;
  82.        procedure WMCut(var Message: TWMCut); message WM_CUT;
  83.     protected
  84.        function  IsValidChar(Key: Char): Boolean; virtual;
  85.        procedure KeyPress(var Key: Char); override;
  86.        procedure CreateParams(var Params: TCreateParams); override;
  87.     public
  88.        constructor Create(AOwner: TComponent); override;
  89.     published
  90.        property MaxValue: Double read FMaxValue write FMaxValue;
  91.        property MinValue: Double read FMinValue write FMinValue;
  92.        property Value: Double read GetValue write SetValue;
  93.        property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;
  94.     end;
  95. implementation
  96. {== TMMNumberEdit =============================================================}
  97. constructor TMMNumberEdit.Create(AOwner: TComponent);
  98. begin
  99.   inherited Create(AOwner);
  100.   Text := '0';
  101.   FMaxValue := 1000;
  102.   FMinValue := 0;
  103.   FAlignment:= taLeftJustify;
  104.   ControlStyle := ControlStyle - [csSetCaption];
  105.   ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  106.   if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  107. end;
  108. {-- TMMNumberEdit -------------------------------------------------------------}
  109. procedure TMMNumberEdit.KeyPress(var Key: Char);
  110. begin
  111.   if not IsValidChar(Key) then
  112.   begin
  113.     Key := #0;
  114.     MessageBeep(0)
  115.   end;
  116.   if Key <> #0 then inherited KeyPress(Key);
  117. end;
  118. {-- TMMNumberEdit -------------------------------------------------------------}
  119. function TMMNumberEdit.IsValidChar(Key: Char): Boolean;
  120. begin
  121.   Result := (Key in ['+', '-', '0'..'9']) or
  122.     ((Key < #32) and (Key <> Chr(VK_RETURN)));
  123.   if not Enabled and Result and ((Key >= #32) or
  124.       (Key = Char(VK_BACK)) or (Key = Char(VK_DELETE))) then
  125.     Result := False;
  126. end;
  127. {-- TMMNumberEdit -------------------------------------------------------------}
  128. procedure TMMNumberEdit.CreateParams(var Params: TCreateParams);
  129. const
  130.   Alignments: array[TAlignment] of integer = (ES_LEFT, ES_RIGHT, ES_CENTER);
  131. begin
  132.   inherited CreateParams(Params);
  133. {  Params.Style := Params.Style and not WS_BORDER;  }
  134.   Params.Style := Params.Style or ES_MULTILINE or WS_CLIPCHILDREN or Alignments[FAlignment];
  135. end;
  136. {-- TMMNumberEdit -------------------------------------------------------------}
  137. procedure TMMNumberEdit.SetAlignment(Value: TAlignment);
  138. begin
  139.   if FAlignment <> Value then
  140.   begin
  141.     FAlignment := Value;
  142.     RecreateWnd;
  143.   end;
  144. end;
  145. {-- TMMNumberEdit -------------------------------------------------------------}
  146. procedure TMMNumberEdit.WMPaste(var Message: TWMPaste);
  147. begin
  148.    if not Enabled or ReadOnly then Exit;
  149.    inherited;
  150. end;
  151. {-- TMMNumberEdit -------------------------------------------------------------}
  152. procedure TMMNumberEdit.WMCut(var Message: TWMPaste);
  153. begin
  154.   if not Enabled or ReadOnly then Exit;
  155.   inherited;
  156. end;
  157. {-- TMMNumberEdit -------------------------------------------------------------}
  158. procedure TMMnumberEdit.CMExit(var Message: TCMExit);
  159. begin
  160.   inherited;
  161.   SetValue(Value);
  162. end;
  163. {-- TMMNumberEdit -------------------------------------------------------------}
  164. function TMMNumberEdit.GetValue: LongInt;
  165. begin
  166.   try
  167.     Result := StrToInt(Text);
  168.   except
  169.     Result := FMinValue;
  170.   end;
  171. end;
  172. {-- TMMNumberEdit -------------------------------------------------------------}
  173. procedure TMMNumberEdit.SetValue (NewValue: LongInt);
  174. begin
  175.   Text := IntToStr(CheckValue(NewValue));
  176. end;
  177. {-- TMMNumberEdit -------------------------------------------------------------}
  178. function TMMNumberEdit.CheckValue(NewValue: LongInt): LongInt;
  179. begin
  180.   Result := NewValue;
  181.   if (FMaxValue <> FMinValue) then
  182.   begin
  183.     if NewValue < FMinValue then
  184.       Result := FMinValue
  185.     else if NewValue > FMaxValue then
  186.       Result := FMaxValue;
  187.   end;
  188. end;
  189. {-- TMMNumberEdit -------------------------------------------------------------}
  190. procedure TMMNumberEdit.CMEnter(var Message: TCMGotFocus);
  191. begin
  192.   if AutoSelect and not (csLButtonDown in ControlState) then
  193.     SelectAll;
  194.   inherited;
  195. end;
  196. {== TMMFloatNumberEdit ========================================================}
  197. constructor TMMFloatNumberEdit.Create(AOwner: TComponent);
  198. begin
  199.   inherited Create(AOwner);
  200.   Text := '0.00';
  201.   FMaxValue := 1000;
  202.   FMinValue := 0;
  203.   FAlignment:= taLeftJustify;
  204.   ControlStyle := ControlStyle - [csSetCaption];
  205.   ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  206.   if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  207. end;
  208. {-- TMMFloatNumberEdit --------------------------------------------------------}
  209. procedure TMMFloatNumberEdit.KeyPress(var Key: Char);
  210. begin
  211.   if not IsValidChar(Key) then
  212.   begin
  213.     Key := #0;
  214.     MessageBeep(0)
  215.   end;
  216.   if Key <> #0 then inherited KeyPress(Key);
  217. end;
  218. {-- TMMFloatNumberEdit --------------------------------------------------------}
  219. function TMMFloatNumberEdit.IsValidChar(Key: Char): Boolean;
  220. begin
  221.   Result := (Key in [DecimalSeparator, '+', '-', '0'..'9']) or
  222.     ((Key < #32) and (Key <> Chr(VK_RETURN)));
  223.   if not Enabled and Result and ((Key >= #32) or
  224.       (Key = Char(VK_BACK)) or (Key = Char(VK_DELETE))) then
  225.     Result := False;
  226. end;
  227. {-- TMMFloatNumberEdit --------------------------------------------------------}
  228. procedure TMMFloatNumberEdit.CreateParams(var Params: TCreateParams);
  229. const
  230.   Alignments: array[TAlignment] of Longint = (ES_LEFT, ES_RIGHT, ES_CENTER);
  231. begin
  232.   inherited CreateParams(Params);
  233. {  Params.Style := Params.Style and not WS_BORDER;  }
  234.   Params.Style := Params.Style or ES_MULTILINE or WS_CLIPCHILDREN or Alignments[FAlignment];
  235. end;
  236. {-- TMMFloatNumberEdit --------------------------------------------------------}
  237. procedure TMMFloatNumberEdit.SetAlignment(Value: TAlignment);
  238. begin
  239.   if FAlignment <> Value then
  240.   begin
  241.     FAlignment := Value;
  242.     RecreateWnd;
  243.   end;
  244. end;
  245. {-- TMMFloatNumberEdit --------------------------------------------------------}
  246. procedure TMMFloatNumberEdit.WMPaste(var Message: TWMPaste);
  247. begin
  248.    if not Enabled or ReadOnly then Exit;
  249.    inherited;
  250. end;
  251. {-- TMMFloatNumberEdit --------------------------------------------------------}
  252. procedure TMMFloatNumberEdit.WMCut(var Message: TWMPaste);
  253. begin
  254.   if not Enabled or ReadOnly then Exit;
  255.   inherited;
  256. end;
  257. {-- TMMFloatNumberEdit --------------------------------------------------------}
  258. procedure TMMFloatNumberEdit.CMExit(var Message: TCMExit);
  259. begin
  260.   inherited;
  261.   SetValue(Value);
  262. end;
  263. {-- TMMFloatNumberEdit --------------------------------------------------------}
  264. function TMMFloatNumberEdit.GetValue: Double;
  265. begin
  266.   try
  267.     Result := StrToFloat(Text);
  268.   except
  269.     Result := FMinValue;
  270.   end;
  271. end;
  272. {-- TMMFloatNumberEdit --------------------------------------------------------}
  273. procedure TMMFloatNumberEdit.SetValue(NewValue: Double);
  274. begin
  275.   Text := Format('%f',[CheckValue(NewValue)]);
  276. end;
  277. {-- TMMNumberEdit -------------------------------------------------------------}
  278. function TMMFloatNumberEdit.CheckValue(NewValue: Double): Double;
  279. begin
  280.   Result := NewValue;
  281.   if (FMaxValue <> FMinValue) then
  282.   begin
  283.     if NewValue < FMinValue then
  284.       Result := FMinValue
  285.     else if NewValue > FMaxValue then
  286.       Result := FMaxValue;
  287.   end;
  288. end;
  289. {-- TMMFloatNumberEdit --------------------------------------------------------}
  290. procedure TMMFloatNumberEdit.CMEnter(var Message: TCMGotFocus);
  291. begin
  292.   if AutoSelect and not (csLButtonDown in ControlState) then
  293.     SelectAll;
  294.   inherited;
  295. end;
  296. end.