Jak można sformatować liczbę rzeczywistą np.
1000 do postaci 1 000,000
Pozdrawiam !
Jak można klawiszem "ENTER " przjć z komponentu np. edit1 do edit2 na tym samym formularzu ?
https://docwiki.embarcadero.com/Libraries/Sydney/en/System.SysUtils.Format
Natomiats kolejność przechodzenia komponentów ustawia się property o nazwie TabOrder (w object inspectorze) i delphi samo Ci to ogarnia pod klawiszem TAB. Natomiast jak chcesz enter to niestety musisz już oprogramować OnKeyPress formy z ustawioną flagą KeyPreview := True;
No chyba, że ktoś zna sposób jak podmienić TAB na Enter w TabOrder :)
Jeżeli masz tylko kontrolki TEdit
i wszystkie mają po naciśnięciu enter (gdy edit jest aktywny) przechodzić do następnego to coś takiego:
type
TWinControlAtrapa = class(TWinControl); //aby uzyskać dostep do chronionej metody SelectNext
TEdit = class(Vcl.StdCtrls.TEdit) //jak chcesz można wykorzystać zwyczajnie zdarzenie OnKeyUp
protected
procedure WMKeyUp(var Msg: TWMKeyUp); message WM_KEYUP;
end;
//.....
implementation
{$R *.dfm}
procedure TEdit.WMKeyUp(var Msg: TWMKeyUp);
begin
inherited;
if Msg.CharCode = VK_RETURN then //czy enter
begin
TWinControlAtrapa(Self.Parent).SelectNext(Self, True, False); //przejdź do następnej kontrolki
if (Screen.ActiveControl is TEdit) then //sprawdzasz czy aktywną kontrolką jest TEdit
TEdit(Screen.ActiveControl).SetSelLength(0); //tu taka kosmetyka w tym wypadku pozbywam się zaznaczenia tekstu z kontrolki na ktorą przechodzi
end;
end;
haryvincent176 napisał(a):
Jak można sformatować liczbę rzeczywistą np.
1000 do postaci 1 000,000
Funkcja Format
z argumentem %n
zrobi coś podobnego:
Format('%n', [Double(1000)]); // 1,000.00
Niby działa, separatory są, ale wynik jest nieco inny od oczekiwanego — znaki separatorów się nie zgadzją, precyzja również. Aby naprawić precyzję i zwiększyć ją do trzech miejsc, należy ją określić w masce i ustawić sztywne 3
miejsca:
Format('%.3n', [Double(1000)]); // 1,000.000
Domyślne znaki separatorów trzymane są w strukturze DefaultFormatSettings
i to one są brane pod uwagę we wszystkich funkcjach konwertujących. Są zgodne z ustawieniami regionalnymi w systemie, dlatego na każdej maszynie mogą być inne — u mnie są takie jak podałem wyżej. Aby to zmienić, wystarczy albo zmodyfikować te znaki w domyślnej strukturze:
DefaultFormatSettings.DecimalSeparator := ',';
DefaultFormatSettings.ThousandSeparator := ' ';
Format('%.3n', [Double(1000)]); // 1 000,000
albo użyć swojej i ją przekazać w parametrze funkcji konwertującej:
uses
SysUtils;
var
CustomSettings: TFormatSettings;
begin
CustomSettings := DefaultFormatSettings;
CustomSettings.DecimalSeparator := ',';
CustomSettings.ThousandSeparator := ' ';
Format('%.3n', [Double(1000)], CustomSettings); // 1 000,000
W obu przypadkach wynikiem będzie to czego oczekujesz. To jeśli chodzi o Lazarusa.