diff --git a/components/jujiboutils/changes.txt b/components/jujiboutils/changes.txt index 8ccaf35f8..7de4553ef 100644 --- a/components/jujiboutils/changes.txt +++ b/components/jujiboutils/changes.txt @@ -6,6 +6,7 @@ JUJIBOUTILS Version pre-1.0 -------------------------------------------------- 2011-09-20 Added: TJIntegerEdit, TJLabeledIntegerEdit + TJCurrencyEdit, TJLabeledCurrencyEdit 2011-09-19 Added: TJDBLabeledIntegerEdit, TJDBLabeledCurrencyEdit, TJDBLabeledDateEdit 2011-09-19 First package: TJDBIntegerEdit, TJDBCurrencyEdit, TJDBDateEdit and example 2011-09-14 Add Non Database input controls example diff --git a/components/jujiboutils/jujibo-utils/jujibocontrols.lpk b/components/jujiboutils/jujibo-utils/jujibocontrols.lpk index 66c3fb56e..66fdb96ad 100644 --- a/components/jujiboutils/jujibo-utils/jujibocontrols.lpk +++ b/components/jujiboutils/jujibo-utils/jujibocontrols.lpk @@ -12,7 +12,7 @@ - + @@ -57,6 +57,16 @@ + + + + + + + + + + diff --git a/components/jujiboutils/jujibo-utils/jujibocontrols.pas b/components/jujiboutils/jujibo-utils/jujibocontrols.pas index 7f71f8092..505af159f 100644 --- a/components/jujiboutils/jujibo-utils/jujibocontrols.pas +++ b/components/jujiboutils/jujibo-utils/jujibocontrols.pas @@ -9,7 +9,8 @@ interface uses jdbcurrencyedit, jdbdateedit, jdbintegeredit, jcontrolutils, jdblabeledcurrencyedit, jdblabeleddateedit, jdblabeledintegeredit, - JIntegerEdit, JLabeledIntegerEdit, LazarusPackageIntf; + JIntegerEdit, JLabeledIntegerEdit, JCurrencyEdit, JLabeledCurrencyEdit, + LazarusPackageIntf; implementation @@ -23,6 +24,8 @@ begin RegisterUnit('jdblabeledintegeredit', @jdblabeledintegeredit.Register); RegisterUnit('JIntegerEdit', @JIntegerEdit.Register); RegisterUnit('JLabeledIntegerEdit', @JLabeledIntegerEdit.Register); + RegisterUnit('JCurrencyEdit', @JCurrencyEdit.Register); + RegisterUnit('JLabeledCurrencyEdit', @JLabeledCurrencyEdit.Register); end; initialization diff --git a/components/jujiboutils/jujibo-utils/src/jcurrencyedit.pas b/components/jujiboutils/jujibo-utils/src/jcurrencyedit.pas new file mode 100644 index 000000000..5220b82d2 --- /dev/null +++ b/components/jujiboutils/jujibo-utils/src/jcurrencyedit.pas @@ -0,0 +1,212 @@ +unit JCurrencyEdit; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, LResources, Forms, Controls, StdCtrls, Graphics, Dialogs; + +type + + { TJCurrencyEdit } + + TJCurrencyEdit = class(TCustomEdit) + private + { Private declarations } + theValue: currency; + fFormat: string; + fDecimals: integer; + function getDecimals: integer; + function getFormat: string; + function getValue: currency; + procedure formatInput; + procedure setDecimals(const AValue: integer); + procedure setFormat(const AValue: string); + function scaleTo(const AValue: currency; const NDecimals: integer): currency; + function IsValidFloat(const Value: string): boolean; + procedure setValue(const AValue: currency); + protected + { Protected declarations } + procedure DoEnter; override; + procedure DoExit; override; + procedure KeyPress(var Key: char); override; + public + { Public declarations } + constructor Create(TheOwner: TComponent); override; + destructor Destroy; override; + published + { Published declarations } + property DisplayFormat: string read getFormat write setFormat; + property Decimals: integer read getDecimals write setDecimals; + property Value: currency read getValue write setValue; + + property Action; + property Align; + property Alignment; + property Anchors; + property AutoSize; + property AutoSelect; + property BidiMode; + property BorderStyle; + property BorderSpacing; + property CharCase; + property Color; + property Constraints; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property HideSelection; + property MaxLength; + property ParentBidiMode; + property OnChange; + property OnChangeBounds; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEditingDone; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + property OnMouseDown; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + property OnMouseUp; + property OnResize; + property OnStartDrag; + property OnUTF8KeyPress; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property TabStop; + property TabOrder; + property Visible; + end; + +procedure Register; + +implementation + +uses + Math; + +procedure Register; +begin + {$I jcurrencyedit_icon.lrs} + RegisterComponents('Additional', [TJCurrencyEdit]); +end; + +{ TJCurrencyEdit } + +function TJCurrencyEdit.getDecimals: integer; +begin + Result := fDecimals; +end; + +function TJCurrencyEdit.getFormat: string; +begin + Result := fFormat; +end; + +function TJCurrencyEdit.getValue: currency; +begin + Result := theValue; +end; + +procedure TJCurrencyEdit.formatInput; +begin + Caption := FormatFloat(DisplayFormat, theValue); +end; + +procedure TJCurrencyEdit.setDecimals(const AValue: integer); +begin + if (AValue >= 0) and (AValue < 5) then + fDecimals := AValue; +end; + +procedure TJCurrencyEdit.setFormat(const AValue: string); +begin + fFormat := AValue; + formatInput; +end; + +function TJCurrencyEdit.scaleTo(const AValue: currency; + const NDecimals: integer): currency; +begin + Result := round(AValue * power(10, NDecimals)) / power(10, NDecimals); +end; + +function TJCurrencyEdit.IsValidFloat(const Value: string): boolean; +begin + if StrToCurrDef(Value, MaxCurrency) = MaxCurrency then + Result := False + else + Result := True; +end; + +procedure TJCurrencyEdit.setValue(const AValue: currency); +begin + theValue := scaleTo(AValue, fDecimals); + formatInput; +end; + +procedure TJCurrencyEdit.DoEnter; +begin + inherited DoEnter; + Text := FloatToStr(theValue); + SelectAll; +end; + +procedure TJCurrencyEdit.DoExit; +begin + inherited DoExit; + if IsValidFloat(Text) then + theValue := StrToCurr(Text) + else + begin + ShowMessage(Text + ' no es un valor válido'); + SetFocus; + end; + theValue := scaleTo(theValue, fDecimals); + formatInput; +end; + +procedure TJCurrencyEdit.KeyPress(var Key: char); +begin + if (Key in ['.', ',']) then + Key := Decimalseparator; + if (key = DecimalSeparator) and (Pos(key, Text) > 0) then + key := #0; + if not (Key in ['0'..'9', DecimalSeparator, '+', '-', #8, #9]) then + Key := #0; + if (Key = DecimalSeparator) and (fDecimals = 0) then + Key := #0; + inherited KeyPress(Key); +end; + +constructor TJCurrencyEdit.Create(TheOwner: TComponent); +begin + inherited Create(TheOwner); + Text := ''; + fFormat := '#,0.00'; + fDecimals := 2; + formatInput; +end; + +destructor TJCurrencyEdit.Destroy; +begin + inherited Destroy; +end; + +end. + diff --git a/components/jujiboutils/jujibo-utils/src/jcurrencyedit_icon.lrs b/components/jujiboutils/jujibo-utils/src/jcurrencyedit_icon.lrs new file mode 100644 index 000000000..6ec41dc58 --- /dev/null +++ b/components/jujiboutils/jujibo-utils/src/jcurrencyedit_icon.lrs @@ -0,0 +1,29 @@ +LazarusResources.Add('tjcurrencyedit','PNG',[ + #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0 + +#0#0#1'sRGB'#0#174#206#28#233#0#0#0#6'bKGD'#0#255#0#255#0#255#160#189#167#147 + +#0#0#0#9'pHYs'#0#0#11#19#0#0#11#19#1#0#154#156#24#0#0#0#7'tIME'#7#219#9#20#9 + +#27#2'.'#175'u'#204#0#0#2'''IDATH'#199#213#148'?h'#19'q'#20#199'?'#215#166 + +#181#144#208#218'@'#29#132'f'#8#136'A'#172#29'r'#160#18'p'#136#171#139#163'v' + +'p'#168'.'#191#12#226#146#14#130'tq'#136#131'Z'#240'N'#161'D'#232#224#159'U' + +#208'1'#29'4'#193'%S'#20','#4#170#182'('#18'!MJ'#2'Il'#242'sh'#239#252#221']' + +#26#154'T'#7#31#252#184#247#30#191#251'~~'#239#221#187#31#252'c'#211#212#224 + +#197#219#239','#191'^'#239#186#241#198#165'0W.'#28#31#12#160#10'/%f9'#29#10 + +#240'q'#163'F'#169#210#164'TmQ'#170'4y'#149#253'6'#16'h'#24'`k'#234'2gN'#4'9' + +'w*'#136#127'l'#152'z'#179#227#16'/U['#4''''#198#240#251'G'#200#228#127#240 + +'9'#247#244#192#0#31'@xz'#156'B'#177'L'#161#8#199#142#134#1#28#226#245'F'#155 + +'B'#177#140#181'w'#181#143#22#249',''R{.'#1#222#189#132#181#192'Um'#245'^' + +#140'x2go?'#127'M' + +#211#132#16#210#13#176#170'92'#210#26#248#138'X\'#188#195#196'dH'#235#217#162 + +#251#15#151#7#6'lW6w'#29'!'#132#148#18#207#218#205'K'#25'Of'#165'j'#241'd' + +#214#206#253#218'i;'#226'h4j?'#171'['#27#210#6#184'!'#127'r^'#128#10#234't:' + +#142'X'#133'X'#128#158'-'#234'fRJ4Ms'#196#3'O'#209'~'#194#23#23'rdR1'#219#7 + +#236#216#243''''#171'S'#227#158'"'#199#189#190''''#238'>}&'#21'#'#147#138#217 + +' O'#5#166'ijB'#8#233#22'}'#240#200#232#250#130'zz'#21#182#239']'#4#16#141 + +#158#245#136#143'j^a'#213#183'b'#203#207#164'b'#232#186'N>'#159'G'#215#245 + +#222#212'tzE'#222#186'y'#221'35'#253#152'5E]k'#180'g'#248#144'61'#25#210#248 + +#239#237'7T'#213#192'u'#139'\'#209'^'#0#0#0#0'IEND'#174'B`'#130 +]); diff --git a/components/jujiboutils/jujibo-utils/src/jintegeredit.pas b/components/jujiboutils/jujibo-utils/src/jintegeredit.pas index 94502d385..68f5c1742 100644 --- a/components/jujiboutils/jujibo-utils/src/jintegeredit.pas +++ b/components/jujiboutils/jujibo-utils/src/jintegeredit.pas @@ -35,6 +35,57 @@ type { Published declarations } property DisplayFormat: string read getFormat write setFormat; property Value: integer read getValue write setValue; + + property Action; + property Align; + property Alignment; + property Anchors; + property AutoSize; + property AutoSelect; + property BidiMode; + property BorderStyle; + property BorderSpacing; + property CharCase; + property Color; + property Constraints; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property HideSelection; + property MaxLength; + property ParentBidiMode; + property OnChange; + property OnChangeBounds; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEditingDone; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + property OnMouseDown; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + property OnMouseUp; + property OnResize; + property OnStartDrag; + property OnUTF8KeyPress; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowHint; + property TabStop; + property TabOrder; + property Visible; end; procedure Register; diff --git a/components/jujiboutils/jujibo-utils/src/jlabeledcurrencyedit.pas b/components/jujiboutils/jujibo-utils/src/jlabeledcurrencyedit.pas new file mode 100644 index 000000000..eb9e11094 --- /dev/null +++ b/components/jujiboutils/jujibo-utils/src/jlabeledcurrencyedit.pas @@ -0,0 +1,208 @@ +unit JLabeledCurrencyEdit; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, LResources, Forms, Controls, ExtCtrls, Graphics, Dialogs; + +type + + { TJLabeledCurrencyEdit } + + TJLabeledCurrencyEdit = class(TCustomLabeledEdit) + private + theValue: currency; + fFormat: string; + fDecimals: integer; + function getDecimals: integer; + function getFormat: string; + function getValue: currency; + procedure formatInput; + procedure setDecimals(const AValue: integer); + procedure setFormat(const AValue: string); + function scaleTo(const AValue: currency; const NDecimals: integer): currency; + function IsValidFloat(const Value: string): boolean; + procedure setValue(const AValue: currency); + protected + { Protected declarations } + procedure DoEnter; override; + procedure DoExit; override; + procedure KeyPress(var Key: char); override; + public + { Public declarations } + constructor Create(TheOwner: TComponent); override; + destructor Destroy; override; + published + { Published declarations } + property DisplayFormat: string read getFormat write setFormat; + property Decimals: integer read getDecimals write setDecimals; + property Value: currency read getValue write setValue; + + property Action; + property Align; + property Alignment; + property Anchors; + property AutoSelect; + property AutoSize; + property BidiMode; + property BorderSpacing; + property BorderStyle; + property CharCase; + property Color; + property Constraints; + property DragCursor; + property DragMode; + property EditLabel; + property Enabled; + property Font; + property LabelPosition; + property LabelSpacing; + property MaxLength; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ReadOnly; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property OnChange; + property OnClick; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEditingDone; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnStartDrag; + property OnUTF8KeyPress; + end; + +procedure Register; + +implementation + + +uses + Math; + +procedure Register; +begin + {$I jlabeledcurrencyedit_icon.lrs} + RegisterComponents('Additional', [TJLabeledCurrencyEdit]); +end; + +{ TJLabeledCurrencyEdit } + +function TJLabeledCurrencyEdit.getDecimals: integer; +begin + Result := fDecimals; +end; + +function TJLabeledCurrencyEdit.getFormat: string; +begin + Result := fFormat; +end; + +function TJLabeledCurrencyEdit.getValue: currency; +begin + Result := theValue; +end; + +procedure TJLabeledCurrencyEdit.formatInput; +begin + Caption := FormatFloat(DisplayFormat, theValue); +end; + +procedure TJLabeledCurrencyEdit.setDecimals(const AValue: integer); +begin + if (AValue >= 0) and (AValue < 5) then + fDecimals := AValue; +end; + +procedure TJLabeledCurrencyEdit.setFormat(const AValue: string); +begin + fFormat := AValue; + formatInput; +end; + +function TJLabeledCurrencyEdit.scaleTo(const AValue: currency; + const NDecimals: integer): currency; +begin + Result := round(AValue * power(10, NDecimals)) / power(10, NDecimals); +end; + +function TJLabeledCurrencyEdit.IsValidFloat(const Value: string): boolean; +begin + if StrToCurrDef(Value, MaxCurrency) = MaxCurrency then + Result := False + else + Result := True; +end; + +procedure TJLabeledCurrencyEdit.setValue(const AValue: currency); +begin + theValue := scaleTo(AValue, fDecimals); + formatInput; +end; + +procedure TJLabeledCurrencyEdit.DoEnter; +begin + inherited DoEnter; + Text := FloatToStr(theValue); + SelectAll; +end; + +procedure TJLabeledCurrencyEdit.DoExit; +begin + inherited DoExit; + if IsValidFloat(Text) then + theValue := StrToCurr(Text) + else + begin + ShowMessage(Text + ' no es un valor válido'); + SetFocus; + end; + theValue := scaleTo(theValue, fDecimals); + formatInput; +end; + +procedure TJLabeledCurrencyEdit.KeyPress(var Key: char); +begin + if (Key in ['.', ',']) then + Key := Decimalseparator; + if (key = DecimalSeparator) and (Pos(key, Text) > 0) then + key := #0; + if not (Key in ['0'..'9', DecimalSeparator, '+', '-', #8, #9]) then + Key := #0; + if (Key = DecimalSeparator) and (fDecimals = 0) then + Key := #0; + inherited KeyPress(Key); +end; + +constructor TJLabeledCurrencyEdit.Create(TheOwner: TComponent); +begin + inherited Create(TheOwner); + Text := ''; + fFormat := '#,0.00'; + fDecimals := 2; + formatInput; +end; + +destructor TJLabeledCurrencyEdit.Destroy; +begin + inherited Destroy; +end; + +end. + diff --git a/components/jujiboutils/jujibo-utils/src/jlabeledcurrencyedit_icon.lrs b/components/jujiboutils/jujibo-utils/src/jlabeledcurrencyedit_icon.lrs new file mode 100644 index 000000000..7051b8a35 --- /dev/null +++ b/components/jujiboutils/jujibo-utils/src/jlabeledcurrencyedit_icon.lrs @@ -0,0 +1,33 @@ +LazarusResources.Add('tjlabeledcurrencyedit','PNG',[ + #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0 + +#0#0#1'sRGB'#0#174#206#28#233#0#0#0#6'bKGD'#0#255#0#255#0#255#160#189#167#147 + +#0#0#0#9'pHYs'#0#0#11#19#0#0#11#19#1#0#154#156#24#0#0#0#7'tIME'#7#219#9#20#9 + +#28#0#143#224#130''''#0#0#2'sIDATH'#199#213'U=hSQ'#24'='#183#212#186#148#134 + +'vT'#218'!P\'#180'"'#247#161'C'#162'C3t'#17#28#204#162#14#218#31'Qn'#134#224 + +#146#146'E'#170'KH'#7'5h'#162#16#130#173#14']'#178'T'#234#248':'#148'8'#4#242 + +'(DQ'#161'P'#181#210'"'#25'j'#162'-'#164#177#201#215#197'{'#185#239#229'%' + +#212#136#131#7#30#249#190'Kr'#206#249#206#251#222#11#240#143#193#244'fae'#11 + +#233#165'u'#215'/'#222#188#232#197#149#11#199':'#19#208#137#19#161#211'89' + +#212#139'w'#27';('#149#247'P'#170#212'P*'#239'a1'#183#217#145'P'#23#0#164#151 + +#214'12<'#128'K'#254#227'('#149#247#20'ydb'#140#164#200#200#240#0#188#131'}-' + +''''#148#224#156'S'#147#128'w'#176#15#197#181'm,'#230'6'#149#227#200#196#24#1 + +#192#139'{A'#218#173#214#225#239#127'O'#171's'#227'T1'#195#148#205'f'#201'I' + +#198'9'''#217#235#231#12#0#166#30#23#209#243#225#153':'#252#216'{'#149'-'#207 + +#250#192#185'A'#158'@'#130#1'@'#197#12#211#249#219'/'#217'Nu'#31#171's'#227 + +'dY'#22#203'f'#179#20#139#197#0#0#209'h'#20#193'`'#144'q'#206#201#178','#219 + +#189#133#16#130#136#160'.!'#4#189#253#242#19#156'sZX'#217'B'#226#213''''#229 + +'Pw'#234't'#238#26#145#16#130#146#201#148'M0'#153'L'#225'i|'#154#156#249'z'#2 + +#9'v'#230#198's&'#29#202#168#156#181'm'#139#132#16'$I%B!'#1#0#200#231#243#138 + +'X'#156#253#166#226#0#0#203#178'lq'#200'ZN '#207#153#156'@'#146'J'#177'PH' + +#224#242#173#251'L'#222#244'R'#165#134#221'j'#29#197#181'm,'#207#250#15#189 + +#166#221':'#169#19#159#11#175#9#0'z'#127'_'#232#2'N'#157#0#174'e'#230#15'E>9' + +'y'#157#181#141#232#232#145'Z'#199#175#136#153#153#187#240#244#15#177'n='#18 + +'gD'#15#30#165';'#22#248'Q'#254#234#190#162#250#170#18#17#141'Fr'#164'c4'#146 + +'Sg'#191#246#235#182#158's'#174'>+'#223'7H'#9#184'='#7#173#4't'#161'F'#163'a' + +#235'u'#17')'#208'6"7'#16#17#24'c'#182#190#227'-jE'#28#152'~'#3'3'#238'S5'#0 + +#213#187#190'M'#157'n'#221#220'Kr'#167'{3'#238#131#25#247')'#161#166#9'R'#169 + +#20#19'B'#144#147#244#225#147#164#235#15't'#247#186'X'#219#255#3#206#207'5' + +#145#247#176'fb'#189#150#189#172#205#184#15#134'a'#160'P('#192'0'#140#246#170 + +#153#204'<'#221#9'O5m'#205#159'@n'#145#235#140'j'#135#255#18#158#254'!'#134 + +#255#30#7'b'#5#12#188'T'#130#161';'#0#0#0#0'IEND'#174'B`'#130 +]); diff --git a/components/jujiboutils/jujibo-utils/src/jlabeledintegeredit.pas b/components/jujiboutils/jujibo-utils/src/jlabeledintegeredit.pas index f989e7d5b..5c90e9361 100644 --- a/components/jujiboutils/jujibo-utils/src/jlabeledintegeredit.pas +++ b/components/jujiboutils/jujibo-utils/src/jlabeledintegeredit.pas @@ -35,6 +35,53 @@ type { Published declarations } property DisplayFormat: string read getFormat write setFormat; property Value: integer read getValue write setValue; + + property Action; + property Align; + property Alignment; + property Anchors; + property AutoSelect; + property AutoSize; + property BidiMode; + property BorderSpacing; + property BorderStyle; + property CharCase; + property Color; + property Constraints; + property DragCursor; + property DragMode; + property EditLabel; + property Enabled; + property Font; + property LabelPosition; + property LabelSpacing; + property MaxLength; + property ParentColor; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ReadOnly; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property OnChange; + property OnClick; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEditingDone; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnStartDrag; + property OnUTF8KeyPress; end; procedure Register;