Difference between revisions of "Lazarus Hacks"
Line 99: | Line 99: | ||
Text := CurrToStr(aVal); | Text := CurrToStr(aVal); | ||
end; | end; | ||
+ | </pre> | ||
+ | |||
+ | == VK_DECIMAL keypad dot by comma == | ||
+ | |||
+ | When writing lazarus applications to non english locales there is a problem with the keypad "." (dot) when locale uses "," (comma) as decimal separator. I've been looking for a solution and couldn't find one here so after some research on internet and some experiments I endup setting with this: | ||
+ | |||
+ | Form.KeyPreview := True; | ||
+ | Form.OnKeyDown := @FormKeyDown; | ||
+ | Form.OnKeyPress := @FormKeyPress; | ||
+ | |||
+ | <pre> | ||
+ | { TFormBase } | ||
+ | |||
+ | TFormBase = class(TForm) | ||
+ | ... | ||
+ | protected | ||
+ | { protected declarations } | ||
+ | fVK_Decimal : Boolean; | ||
+ | ... | ||
+ | end; | ||
+ | |||
+ | procedure TFormBase.FormKeyPress(Sender: TObject; var Key: char); | ||
+ | begin | ||
+ | if fVK_Decimal and (key = '.') then key := DecimalSeparator; | ||
+ | end; | ||
+ | |||
+ | procedure TFormBase.FormKeyDown(Sender: TObject; var Key: word; Shift: TShiftState); | ||
+ | begin | ||
+ | if (Shift = []) and (key = VK_DECIMAL) then | ||
+ | fVK_Decimal := True; | ||
+ | end; | ||
</pre> | </pre> |
Revision as of 22:23, 27 October 2009
Add here your hacks modifications to Lazarus IDE or LCL widgets, even if they are not officially accepted maybe if a good idea arise and is good enough it can be part of the official distribution, if not it can be used by other people that need more handy functionality than standards.
Exposing/Extending TCustomEdit
In some applications we need constantly convert TCustomEdit descendants Text property for or to numeric values:
TCustomEditFilters = (cefNone, cefInteger, cefUnsigned, cefCurrency, cefFloat); { TCustomEdit } TCustomEdit = class(TWinControl) private ... FTmpModified : Boolean; FceFilter : TCustomEditFilters; procedure SetceFilter(aCeFilter: TCustomEditFilters); function GetAsInteger:Integer; procedure SetAsInteger(aVal: Integer); function GetAsFloat:Extended; procedure SetAsFloat(aVal: Extended); function GetAsCurrency:Currency; procedure SetAsCurrency(aVal: Currency); public ... property TmpModified: Boolean read FTmpModified write FTmpModified; property AsInteger: Integer read getAsInteger write setAsInteger; property AsFloat: Extended read getAsFloat write setAsFloat; property AsCurrency: Currency read getAsCurrency write setAsCurrency; published property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify; property ceFilter : TCustomEditFilters read FceFilter write SetceFilter default cefNone; end; //On the implementation part tcustomedit.inc: resourcestring rsInvalidNumbe = 'Invalid number !'; procedure TCustomEdit.Change; begin FTmpModified := True; if Assigned(FOnChange) then FOnChange(Self); end; procedure TCustomEdit.DoExit; begin if FCeFilter <> cefNone then begin case FCeFilter of cefInteger, cefUnsigned: AsInteger; cefFloat: AsFloat; cefCurrency: AsCurrency; end; end; FAutoSelected := False; inherited DoExit; end; procedure TCustomEdit.SetceFilter(aCeFilter: TCustomEditFilters); begin FCeFilter := aCeFilter; if FCeFilter = cefNone then Alignment := taLeftJustify else Alignment := taRightJustify; end; function TCustomEdit.GetAsInteger:Integer; begin TryStrToInt(Text, result); end; procedure TCustomEdit.SetAsInteger(aVal: Integer); begin Text := IntToStr(aVal); end; function TCustomEdit.GetAsFloat:Extended; begin if Text = '' then result := 0 else if not TryStrToFloat(Text, result) then Raise Exception.Create(rsInvalidNumbe); end; procedure TCustomEdit.SetAsFloat(aVal: Extended); begin Text := FloatToStr(aVal); end; function TCustomEdit.GetAsCurrency:Currency; begin if Text = '' then result := 0 else if not TryStrToCurr(Text, result) then raise Exception.Create(rsInvalidNumbe); end; procedure TCustomEdit.SetAsCurrency(aVal: Currency); begin Text := CurrToStr(aVal); end;
VK_DECIMAL keypad dot by comma
When writing lazarus applications to non english locales there is a problem with the keypad "." (dot) when locale uses "," (comma) as decimal separator. I've been looking for a solution and couldn't find one here so after some research on internet and some experiments I endup setting with this:
Form.KeyPreview := True; Form.OnKeyDown := @FormKeyDown; Form.OnKeyPress := @FormKeyPress;
{ TFormBase } TFormBase = class(TForm) ... protected { protected declarations } fVK_Decimal : Boolean; ... end; procedure TFormBase.FormKeyPress(Sender: TObject; var Key: char); begin if fVK_Decimal and (key = '.') then key := DecimalSeparator; end; procedure TFormBase.FormKeyDown(Sender: TObject; var Key: word; Shift: TShiftState); begin if (Shift = []) and (key = VK_DECIMAL) then fVK_Decimal := True; end;