
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4170 8e941d3f-bd1b-0410-a28a-d453659cc2b4
471 lines
14 KiB
ObjectPascal
471 lines
14 KiB
ObjectPascal
unit sFormatsettingsForm;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
|
|
ButtonPanel, ComCtrls, StdCtrls, Spin, ExtCtrls, Buttons, sCtrls;
|
|
|
|
type
|
|
{ TFormatSettingsForm }
|
|
|
|
TFormatSettingsForm = class(TForm)
|
|
Bevel1: TBevel;
|
|
Bevel2: TBevel;
|
|
Bevel3: TBevel;
|
|
BtnCurrency: TBitBtn;
|
|
ButtonPanel: TButtonPanel;
|
|
CbLongDateFormat: TComboBox;
|
|
CbLongTimeFormat: TComboBox;
|
|
CbPosCurrencyFormat: TComboBox;
|
|
CbNegCurrencyFormat: TComboBox;
|
|
CbShortDateFormat: TComboBox;
|
|
CbShortTimeFormat: TComboBox;
|
|
EdCurrencySymbol: TEdit;
|
|
EdCurrencyDecimals: TSpinEdit;
|
|
Label1: TLabel;
|
|
Label2: TLabel;
|
|
Label3: TLabel;
|
|
LblCurrencySymbol: TLabel;
|
|
LblCurrencySymbol1: TLabel;
|
|
LblDateTimeSample: TLabel;
|
|
LblDecimalSeparator: TLabel;
|
|
LblDateSeparator: TLabel;
|
|
LblTimeSeparator: TLabel;
|
|
LblLongDayNames: TLabel;
|
|
LblLongMonthNames: TLabel;
|
|
LblNumFormat1: TLabel;
|
|
LblNumFormat2: TLabel;
|
|
LblNumFormat3: TLabel;
|
|
LblNumFormat4: TLabel;
|
|
LblPosCurrencyFormat: TLabel;
|
|
LblNegCurrencyFormat: TLabel;
|
|
LblShortDayNames: TLabel;
|
|
LblShortMonthNames: TLabel;
|
|
LblThousandSeparator: TLabel;
|
|
PageControl: TPageControl;
|
|
PgCurrency: TTabSheet;
|
|
PgDateTime: TTabSheet;
|
|
PgNumber: TTabSheet;
|
|
procedure BtnCurrencyClick(Sender: TObject);
|
|
procedure DateTimeFormatChange(Sender: TObject);
|
|
procedure EdCurrencySymbolChange(Sender: TObject);
|
|
procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure OKButtonClick(Sender: TObject);
|
|
procedure PageControlChange(Sender: TObject);
|
|
private
|
|
FSampleDateTime: TDateTime;
|
|
FDateFormatSample: String;
|
|
FTimeFormatSample: String;
|
|
FEdLongMonthNames: TMonthDayNamesEdit;
|
|
FEdShortMonthNames: TMonthDayNamesEdit;
|
|
FEdLongDayNames: TMonthDayNamesEdit;
|
|
FEdShortDayNames: TMonthDayNamesEdit;
|
|
FCbDecimalSeparator: TFormatSeparatorCombo;
|
|
FCbThousandSeparator: TFormatSeparatorCombo;
|
|
FCbDateSeparator: TFormatSeparatorCombo;
|
|
FCbTimeSeparator: TFormatSeparatorCombo;
|
|
function GetFormatSettings: TFormatSettings;
|
|
procedure SetFormatSettings(const AValue: TFormatSettings);
|
|
function ValidData(out AControl: TWinControl; out AMsg: String): Boolean;
|
|
public
|
|
{ public declarations }
|
|
property FormatSettings: TFormatSettings read GetFormatSettings write SetFormatSettings;
|
|
end;
|
|
|
|
var
|
|
FormatSettingsForm: TFormatSettingsForm;
|
|
|
|
|
|
implementation
|
|
|
|
{$R *.lfm}
|
|
|
|
uses
|
|
fpsUtils, fpsNumFormat,
|
|
sCurrencyForm;
|
|
|
|
const
|
|
CURR_VALUE = 100.0;
|
|
|
|
var
|
|
PageIndex: Integer = 0; // stores the previously selected page index (to open the form always with previously used page)
|
|
|
|
|
|
{ TFormatSettingsForm }
|
|
|
|
procedure TFormatSettingsForm.DateTimeFormatChange(Sender: TObject);
|
|
var
|
|
fs: TFormatSettings;
|
|
ctrl: TWinControl;
|
|
dt: TDateTime;
|
|
s: String;
|
|
begin
|
|
fs := GetFormatSettings;
|
|
dt := FSampleDateTime;
|
|
ctrl := ActiveControl;
|
|
|
|
if (ctrl = CbLongDateFormat) then
|
|
begin
|
|
FDateFormatSample := fs.LongDateFormat;
|
|
s := FormatDateTime(FDateFormatSample, dt, fs);
|
|
LblDateTimeSample.Caption := 'Sample date:'#13 + s;
|
|
end
|
|
else
|
|
if (ctrl = CbShortDateFormat) then
|
|
begin
|
|
FDateFormatSample := fs.ShortDateFormat;
|
|
s := FormatDateTime(FDateFormatSample, dt, fs);
|
|
LblDateTimeSample.Caption := 'Sample date:'#13 + s;
|
|
end
|
|
else
|
|
if (ctrl = FCbDateSeparator) then begin
|
|
s := FormatDateTime(FDateFormatSample, dt, fs);
|
|
LblDateTimeSample.Caption := 'Sample date:'#13 + s;
|
|
end
|
|
else
|
|
if (ctrl = CbLongTimeFormat) then
|
|
begin
|
|
FTimeFormatSample := fs.LongTimeFormat;
|
|
s := FormatDateTime(FTimeFormatSample, dt, fs);
|
|
LblDateTimeSample.Caption := 'Sample time:'#13 + s;
|
|
end
|
|
else
|
|
if (ctrl = CbShortTimeFormat) then
|
|
begin
|
|
FTimeFormatSample := fs.ShortTimeFormat;
|
|
s := FormatDateTime(FTimeFormatSample, dt, fs);
|
|
LblDateTimeSample.Caption := 'Sample time:'#13 + s;
|
|
end
|
|
else
|
|
if (ctrl = FCbTimeSeparator) then
|
|
begin
|
|
s := FormatDateTime(FTimeFormatSample, dt, fs);
|
|
LblDateTimeSample.Caption := 'Sample time:'#13 + s;
|
|
{
|
|
end
|
|
else
|
|
begin
|
|
s := AnsiToUTF8(FormatDateTime('c', dt, fs));
|
|
LblDateTimeSample.Caption := 'Sample date/time:'#13 + s;
|
|
}
|
|
end;
|
|
|
|
LblDateTimeSample.Visible := (PageControl.Activepage = PgDateTime) and
|
|
((FDateFormatSample <> '') or (FTimeFormatSample <> ''));
|
|
// Application.ProcessMessages;
|
|
end;
|
|
|
|
procedure TFormatSettingsForm.BtnCurrencyClick(Sender: TObject);
|
|
var
|
|
F: TCurrencyForm;
|
|
begin
|
|
F := TCurrencyForm.Create(nil);
|
|
try
|
|
F.CurrencySymbol := EdCurrencySymbol.Text;
|
|
if F.ShowModal = mrOK then
|
|
EdCurrencySymbol.Text := F.CurrencySymbol;
|
|
finally
|
|
F.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TFormatSettingsForm.EdCurrencySymbolChange(Sender: TObject);
|
|
var
|
|
currSym: String;
|
|
begin
|
|
currSym := EdCurrencySymbol.Text;
|
|
BuildCurrencyFormatList(CbPosCurrencyFormat.Items, true, CURR_VALUE, currSym);
|
|
BuildCurrencyFormatList(CbNegCurrencyFormat.Items, false, CURR_VALUE, currSym);
|
|
end;
|
|
|
|
procedure TFormatSettingsForm.FormCloseQuery(Sender: TObject;
|
|
var CanClose: boolean);
|
|
begin
|
|
Unused(Sender, CanClose);
|
|
PageIndex := PageControl.ActivePageIndex;
|
|
end;
|
|
|
|
procedure TFormatSettingsForm.FormCreate(Sender: TObject);
|
|
const
|
|
DROPDOWN_COUNT = 32;
|
|
var
|
|
w: Integer;
|
|
begin
|
|
PageControl.ActivePageIndex := PageIndex;
|
|
|
|
CbLongDateFormat.DropdownCount := DROPDOWN_COUNT;
|
|
CbShortDateFormat.DropdownCount := DROPDOWN_COUNT;
|
|
CbLongTimeFormat.DropdownCount := DROPDOWN_COUNT;
|
|
CbShortTimeFormat.DropdownCount := DROPDOWN_COUNT;
|
|
CbPosCurrencyFormat.DropdownCount := DROPDOWN_COUNT;
|
|
CbNegCurrencyFormat.DropdownCount := DROPDOWN_COUNT;
|
|
|
|
w := CbLongDateFormat.Width;
|
|
FCbDecimalSeparator := TFormatSeparatorCombo.Create(self);
|
|
with FCbDecimalSeparator do
|
|
begin
|
|
Parent := PgNumber;
|
|
Left := CbLongDateFormat.Left;
|
|
Width := w;
|
|
Top := CbLongDateFormat.Top;
|
|
TabOrder := 0;
|
|
SeparatorKind := skDecimal;
|
|
end;
|
|
LblDecimalSeparator.FocusControl := FCbDecimalSeparator;
|
|
|
|
FCbThousandSeparator := TFormatSeparatorCombo.Create(self);
|
|
with FCbThousandSeparator do
|
|
begin
|
|
Parent := PgNumber;
|
|
Left := FCbDecimalSeparator.Left;
|
|
Width := w;
|
|
Top := FCBDecimalSeparator.Top + 32;
|
|
TabOrder := FCbDecimalSeparator.TabOrder + 1;
|
|
SeparatorKind := skThousand;
|
|
end;
|
|
LblThousandSeparator.FocusControl := FCbThousandSeparator;
|
|
|
|
FCbDateSeparator := TFormatSeparatorCombo.Create(self);
|
|
with FCbDateSeparator do
|
|
begin
|
|
Parent := PgDateTime;
|
|
Left := CbShortDateFormat.Left;
|
|
Width := w;
|
|
Top := CbShortDateFormat.Top + 32;
|
|
TabOrder := CbShortDateFormat.TabOrder + 1;
|
|
SeparatorKind := skDate;
|
|
OnChange := @DateTimeFormatChange;
|
|
OnEnter := @DateTimeFormatChange;
|
|
end;
|
|
LblDateSeparator.FocusControl := FCbDateSeparator;
|
|
|
|
FEdLongMonthNames := TMonthDayNamesEdit.Create(self);
|
|
with FEdLongMonthNames do
|
|
begin
|
|
Parent := PgDateTime;
|
|
Left := CbShortDateFormat.Left;
|
|
{$IFDEF LCL_FULLVERSION AND LCL_FULLVERSION > 1020600}
|
|
Width := w;
|
|
{$ELSE}
|
|
Width := w - Button.Width;
|
|
{$ENDIF}
|
|
Top := CbShortDateFormat.Top + 32*2;
|
|
OnChange := @DateTimeFormatChange;
|
|
OnEnter := @DateTimeFormatChange;
|
|
TabOrder := CbShortDateFormat.TabOrder + 2;
|
|
end;
|
|
LblLongMonthNames.FocusControl := FEdLongMonthNames;
|
|
|
|
FEdShortMonthNames := TMonthDayNamesEdit.Create(self);
|
|
with FEdShortMonthNames do
|
|
begin
|
|
Parent := PgDateTime;
|
|
Left := CbShortDateFormat.Left;
|
|
Width := FEdLongMonthNames.Width;
|
|
Top := CbShortDateFormat.Top + 32*3;
|
|
TabOrder := CbShortDateFormat.TabOrder + 3;
|
|
OnChange := @DateTimeFormatChange;
|
|
OnEnter := @DateTimeFormatChange;
|
|
end;
|
|
LblShortMonthNames.FocusControl := FEdShortMonthNames;
|
|
|
|
FEdLongDayNames := TMonthDayNamesEdit.Create(self);
|
|
with FEdLongDayNames do
|
|
begin
|
|
Parent := PgDateTime;
|
|
Left := CbShortDateformat.Left;
|
|
Width := FEdLongMonthNames.Width;
|
|
Top := CbShortDateFormat.Top + 32*4;
|
|
TabOrder := CbShortDateFormat.TabOrder + 4;
|
|
OnChange := @DateTimeFormatChange;
|
|
OnEnter := @DateTimeFormatChange;
|
|
end;
|
|
LblLongDayNames.FocusControl := FEdLongDayNames;
|
|
|
|
FEdShortDayNames := TMonthDayNamesEdit.Create(self);
|
|
with FEdShortDayNames do
|
|
begin
|
|
Parent := PgDateTime;
|
|
Left := CbShortDateFormat.Left;
|
|
Width := FEdLongMonthNames.Width;
|
|
Top := CbShortDateFormat.Top + 32*5;
|
|
TabOrder := CbShortDateFormat.TabOrder + 5;
|
|
OnChange := @DateTimeFormatChange;
|
|
OnEnter := @DateTimeFormatChange;
|
|
end;
|
|
LblShortDayNames.FocusControl := FEdShortDayNames;
|
|
|
|
FCbTimeSeparator := TFormatSeparatorCombo.Create(self);
|
|
with FCbTimeSeparator do
|
|
begin
|
|
Parent := PgDateTime;
|
|
Left := CbShortTimeFormat.Left;
|
|
Width := w;
|
|
Top := CbShortTimeFormat.Top + 32;
|
|
TabOrder := CbShortTimeFormat.TabOrder + 1;
|
|
SeparatorKind := skTime;
|
|
OnChange := @DateTimeFormatChange;
|
|
OnEnter := @DateTimeFormatChange;
|
|
end;
|
|
LblTimeSeparator.FocusControl := FCbTimeSeparator;
|
|
|
|
FDateFormatSample := '';
|
|
FTimeFormatSample := '';
|
|
FSampleDateTime := now();
|
|
|
|
LblDateTimeSample.Visible := false;
|
|
|
|
// Published property not available in old Laz versions
|
|
EdCurrencyDecimals.Alignment := taRightJustify;
|
|
end;
|
|
|
|
procedure TFormatSettingsForm.OKButtonClick(Sender: TObject);
|
|
var
|
|
msg: String;
|
|
C: TWinControl;
|
|
cParent: TWinControl;
|
|
begin
|
|
if not ValidData(C, msg) then
|
|
begin
|
|
cParent := C.Parent;
|
|
while (cParent <> nil) and not (cParent is TTabSheet) do
|
|
cParent := cParent.Parent;
|
|
PageControl.ActivePage := cParent as TTabSheet;
|
|
if C.CanFocus then C.SetFocus;
|
|
MessageDlg(msg, mtError, [mbOK], 0);
|
|
ModalResult := mrNone;
|
|
end;
|
|
end;
|
|
|
|
procedure TFormatSettingsForm.PageControlChange(Sender: TObject);
|
|
begin
|
|
LblDateTimeSample.Visible := (PageControl.Activepage = PgDateTime) and
|
|
((FDateFormatSample <> '') or (FTimeFormatSample <> ''));
|
|
end;
|
|
|
|
function TFormatSettingsForm.GetFormatSettings: TFormatSettings;
|
|
begin
|
|
Result := DefaultFormatSettings;
|
|
|
|
// --- Number format parameters --
|
|
// Decimal separator
|
|
Result.DecimalSeparator := FCbDecimalSeparator.Separator;
|
|
// Thousand separator
|
|
Result.ThousandSeparator := FCbThousandSeparator.Separator;
|
|
|
|
// --- Currency format parameters ---
|
|
// Currency symbol
|
|
Result.CurrencyString := EdCurrencySymbol.Text;
|
|
// Currency decimal places
|
|
Result.CurrencyDecimals := EdCurrencyDecimals.Value;
|
|
// Positive currency format
|
|
Result.CurrencyFormat := CbPosCurrencyFormat.ItemIndex;
|
|
// Negative currency format
|
|
Result.NegCurrFormat := CbNegCurrencyFormat.ItemIndex;
|
|
|
|
// --- Date format parameters ---
|
|
// Long date format string
|
|
Result.LongDateFormat := CbLongDateFormat.Text;
|
|
// Short date format string
|
|
Result.ShortDateFormat := CbShortDateFormat.Text;
|
|
// Date separator
|
|
Result.DateSeparator := FCbDateSeparator.Separator;
|
|
// Long month names
|
|
FEdLongMonthNames.GetNames(Result.LongMonthNames);
|
|
// Short month names
|
|
FEdShortMonthNames.GetNames(Result.ShortMonthNames);
|
|
// Long day names
|
|
FEdLongDayNames.GetNames(Result.LongDayNames);
|
|
// Short day names
|
|
FEdShortDayNames.GetNames(Result.ShortDayNames);
|
|
|
|
// --- Time format parameters ---
|
|
// Long time format string
|
|
Result.LongTimeFormat := CbLongTimeFormat.Text;
|
|
// Short time format string
|
|
Result.ShortTimeFormat := CbShortTimeFormat.Text;
|
|
// Time separator
|
|
Result.TimeSeparator := FCbTimeSeparator.Separator;
|
|
end;
|
|
|
|
procedure TFormatSettingsForm.SetFormatSettings(const AValue: TFormatSettings);
|
|
var
|
|
i: Integer;
|
|
begin
|
|
// --- Number format parameters ---
|
|
FCbDecimalSeparator.Separator := AValue.DecimalSeparator;
|
|
FCbThousandSeparator.Separator := AValue.ThousandSeparator;
|
|
|
|
// --- Currency format parameters ---
|
|
// Currency symbol
|
|
EdCurrencySymbol.Text := AValue.CurrencyString;
|
|
// Currency decimal places
|
|
EdCurrencyDecimals.Value := AValue.CurrencyDecimals;
|
|
// Positive currency format
|
|
CbPosCurrencyFormat.ItemIndex := AValue.CurrencyFormat;
|
|
// Negative currency format
|
|
CbNegCurrencyFormat.ItemIndex := AValue.NegCurrFormat;
|
|
|
|
// --- Date format parameters ---
|
|
// Long date format string
|
|
i := CbLongDateFormat.Items.IndexOf(AValue.LongDateFormat);
|
|
if i = -1 then
|
|
CbLongDateFormat.ItemIndex := CbLongDateFormat.Items.Add(AValue.LongDateFormat)
|
|
else
|
|
CbLongDateFormat.ItemIndex := i;
|
|
// Short date format string
|
|
i := CbShortDateFormat.Items.IndexOf(AValue.ShortDateFormat);
|
|
if i = -1 then
|
|
CbShortDateFormat.ItemIndex := CbShortDateFormat.items.Add(AValue.ShortDateFormat)
|
|
else
|
|
CbShortDateFormat.ItemIndex := i;
|
|
// Date separator
|
|
FCbDateSeparator.Separator := AValue.DateSeparator;
|
|
// Long month names
|
|
FEdLongMonthNames.SetNames(AValue.LongMonthNames, 12, false, 'Error');
|
|
// Short month names
|
|
FEdShortMonthNames.SetNames(AValue.ShortMonthNames, 12, true, 'Error');
|
|
// Long day names
|
|
FEdLongDayNames.SetNames(AValue.LongDayNames, 7, false, 'Error');
|
|
// Short month names
|
|
FEdShortDayNames.SetNames(AValue.ShortDayNames, 7, true, 'Error');
|
|
|
|
// --- Time format parameters ---
|
|
|
|
// Long time format string
|
|
i := CbLongTimeFormat.items.IndexOf(AValue.LongTimeFormat);
|
|
if i = -1 then
|
|
CbLongTimeFormat.ItemIndex := CbLongTimeFormat.Items.Add(AValue.LongTimeFormat)
|
|
else
|
|
CbLongTimeFormat.ItemIndex := i;
|
|
// Short time format string
|
|
i := cbShortTimeFormat.Items.IndexOf(AValue.ShortTimeFormat);
|
|
if i = -1 then
|
|
CbShortTimeFormat.itemIndex := CbShortTimeFormat.Items.Add(AValue.ShortTimeFormat);
|
|
// Time separator
|
|
FCbTimeSeparator.Separator := AValue.TimeSeparator;
|
|
end;
|
|
|
|
function TFormatSettingsForm.ValidData(out AControl: TWinControl;
|
|
out AMsg: String): Boolean;
|
|
begin
|
|
Result := false;
|
|
if FCbDecimalSeparator.Separator = FCbThousandSeparator.Separator then
|
|
begin
|
|
AControl := FCbDecimalSeparator;
|
|
AMsg := 'Decimal and thousand separators cannot be the same.';
|
|
exit;
|
|
end;
|
|
Result := true;
|
|
end;
|
|
|
|
//initialization
|
|
// {$I sformatsettingsform.lrs}
|
|
|
|
end.
|
|
|