unit ExCtrlsReg; {$mode objfpc}{$H+} interface uses Classes, SysUtils, PropEdits; type TFloatSIPropertyEditor = class(TFloatPropertyEditor) public function GetValue: ansistring; override; procedure SetValue(const NewValue: ansistring); override; end; procedure Register; implementation {$R exctrlsreg.res} uses ExButtons, ExCheckCtrls, ExEditCtrls, ExCombo, ExCheckCombo, ExShape, ExProgressBar; function TFloatSIPropertyEditor.GetValue: ansistring; begin Result := FormatValue(GetFloatValue); end; procedure TFloatSIPropertyEditor.SetValue(const NewValue: ansistring); var newVal: String; prefix: TSIPrefix; prefixStr: String; begin newVal := NewValue; if TCustomFloatSISpinEditEx.EndsWithSIPrefix(newVal, prefix) then begin if prefix <> ONE then begin prefixStr := FormatFloat('0e+00', TCustomFloatSISpinEditEx.PrefixFactor(prefix)); // e.g. 'k' --> '1E+03' Delete(prefixStr, 1, 1); // Delete the '1' from '1E+03' ... newVal := newVal + prefixStr; // ... and add the rest to the number string end; end; inherited SetValue(newVal) end; procedure Register; begin RegisterComponents('ExCtrls', [ TButtonEx, TCheckboxEx, TRadioButtonEx, TCheckGroupEx, TRadioGroupEx, TFloatSISpinEditEx, TCurrSpinEditEx, TColumnComboBoxEx, TCheckComboBoxEx, TProgressBarEx, TShapeEx ]); RegisterPropertyEditor(TypeInfo(double), TCustomFloatSISpinEditEx, '', TFloatSIPropertyEditor); end; end.