⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmedit.pas

📁 一套及时通讯的原码
💻 PAS
字号:
{========================================================================}
{=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
{========================================================================}
{=                          All Rights Reserved                         =}
{========================================================================}
{=  D 01099 Dresden             = Fax.: +49(0)351-8037944               =}
{=  Loewenstr.7a                = info@swiftsoft.de                     =}
{========================================================================}
{=  Actual versions on http://www.swiftsoft.de/index.html               =}
{========================================================================}
{=  This code is for reference purposes only and may not be copied or   =}
{=  distributed in any format electronic or otherwise except one copy   =}
{=  for backup purposes.                                                =}
{=                                                                      =}
{=  No Delphi Component Kit or Component individually or in a collection=}
{=  subclassed or otherwise from the code in this unit, or associated   =}
{=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
{=  without express permission from SwiftSoft.                          =}
{=                                                                      =}
{=  For more licence informations please refer to the associated        =}
{=  HelpFile.                                                           =}
{========================================================================}
{=  $Date: 16.11.98 - 12:58:27 $                                        =}
{========================================================================}
unit MMEdit;

{$I COMPILER.INC}

interface

uses
{$IFDEF WIN32}
    Windows,
{$ELSE}
    WinTypes,
    WinProcs,
{$ENDIF}
    SysUtils,
    Messages,
    Classes,
    Controls,
    StdCtrls,
    MMObj,
    MMUtils;

type
    {-- TMMNumberEdit ---------------------------------------------------------}
    TMMNumberEdit = class(TEdit)
    private
       FMinValue  : LongInt;
       FMaxValue  : LongInt;
       FAlignment : TAlignment;

       function  GetValue: LongInt;
       function  CheckValue (NewValue: LongInt): LongInt;
       procedure SetValue (NewValue: LongInt);
       procedure SetAlignment(Value: TAlignment);
       procedure CMEnter(var Message: TCMGotFocus); message CM_ENTER;
       procedure CMExit(var Message: TCMExit); message CM_EXIT;
       procedure WMPaste(var Message: TWMPaste); message WM_PASTE;
       procedure WMCut(var Message: TWMCut); message WM_CUT;

    protected
       function  IsValidChar(Key: Char): Boolean; virtual;
       procedure KeyPress(var Key: Char); override;
       procedure CreateParams(var Params: TCreateParams); override;

    public
       constructor Create(AOwner: TComponent); override;

    published
       property MaxValue: LongInt read FMaxValue write FMaxValue default 1000;
       property MinValue: LongInt read FMinValue write FMinValue default 0;
       property Value: LongInt read GetValue write SetValue default 0;
       property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;
    end;

    {-- TMMFloatNumberEdit ----------------------------------------------------}
    TMMFloatNumberEdit = class(TEdit)
    private
       FMinValue  : Double;
       FMaxValue  : Double;
       FAlignment : TAlignment;

       function  GetValue: Double;
       function  CheckValue(NewValue: Double): Double;
       procedure SetValue (NewValue: Double);
       procedure SetAlignment(Value: TAlignment);
       procedure CMEnter(var Message: TCMGotFocus); message CM_ENTER;
       procedure CMExit(var Message: TCMExit); message CM_EXIT;
       procedure WMPaste(var Message: TWMPaste); message WM_PASTE;
       procedure WMCut(var Message: TWMCut); message WM_CUT;

    protected
       function  IsValidChar(Key: Char): Boolean; virtual;
       procedure KeyPress(var Key: Char); override;
       procedure CreateParams(var Params: TCreateParams); override;

    public
       constructor Create(AOwner: TComponent); override;

    published
       property MaxValue: Double read FMaxValue write FMaxValue;
       property MinValue: Double read FMinValue write FMinValue;
       property Value: Double read GetValue write SetValue;
       property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;
    end;

implementation

{== TMMNumberEdit =============================================================}
constructor TMMNumberEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  Text := '0';
  FMaxValue := 1000;
  FMinValue := 0;
  FAlignment:= taLeftJustify;
  ControlStyle := ControlStyle - [csSetCaption];

  ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
end;

{-- TMMNumberEdit -------------------------------------------------------------}
procedure TMMNumberEdit.KeyPress(var Key: Char);
begin
  if not IsValidChar(Key) then
  begin
    Key := #0;
    MessageBeep(0)
  end;
  if Key <> #0 then inherited KeyPress(Key);
end;

{-- TMMNumberEdit -------------------------------------------------------------}
function TMMNumberEdit.IsValidChar(Key: Char): Boolean;
begin
  Result := (Key in ['+', '-', '0'..'9']) or
    ((Key < #32) and (Key <> Chr(VK_RETURN)));
  if not Enabled and Result and ((Key >= #32) or
      (Key = Char(VK_BACK)) or (Key = Char(VK_DELETE))) then
    Result := False;
end;

{-- TMMNumberEdit -------------------------------------------------------------}
procedure TMMNumberEdit.CreateParams(var Params: TCreateParams);
const
  Alignments: array[TAlignment] of integer = (ES_LEFT, ES_RIGHT, ES_CENTER);
begin
  inherited CreateParams(Params);
{  Params.Style := Params.Style and not WS_BORDER;  }
  Params.Style := Params.Style or ES_MULTILINE or WS_CLIPCHILDREN or Alignments[FAlignment];
end;

{-- TMMNumberEdit -------------------------------------------------------------}
procedure TMMNumberEdit.SetAlignment(Value: TAlignment);
begin
  if FAlignment <> Value then
  begin
    FAlignment := Value;
    RecreateWnd;
  end;
end;

{-- TMMNumberEdit -------------------------------------------------------------}
procedure TMMNumberEdit.WMPaste(var Message: TWMPaste);
begin
   if not Enabled or ReadOnly then Exit;
   inherited;
end;

{-- TMMNumberEdit -------------------------------------------------------------}
procedure TMMNumberEdit.WMCut(var Message: TWMPaste);
begin
  if not Enabled or ReadOnly then Exit;
  inherited;
end;

{-- TMMNumberEdit -------------------------------------------------------------}
procedure TMMnumberEdit.CMExit(var Message: TCMExit);
begin
  inherited;
  SetValue(Value);
end;

{-- TMMNumberEdit -------------------------------------------------------------}
function TMMNumberEdit.GetValue: LongInt;
begin
  try
    Result := StrToInt(Text);
  except
    Result := FMinValue;
  end;
end;

{-- TMMNumberEdit -------------------------------------------------------------}
procedure TMMNumberEdit.SetValue (NewValue: LongInt);
begin
  Text := IntToStr(CheckValue(NewValue));
end;

{-- TMMNumberEdit -------------------------------------------------------------}
function TMMNumberEdit.CheckValue(NewValue: LongInt): LongInt;
begin
  Result := NewValue;
  if (FMaxValue <> FMinValue) then
  begin
    if NewValue < FMinValue then
      Result := FMinValue
    else if NewValue > FMaxValue then
      Result := FMaxValue;
  end;
end;

{-- TMMNumberEdit -------------------------------------------------------------}
procedure TMMNumberEdit.CMEnter(var Message: TCMGotFocus);
begin
  if AutoSelect and not (csLButtonDown in ControlState) then
    SelectAll;
  inherited;
end;

{== TMMFloatNumberEdit ========================================================}
constructor TMMFloatNumberEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  Text := '0.00';
  FMaxValue := 1000;
  FMinValue := 0;
  FAlignment:= taLeftJustify;
  ControlStyle := ControlStyle - [csSetCaption];

  ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
end;

{-- TMMFloatNumberEdit --------------------------------------------------------}
procedure TMMFloatNumberEdit.KeyPress(var Key: Char);
begin
  if not IsValidChar(Key) then
  begin
    Key := #0;
    MessageBeep(0)
  end;
  if Key <> #0 then inherited KeyPress(Key);
end;

{-- TMMFloatNumberEdit --------------------------------------------------------}
function TMMFloatNumberEdit.IsValidChar(Key: Char): Boolean;
begin
  Result := (Key in [DecimalSeparator, '+', '-', '0'..'9']) or
    ((Key < #32) and (Key <> Chr(VK_RETURN)));
  if not Enabled and Result and ((Key >= #32) or
      (Key = Char(VK_BACK)) or (Key = Char(VK_DELETE))) then
    Result := False;
end;

{-- TMMFloatNumberEdit --------------------------------------------------------}
procedure TMMFloatNumberEdit.CreateParams(var Params: TCreateParams);
const
  Alignments: array[TAlignment] of Longint = (ES_LEFT, ES_RIGHT, ES_CENTER);
begin
  inherited CreateParams(Params);
{  Params.Style := Params.Style and not WS_BORDER;  }
  Params.Style := Params.Style or ES_MULTILINE or WS_CLIPCHILDREN or Alignments[FAlignment];
end;

{-- TMMFloatNumberEdit --------------------------------------------------------}
procedure TMMFloatNumberEdit.SetAlignment(Value: TAlignment);
begin
  if FAlignment <> Value then
  begin
    FAlignment := Value;
    RecreateWnd;
  end;
end;

{-- TMMFloatNumberEdit --------------------------------------------------------}
procedure TMMFloatNumberEdit.WMPaste(var Message: TWMPaste);
begin
   if not Enabled or ReadOnly then Exit;
   inherited;
end;

{-- TMMFloatNumberEdit --------------------------------------------------------}
procedure TMMFloatNumberEdit.WMCut(var Message: TWMPaste);
begin
  if not Enabled or ReadOnly then Exit;
  inherited;
end;

{-- TMMFloatNumberEdit --------------------------------------------------------}
procedure TMMFloatNumberEdit.CMExit(var Message: TCMExit);
begin
  inherited;
  SetValue(Value);
end;

{-- TMMFloatNumberEdit --------------------------------------------------------}
function TMMFloatNumberEdit.GetValue: Double;
begin
  try
    Result := StrToFloat(Text);
  except
    Result := FMinValue;
  end;
end;

{-- TMMFloatNumberEdit --------------------------------------------------------}
procedure TMMFloatNumberEdit.SetValue(NewValue: Double);
begin
  Text := Format('%f',[CheckValue(NewValue)]);
end;

{-- TMMNumberEdit -------------------------------------------------------------}
function TMMFloatNumberEdit.CheckValue(NewValue: Double): Double;
begin
  Result := NewValue;
  if (FMaxValue <> FMinValue) then
  begin
    if NewValue < FMinValue then
      Result := FMinValue
    else if NewValue > FMaxValue then
      Result := FMaxValue;
  end;
end;

{-- TMMFloatNumberEdit --------------------------------------------------------}
procedure TMMFloatNumberEdit.CMEnter(var Message: TCMGotFocus);
begin
  if AutoSelect and not (csLButtonDown in ControlState) then
    SelectAll;
  inherited;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -