218 lines
5.3 KiB
ObjectPascal
218 lines
5.3 KiB
ObjectPascal
|
|
unit QNumFormatExampleMain;
|
||
|
|
|
||
|
|
interface
|
||
|
|
|
||
|
|
uses
|
||
|
|
Math, SysUtils, Classes,
|
||
|
|
Qt, QGraphics, QControls, QForms, QStdCtrls, QComCtrls,
|
||
|
|
JclSysUtils;
|
||
|
|
|
||
|
|
type
|
||
|
|
TMainForm = class(TForm)
|
||
|
|
ValueEdit: TEdit;
|
||
|
|
EvalBtn: TButton;
|
||
|
|
Label1: TLabel;
|
||
|
|
RandBtn: TButton;
|
||
|
|
PrecisionEdit: TSpinEdit;
|
||
|
|
Label2: TLabel;
|
||
|
|
Output: TMemo;
|
||
|
|
BlockSeparatorSelector: TComboBox;
|
||
|
|
Label3: TLabel;
|
||
|
|
Label4: TLabel;
|
||
|
|
BlockSizeEdit: TSpinEdit;
|
||
|
|
cbShowPlusSign: TCheckBox;
|
||
|
|
Label5: TLabel;
|
||
|
|
ExpDivisionEdit: TSpinEdit;
|
||
|
|
WidthEdit: TSpinEdit;
|
||
|
|
Label6: TLabel;
|
||
|
|
cbZeroPadding: TCheckBox;
|
||
|
|
Label7: TLabel;
|
||
|
|
MultiplierSelector: TComboBox;
|
||
|
|
Label8: TLabel;
|
||
|
|
FractionDigitsEdit: TSpinEdit;
|
||
|
|
procedure EvalBtnClick(Sender: TObject);
|
||
|
|
procedure RandBtnClick(Sender: TObject);
|
||
|
|
procedure ValueEditChange(Sender: TObject);
|
||
|
|
procedure FormCreate(Sender: TObject);
|
||
|
|
procedure FormDestroy(Sender: TObject);
|
||
|
|
procedure BlockSizeEditChanged(Sender: TObject; NewValue: Integer);
|
||
|
|
procedure BlockSeparatorSelectorChange(Sender: TObject);
|
||
|
|
procedure PrecisionEditChanged(Sender: TObject; NewValue: Integer);
|
||
|
|
procedure cbShowPlusSignClick(Sender: TObject);
|
||
|
|
procedure ExpDivisionEditChanged(Sender: TObject; NewValue: Integer);
|
||
|
|
procedure WidthEditChanged(Sender: TObject; NewValue: Integer);
|
||
|
|
procedure cbZeroPaddingClick(Sender: TObject);
|
||
|
|
procedure MultiplierSelectorChange(Sender: TObject);
|
||
|
|
procedure FractionDigitsEditChanged(Sender: TObject;
|
||
|
|
NewValue: Integer);
|
||
|
|
private
|
||
|
|
{ Private declarations }
|
||
|
|
FNumFormat: TJclNumericFormat;
|
||
|
|
procedure Display;
|
||
|
|
public
|
||
|
|
{ Public declarations }
|
||
|
|
end;
|
||
|
|
|
||
|
|
var
|
||
|
|
MainForm: TMainForm;
|
||
|
|
|
||
|
|
implementation
|
||
|
|
|
||
|
|
{$R *.xfm}
|
||
|
|
|
||
|
|
procedure TMainForm.FormCreate(Sender: TObject);
|
||
|
|
begin
|
||
|
|
FNumFormat := TJclNumericFormat.Create;
|
||
|
|
FNumFormat.ExponentDivision := ExpDivisionEdit.Value;
|
||
|
|
FNumFormat.NumberOfFractionalDigits := FractionDigitsEdit.Value;
|
||
|
|
FNumFormat.Width := WidthEdit.Value;
|
||
|
|
FNumFormat.DigitBlockSize := BlockSizeEdit.Value;
|
||
|
|
BlockSeparatorSelector.Items[0] := FNumFormat.DigitBlockSeparator;
|
||
|
|
Display;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.FormDestroy(Sender: TObject);
|
||
|
|
begin
|
||
|
|
FNumFormat.Free;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.Display;
|
||
|
|
var
|
||
|
|
Base: TNumericSystemBase;
|
||
|
|
S, Mantissa: string;
|
||
|
|
Exponent: Integer;
|
||
|
|
X: Extended;
|
||
|
|
C: TCaretPos;
|
||
|
|
begin
|
||
|
|
if not Assigned(FNumFormat) then
|
||
|
|
Exit;
|
||
|
|
X := StrToFloat(ValueEdit.Text);
|
||
|
|
FNumFormat.Precision := PrecisionEdit.Value;
|
||
|
|
Output.Lines.BeginUpdate;
|
||
|
|
try
|
||
|
|
Output.Lines.Clear;
|
||
|
|
for Base := Low(TNumericSystemBase) to High(TNumericSystemBase) do
|
||
|
|
begin
|
||
|
|
FNumFormat.Base := Base;
|
||
|
|
FNumFormat.GetMantissaExp(X, Mantissa, Exponent);
|
||
|
|
if Exponent = 0 then
|
||
|
|
S := Mantissa
|
||
|
|
else
|
||
|
|
S := Format('%s %s %d^%d', [Mantissa, FNumFormat.Multiplier, Base, Exponent]);
|
||
|
|
Output.Lines.Add(Format('Base %2d: %s', [Base, S]));
|
||
|
|
end;
|
||
|
|
C.Line := 0;
|
||
|
|
C.Col := 0;
|
||
|
|
Output.CaretPos := C;
|
||
|
|
finally
|
||
|
|
Output.Lines.EndUpdate;
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.EvalBtnClick(Sender: TObject);
|
||
|
|
begin
|
||
|
|
Display;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.RandBtnClick(Sender: TObject);
|
||
|
|
begin
|
||
|
|
ValueEdit.Text := FloatToStr(Power(Random * 4 -2, Random(400)));
|
||
|
|
EvalBtn.Enabled := False;
|
||
|
|
Display;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.ValueEditChange(Sender: TObject);
|
||
|
|
begin
|
||
|
|
EvalBtn.Enabled := True;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.BlockSizeEditChanged(Sender: TObject; NewValue: Integer);
|
||
|
|
begin
|
||
|
|
if Assigned(FNumFormat) then
|
||
|
|
begin
|
||
|
|
FNumFormat.DigitBlockSize := BlockSizeEdit.Value;
|
||
|
|
Display;
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.BlockSeparatorSelectorChange(Sender: TObject);
|
||
|
|
begin
|
||
|
|
if Assigned(FNumFormat) then
|
||
|
|
begin
|
||
|
|
FNumFormat.DigitBlockSeparator := AnsiChar(BlockSeparatorSelector.Text[1]);
|
||
|
|
Display;
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.PrecisionEditChanged(Sender: TObject; NewValue: Integer);
|
||
|
|
begin
|
||
|
|
if Assigned(FNumFormat) then
|
||
|
|
begin
|
||
|
|
FNumFormat.Precision := PrecisionEdit.Value;
|
||
|
|
Display;
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.cbShowPlusSignClick(Sender: TObject);
|
||
|
|
begin
|
||
|
|
if Assigned(FNumFormat) then
|
||
|
|
begin
|
||
|
|
FNumFormat.ShowPositiveSign := cbShowPlusSign.Checked;
|
||
|
|
Display;
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.ExpDivisionEditChanged(Sender: TObject;
|
||
|
|
NewValue: Integer);
|
||
|
|
begin
|
||
|
|
if Assigned(FNumFormat) then
|
||
|
|
begin
|
||
|
|
FNumFormat.ExponentDivision := ExpDivisionEdit.Value;
|
||
|
|
Display;
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.WidthEditChanged(Sender: TObject; NewValue: Integer);
|
||
|
|
begin
|
||
|
|
if Assigned(FNumFormat) then
|
||
|
|
begin
|
||
|
|
FNumFormat.Width := WidthEdit.Value;
|
||
|
|
Display;
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.cbZeroPaddingClick(Sender: TObject);
|
||
|
|
begin
|
||
|
|
if Assigned(FNumFormat) then
|
||
|
|
begin
|
||
|
|
if cbZeroPadding.Checked then
|
||
|
|
FNumFormat.PaddingChar := '0'
|
||
|
|
else
|
||
|
|
FNumFormat.PaddingChar := ' ';
|
||
|
|
Display;
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.MultiplierSelectorChange(Sender: TObject);
|
||
|
|
begin
|
||
|
|
if Assigned(FNumFormat) then
|
||
|
|
begin
|
||
|
|
FNumFormat.Multiplier := MultiplierSelector.Text;
|
||
|
|
Display;
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
|
||
|
|
procedure TMainForm.FractionDigitsEditChanged(Sender: TObject;
|
||
|
|
NewValue: Integer);
|
||
|
|
begin
|
||
|
|
if Assigned(FNumFormat) then
|
||
|
|
begin
|
||
|
|
FNumFormat.NumberOfFractionalDigits := FractionDigitsEdit.Value;
|
||
|
|
Display;
|
||
|
|
end;
|
||
|
|
end;
|
||
|
|
|
||
|
|
initialization
|
||
|
|
Randomize;
|
||
|
|
end.
|