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

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 1995 AO ROSNO                   }
  6. {                                                       }
  7. {*******************************************************}
  8. unit DataConv;
  9. interface
  10. {$I RX.INC}
  11. uses SysUtils, {$IFDEF WIN32} Windows, {$ELSE} WinTypes, WinProcs, {$ENDIF}
  12.   Messages, Classes, Graphics, Controls, Forms, Dialogs, DateUtil;
  13. type
  14.   TDataType = (dtString, dtInteger, dtFloat, dtDateTime, dtDate,
  15.     dtTime, dtBoolean);
  16.   TTimeFormat = (tfHHMMSS, tfHMMSS, tfHHMM, tfHMM);
  17. { TDateTimeFormat }
  18.   TDateTimeFormat = class(TPersistent)
  19.   private
  20.     FAMString: string[7];
  21.     FPMString: string[7];
  22.     FDateOrder: TDateOrder;
  23.     FTimeFormat: TTimeFormat;
  24.     FTimeSeparator: Char;
  25.     FDateSeparator: Char;
  26.     FLongDate: Boolean;
  27.     FFourDigitYear: Boolean;
  28.     FLeadingZero: Boolean;
  29.     function GetAMString: string;
  30.     procedure SetAMString(const Value: string);
  31.     function GetPMString: string;
  32.     procedure SetPMString(const Value: string);
  33.   protected
  34.     function GetDateMask: string; virtual;
  35.     function GetTimeMask: string; virtual;
  36.     function GetMask: string; virtual;
  37.   public
  38.     constructor Create;
  39.     destructor Destroy; override;
  40.     procedure Assign(Source: TPersistent); override;
  41.     procedure ResetDefault; virtual;
  42.     property DateMask: string read GetDateMask;
  43.     property TimeMask: string read GetTimeMask;
  44.     property Mask: string read GetMask;
  45.   published
  46.     property AMString: string read GetAMString write SetAMString;
  47.     property PMString: string read GetPMString write SetPMString;
  48.     property DateOrder: TDateOrder read FDateOrder write FDateOrder;
  49.     property TimeFormat: TTimeFormat read FTimeFormat write FTimeFormat;
  50.     property TimeSeparator: Char read FTimeSeparator write FTimeSeparator;
  51.     property DateSeparator: Char read FDateSeparator write FDateSeparator;
  52.     property LongDate: Boolean read FLongDate write FLongDate default False;
  53.     property FourDigitYear: Boolean read FFourDigitYear write FFourDigitYear default True;
  54.     property LeadingZero: Boolean read FLeadingZero write FLeadingZero default False;
  55.   end;
  56. { TConverter }
  57.   TConverter = class(TComponent)
  58.   private
  59.     { Private declarations }
  60.     FData: PString;
  61.     FTextValues: array[Boolean] of string[15];
  62.     FDataType: TDataType;
  63.     FDateTimeFormat: TDateTimeFormat;
  64.     FFloatFormat: TFloatFormat;
  65.     FPrecision, FDigits: Integer;
  66.     FRaiseOnError: Boolean;
  67.     FOnChange: TNotifyEvent;
  68.     procedure SetDataType(Value: TDataType);
  69.     procedure SetDateTimeFormat(Value: TDateTimeFormat);
  70.     function GetDateTimeFormat: TDateTimeFormat;
  71.     function GetString: string;
  72.     procedure SetString(const Value: string);
  73.     function GetDateTime: TDateTime;
  74.     function GetBoolValues(Index: Integer): string;
  75.     procedure SetBoolValues(Index: Integer; const Value: string);
  76.     procedure CheckDataType;
  77.     function BoolToStr(Value: Boolean): string;
  78.     function FloatToString(Value: Double): string;
  79.     function DateTimeToString(Value: TDateTime): string;
  80.   protected
  81.     { Protected declarations }
  82.     procedure Change; dynamic;
  83.     function GetAsBoolean: Boolean; virtual;
  84.     function GetAsDateTime: TDateTime; virtual;
  85.     function GetAsDate: TDateTime; virtual;
  86.     function GetAsTime: TDateTime; virtual;
  87.     function GetAsFloat: Double; virtual;
  88.     function GetAsInteger: Longint; virtual;
  89.     function GetAsString: string; virtual;
  90.     procedure SetAsBoolean(Value: Boolean); virtual;
  91.     procedure SetAsDateTime(Value: TDateTime); virtual;
  92.     procedure SetAsDate(Value: TDateTime); virtual;
  93.     procedure SetAsTime(Value: TDateTime); virtual;
  94.     procedure SetAsFloat(Value: Double); virtual;
  95.     procedure SetAsInteger(Value: Longint); virtual;
  96.     procedure SetAsString(const Value: string); virtual;
  97.   public
  98.     { Public declarations }
  99.     constructor Create(AOwner: TComponent); override;
  100.     destructor Destroy; override;
  101.     procedure Clear;
  102.     function IsValidChar(Ch: Char): Boolean; virtual;
  103.     property AsBoolean: Boolean read GetAsBoolean write SetAsBoolean;
  104.     property AsDateTime: TDateTime read GetAsDateTime write SetAsDateTime;
  105.     property AsDate: TDateTime read GetAsDate write SetAsDate;
  106.     property AsTime: TDateTime read GetAsTime write SetAsTime;
  107.     property AsFloat: Double read GetAsFloat write SetAsFloat;
  108.     property AsInteger: Longint read GetAsInteger write SetAsInteger;
  109.     property AsString: string read GetAsString write SetAsString;
  110.   published
  111.     { Published declarations }
  112.     property DataType: TDataType read FDataType write SetDataType default dtString;
  113.     property DateTimeFormat: TDateTimeFormat read GetDateTimeFormat write SetDateTimeFormat;
  114.     property Digits: Integer read FDigits write FDigits default 2;
  115.     property DisplayFalse: string index 0 read GetBoolValues write SetBoolValues;
  116.     property DisplayTrue: string index 1 read GetBoolValues write SetBoolValues;
  117.     property FloatFormat: TFloatFormat read FFloatFormat write FFloatFormat default ffGeneral;
  118.     property Precision: Integer read FPrecision write FPrecision default 15;
  119.     property RaiseOnError: Boolean read FRaiseOnError write FRaiseOnError default False;
  120.     property Text: string read GetString write SetAsString;
  121.     property OnChange: TNotifyEvent read FOnChange write FOnChange;
  122.   end;
  123. implementation
  124. { TDateTimeFormat }
  125. constructor TDateTimeFormat.Create;
  126. begin
  127.   inherited Create;
  128.   ResetDefault;
  129. end;
  130. destructor TDateTimeFormat.Destroy;
  131. begin
  132.   inherited Destroy;
  133. end;
  134. procedure TDateTimeFormat.ResetDefault;
  135. begin
  136.   FAMString := TimeAMString;
  137.   FPMString := TimePMString;
  138.   FTimeSeparator := SysUtils.TimeSeparator;
  139.   FDateSeparator := SysUtils.DateSeparator;
  140.   FDateOrder := doDMY;
  141.   FTimeFormat := tfHHMMSS;
  142.   FLongDate := False;
  143.   FFourDigitYear := True;
  144.   FLeadingZero := False;
  145. end;
  146. procedure TDateTimeFormat.Assign(Source: TPersistent);
  147. begin
  148.   if Source is TDateTimeFormat then begin
  149.     FAMString := TDateTimeFormat(Source).AMString;
  150.     FPMString := TDateTimeFormat(Source).PMString;
  151.     FDateOrder := TDateTimeFormat(Source).DateOrder;
  152.     FTimeFormat := TDateTimeFormat(Source).TimeFormat;
  153.     FTimeSeparator := TDateTimeFormat(Source).TimeSeparator;
  154.     FDateSeparator := TDateTimeFormat(Source).DateSeparator;
  155.     FLongDate := TDateTimeFormat(Source).LongDate;
  156.     FFourDigitYear := TDateTimeFormat(Source).FourDigitYear;
  157.     FLeadingZero := TDateTimeFormat(Source).LeadingZero;
  158.     Exit;
  159.   end;
  160.   inherited Assign(Source);
  161. end;
  162. function TDateTimeFormat.GetAMString: string;
  163. begin
  164.   Result := FAMString;
  165. end;
  166. procedure TDateTimeFormat.SetAMString(const Value: string);
  167. begin
  168.   if Value = '' then FAMString := TimeAMString
  169.   else FAMString := Value;
  170. end;
  171. function TDateTimeFormat.GetPMString: string;
  172. begin
  173.   Result := FPMString;
  174. end;
  175. procedure TDateTimeFormat.SetPMString(const Value: string);
  176. begin
  177.   if Value = '' then FPMString := TimePMString
  178.   else FPMString := Value;
  179. end;
  180. function TDateTimeFormat.GetDateMask: string;
  181. var
  182.   S: array[1..3] of string[7];
  183.   Separator: string[3];
  184. begin
  185.   Result := '';
  186.   if LeadingZero then begin
  187.     S[1] := 'dd';
  188.     S[2] := 'mm';
  189.   end
  190.   else begin
  191.     S[1] := 'd';
  192.     S[2] := 'm';
  193.   end;
  194.   if LongDate then begin
  195.     S[2] := 'mmmm';
  196.     Separator := ' ';
  197.   end
  198.   else Separator := '"' + DateSeparator + '"';
  199.   if FourDigitYear then S[3] := 'yyyy'
  200.   else S[3] := 'yy';
  201.   case DateOrder of
  202.     doDMY: Result := S[1] + Separator + S[2] + Separator + S[3];
  203.     doMDY: Result := S[2] + Separator + S[1] + Separator + S[3];
  204.     doYMD: Result := S[3] + Separator + S[2] + Separator + S[1];
  205.   end;
  206. end;
  207. function TDateTimeFormat.GetTimeMask: string;
  208. var
  209.   S: array[1..3] of string[7];
  210.   Separator: string[3];
  211.   AMPM: string[16];
  212. begin
  213.   Separator := '"' + TimeSeparator + '"';
  214.   AMPM := ' ' + AMString + '/' + PMString;
  215.   if LeadingZero then begin
  216.     S[1] := 'hh';
  217.     S[2] := 'nn';
  218.     S[3] := 'ss';
  219.   end
  220.   else begin
  221.     S[1] := 'h';
  222.     S[2] := 'n';
  223.     S[3] := 's';
  224.   end;
  225.   case TimeFormat of
  226.     tfHHMMSS: Result := S[1] + Separator + S[2] + Separator + S[3];
  227.     tfHMMSS: Result := S[1] + Separator + S[2] + Separator + S[3] + AMPM;
  228.     tfHHMM: Result := S[1] + Separator + S[2];
  229.     tfHMM: Result := S[1] + Separator + S[2] + AMPM;
  230.   end;
  231. end;
  232. function TDateTimeFormat.GetMask: string;
  233. begin
  234.   Result := GetDateMask + ' ' + GetTimeMask;
  235. end;
  236. { TConverter }
  237. constructor TConverter.Create(AOwner: TComponent);
  238. begin
  239.   inherited Create(AOwner);
  240.   FData := NullStr;
  241.   FDataType := dtString;
  242.   FPrecision := 15;
  243.   FDigits := 2;
  244.   FDateTimeFormat := TDateTimeFormat.Create;
  245.   FTextValues[False] := 'False';
  246.   FTextValues[True] := 'True';
  247.   FRaiseOnError := False;
  248. end;
  249. destructor TConverter.Destroy;
  250. begin
  251.   FDataType := dtString;
  252.   DisposeStr(FData);
  253.   FDateTimeFormat.Free;
  254.   inherited Destroy;
  255. end;
  256. procedure TConverter.Clear;
  257. begin
  258.   DisposeStr(FData);
  259.   FData := NullStr;
  260.   Change;
  261. end;
  262. procedure TConverter.Change;
  263. begin
  264.   if Assigned(FOnChange) then FOnChange(Self);
  265. end;
  266. function TConverter.GetString: string;
  267. begin
  268.   Result := FData^;
  269. end;
  270. procedure TConverter.SetString(const Value: string);
  271. begin
  272.   AssignStr(FData, Value);
  273. end;
  274. function TConverter.GetDateTimeFormat: TDateTimeFormat;
  275. begin
  276.   Result := FDateTimeFormat;
  277. end;
  278. procedure TConverter.SetDateTimeFormat(Value: TDateTimeFormat);
  279. begin
  280.   FDateTimeFormat.Assign(Value);
  281. end;
  282. function TConverter.GetBoolValues(Index: Integer): string;
  283. begin
  284.   Result := FTextValues[Boolean(Index)];
  285. end;
  286. procedure TConverter.SetBoolValues(Index: Integer; const Value: string);
  287. begin
  288.   FTextValues[Boolean(Index)] := Value;
  289. end;
  290. function TConverter.BoolToStr(Value: Boolean): string;
  291. begin
  292.   Result := GetBoolValues(Integer(Value));
  293. end;
  294. function TConverter.FloatToString(Value: Double): string;
  295. begin
  296.   Result := FloatToStrF(Value, FloatFormat, Precision, Digits);
  297. end;
  298. function TConverter.DateTimeToString(Value: TDateTime): string;
  299. begin
  300.   case FDataType of
  301.     dtDate: Result := FormatDateTime(DateTimeFormat.DateMask, Value);
  302.     dtTime: Result := FormatDateTime(DateTimeFormat.TimeMask, Value);
  303.     else Result := FormatDateTime(DateTimeFormat.Mask, Value);
  304.   end;
  305. end;
  306. procedure TConverter.SetDataType(Value: TDataType);
  307. begin
  308.   if Value <> FDataType then begin
  309.     FDataType := Value;
  310.     try
  311.       CheckDataType;
  312.       Change;
  313.     except
  314.       Clear;
  315.       if RaiseOnError then raise;
  316.     end;
  317.   end;
  318. end;
  319. function TConverter.IsValidChar(Ch: Char): Boolean;
  320. begin
  321.   case FDataType of
  322.     dtString: Result := True;
  323.     dtInteger: Result := Ch in ['+', '-', '0'..'9'];
  324.     dtFloat: Result := Ch in [DecimalSeparator, '+', '-', '0'..'9', 'E', 'e'];
  325.     dtDateTime, dtDate, dtTime: Result := True;
  326.     dtBoolean: Result := True;
  327.     else Result := False;
  328.   end;
  329. end;
  330. procedure TConverter.CheckDataType;
  331. begin
  332.   case FDataType of
  333.     dtInteger, dtFloat: StrToFloat(GetString);
  334.     dtDateTime, dtDate, dtTime: GetDateTime;
  335.   end;
  336. end;
  337. function TConverter.GetAsBoolean: Boolean;
  338. var
  339.   S: string[15];
  340. begin
  341.   S := GetString;
  342.   Result := (Length(S) > 0) and ((S[1] in ['T', 't', 'Y', 'y']) or
  343.     (S = FTextValues[True]));
  344. end;
  345. function TConverter.GetDateTime: TDateTime;
  346. var
  347.   S: string;
  348.   I: Integer;
  349.   DateS, TimeS: set of Char;
  350. begin
  351.   S := GetString;
  352.   DateS := ['/', '.'] + [DateTimeFormat.DateSeparator] - 
  353.     [DateTimeFormat.TimeSeparator];
  354.   TimeS := [':', '-'] - [DateTimeFormat.DateSeparator] + 
  355.     [DateTimeFormat.TimeSeparator];
  356.   for I := 1 to Length(S) do begin
  357.     if S[I] in DateS then S[I] := DateSeparator
  358.     else if S[I] in TimeS then S[I] := TimeSeparator;
  359.   end;
  360.   Result := StrToDateTime(S);
  361. end;
  362. function TConverter.GetAsDateTime: TDateTime;
  363. begin
  364.   try
  365.     Result := GetDateTime;
  366.   except
  367.     Result := NullDate;
  368.   end;
  369. end;
  370. function TConverter.GetAsDate: TDateTime;
  371. var
  372.   Year, Month, Day: Word;
  373. begin
  374.   try
  375.     Result := GetAsDateTime;
  376.     DecodeDate(Result, Year, Month, Day);
  377.     Result := EncodeDate(Year, Month, Day);
  378.   except
  379.     Result := NullDate;
  380.   end;
  381. end;
  382. function TConverter.GetAsTime: TDateTime;
  383. var
  384.   Hour, Min, Sec, MSec: Word;
  385. begin
  386.   try
  387.     Result := GetAsDateTime;
  388.     DecodeTime(Result, Hour, Min, Sec, MSec);
  389.     Result := EncodeTime(Hour, Min, Sec, MSec);
  390.   except
  391.     Result := NullDate;
  392.   end;
  393. end;
  394. function TConverter.GetAsFloat: Double;
  395. begin
  396.   try
  397.     case FDataType of
  398.       dtDateTime: Result := GetAsDateTime;
  399.       dtDate: Result := GetAsDate;
  400.       dtTime: Result := GetAsTime;
  401.       else Result := StrToFloat(GetString);
  402.     end;
  403.   except
  404.     Result := 0.0;
  405.   end;
  406. end;
  407. function TConverter.GetAsInteger: Longint;
  408. begin
  409.   Result := Round(GetAsFloat);
  410. end;
  411. function TConverter.GetAsString: string;
  412. begin
  413.   case FDataType of
  414.     dtString: Result := GetString;
  415.     dtInteger: Result := IntToStr(GetAsInteger);
  416.     dtFloat: Result := FloatToString(GetAsFloat);
  417.     dtDateTime: Result := DateTimeToString(GetAsDateTime);
  418.     dtDate: Result := DateTimeToString(GetAsDate);
  419.     dtTime: Result := DateTimeToString(GetAsTime);
  420.     dtBoolean: Result := BoolToStr(GetAsBoolean);
  421.   end;
  422. end;
  423. procedure TConverter.SetAsBoolean(Value: Boolean);
  424. begin
  425.   SetAsString(BoolToStr(Value));
  426. end;
  427. procedure TConverter.SetAsDateTime(Value: TDateTime);
  428. begin
  429.   SetAsString(DateTimeToStr(Value));
  430. end;
  431. procedure TConverter.SetAsDate(Value: TDateTime);
  432. begin
  433.   SetAsDateTime(Value);
  434. end;
  435. procedure TConverter.SetAsTime(Value: TDateTime);
  436. begin
  437.   SetAsDateTime(Value);
  438. end;
  439. procedure TConverter.SetAsFloat(Value: Double);
  440. begin
  441.   if FDataType in [dtDateTime, dtDate, dtTime] then
  442.     SetAsDateTime(Value)
  443.   else SetAsString(FloatToStr(Value));
  444. end;
  445. procedure TConverter.SetAsInteger(Value: Longint);
  446. begin
  447.   if FDataType = dtInteger then SetAsString(IntToStr(Value))
  448.   else SetAsFloat(Value);
  449. end;
  450. procedure TConverter.SetAsString(const Value: string);
  451. var
  452.   S: string;
  453. begin
  454.   S := GetString;
  455.   SetString(Value);
  456.   try
  457.     CheckDataType;
  458.     Change;
  459.   except
  460.     SetString(S);
  461.     if RaiseOnError then raise;
  462.   end;
  463. end;
  464. end.