Poszukiwania najbardziej optymalnej metody wprowadzania liczb zmiennoprzecinkowych do MaskEdit
doprowadziły do uzyskania takiego efektu? Moje pytanie: czy ktoś posiada jeszcze wygodniejsze rozwiązanie dla
operatora wprowadzającego codziennie bardzo wiele danych.
Przykładowy kod: Na form'e umieszczamy MaskEdit1 i MaskEdit2 w pole "EditMask" obu kontrolek wstawiamy: 9999,999
dodatkowo w kontrolkach ustawiamy zdarzenia: OnClick , OnExit , OnKeyPress tak jak na zamieszczonym listingu
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Mask;
type
TForm1 = class(TForm)
MaskEdit1: TMaskEdit;
MaskEdit2: TMaskEdit;
procedure MaskEdit1KeyPress(Sender: TObject; var Key: Char);
procedure MaskEdit2KeyPress(Sender: TObject; var Key: Char);
procedure MaskEdit1Exit(Sender: TObject);
procedure MaskEdit2Exit(Sender: TObject);
procedure MaskEdit1Click(Sender: TObject);
procedure MaskEdit2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function FormatujZapisLiczby(Dane: string): string;
const
ZnakiZabronione: set of char = [' ','_']; //Znaki usuwane
var
i,j: dword;
begin
Result:='';
i:=1;
j:=Length(Dane);
while j >= i do
begin
if not(Dane[i] in ZnakiZabronione) then Result:=Result+Dane[i];
i:=i+1;
end;
end;
//UWAGA: Maska musi miec taki format: 9999,99; Niedozwolony jest format 9999,99;0 bo nie zwraca przecinka.
function FormatowanieMaskEdit(Dana: string): string;
var
Liczba,Reszta: string;
Przecinek,i: integer;
begin
Result:='';
Przecinek:=Pos(',',Dana);
Liczba:=Copy(Dana,0,Przecinek-1);
Reszta:=Copy(Dana,Przecinek+1,Length(Dana));
Liczba:=FormatujZapisLiczby(Liczba);
Reszta:=FormatujZapisLiczby(Reszta);
for i:=1 to (Przecinek-Length(Liczba))-1 do Result:=Result+' ';
Result:=Result+Liczba+','+Reszta;
Form1.Caption:=Result;
end;
//Procedura ustawia kursor na poz.0 MaskEdit jesli jest on pusty formatuje dane po obu stronach przecinka.
//UWAGA: Maska musi miec taki format: 9999,99; Niedozwolony jest format 9999,99;0 bo nie zwraca przecinka.
procedure PozycjaKursoraZmiennoprzecinkowe(Sender: TObject);
begin
//Ustawienie kursora na pozycji zero przy aktywacji pustego pola edycyjnego...
if Sender is TMaskEdit then
begin
with (Sender as TMaskEdit) do
begin
if (FormatujZapisLiczby(Text) = '') or (FormatujZapisLiczby(Text) = ',') then
begin
SelStart:=0;
SelLength:=1;
end;
end;
end;
end;
procedure TForm1.MaskEdit1KeyPress(Sender: TObject; var Key: Char);
begin
//Po enter przechodzimy do kolejnej kontrolki.
case Key of
#13: begin
Perform(WM_NEXTDLGCTL,0,0);
Key:=#0;
end;
',': begin
(Sender as TMaskEdit).Text:=FormatowanieMaskEdit((Sender as TMaskEdit).Text);
end;
end;
end;
procedure TForm1.MaskEdit2KeyPress(Sender: TObject; var Key: Char);
begin
//Po enter przechodzimy do kolejnej kontrolki.
case Key of
#13: begin
Perform(WM_NEXTDLGCTL,0,0);
Key:=#0;
end;
',': begin
(Sender as TMaskEdit).Text:=FormatowanieMaskEdit((Sender as TMaskEdit).Text);
end;
end;
end;
procedure TForm1.MaskEdit1Exit(Sender: TObject);
begin
(Sender as TMaskEdit).Text:=FormatowanieMaskEdit((Sender as TMaskEdit).Text);
end;
procedure TForm1.MaskEdit2Exit(Sender: TObject);
begin
(Sender as TMaskEdit).Text:=FormatowanieMaskEdit((Sender as TMaskEdit).Text);
end;
procedure TForm1.MaskEdit1Click(Sender: TObject);
begin
PozycjaKursoraZmiennoprzecinkowe(Sender);
end;
procedure TForm1.MaskEdit2Click(Sender: TObject);
begin
PozycjaKursoraZmiennoprzecinkowe(Sender);
end;
end.