03. april 2004 - 23:42Der er
9 kommentarer og 2 løsninger
Kun tal i en edit
Kære Eksperter;
Jeg har længe forsøgt at finde en procedure, som gør at man kun kan skrive tal i en edit (kommatal må heller ikke skrives i den), men det går sgu ikk! Jeg håbede på, om I måske kunne hjælpe en mand i nød...
procedure TFMain.ValidateEdit(Edit: TEdit; ValidChars: TCharSet); var s: string; i: Integer; begin s := Edit.Text; for i := 1 to length(s) do if not (s[i] in ValidChars) then Delete(s, i, 1);
Edit.text := s; Edit.SelStart := length(s); end;
procedure TForm1.Edit1Change(Sender: TObject); begin ValidateEdit(Sender as TEdit, ['0'..'9']); end;
procedure TForm1.ValidateEdit(Edit: TEdit; ValidChars: TCharSet); var s: string; i: Integer; begin s := Edit.Text; for i := 1 to length(s) do if not (s[i] in ValidChars) then Delete(s, i, 1);
Edit.text := s; Edit.SelStart := length(s); end;
procedure TForm1.Edit1Change(Sender: TObject); begin ValidateEdit(Sender as TEdit, ['0'..'9']); end;
Så kan du bare sætte ValidateEdit ind på det ene af edit felterne, og så sætter du den anden edits OnChange event til at være den OnChange event som du har lavet på den første edit.
Snoballl: I din validateEdit tillader du, at man må sætte flere minus'er eller kommaer efter hinanden, eks. vil "43-323,,,,,23" være muligt. Skal man lege med flydende decimaler eller negative tegn skal der arbejdes lidt mere for sagen.
Denne procedurer tillader positive tal med 4 decimaler:
procedure TfrmeTriangle.OnlyFloat(aSender : TObject; var aChar: char); var p : integer; begin with (aSender as TEdit) do if aChar > #32 then begin if not (aChar in ['0'..'9',DecimalSeparator]) then aChar := #0;
p := pos(DecimalSeparator,Text); if p > 0 then if aChar = DecimalSeparator then // Do not add more dots than the one present aChar := #0 else if length(Text) - p > 3 then // It's a digit. Allow no more than 4 of those aChar := #0; end; // if end;
Jeg har prøvet at kopiere hele koden fra Snowball direkte til et nyt projekt, og så smækket en edit box (Edit1) på formen, men det er stadigvæk muligt at skrive bogstaver!
Måden som snowball's (a.k.a. Borrisholts) eksempel fungerer på er, at man indtaster noget som umiddelbart derefter valideres via TEdit'ens OnChange-event. Det giver en masse rod med hvor markøren står og om der er markeret noget mens man taster.
Ikke helt perfekt, men umiddelbart kan jeg kun se at mit eksempel som mere "elegant" idet der gives plads til mere intelligent styring af data.
Varianterne nedenfor indsættes i TEdit-komponenternes OnKeyPressed-event som i øvrigt er beregnet til netop denne slags validering.
// Accepterer decimaltal med eet komma og '-' som skifter fortegnet procedure TForm1.OnlyFloat(aSender : TObject; var aChar: char); var p : integer; SaveSelPos : integer; begin with (aSender as TEdit) do if aChar >= #32 then begin if not (aChar in ['0'..'9',DecimalSeparator,'-']) then aChar := #0;
if aChar = '-' then begin SaveSelPos := SelStart; aChar := #0; if pos('-',Text) = 0 then begin Text := '-' + Text; SelStart := SaveSelPos + 1; end // if else begin Text := copy(Text,2,MaxInt); SelStart := SaveSelPos - 1; end; // else end; // if
p := pos(DecimalSeparator,Text); if p > 0 then if aChar = DecimalSeparator then // Do not add more than one dot aChar := #0 else if (length(Text) - p > 3) and (SelStart >= p) then // It's a digit. Allow no more than 4 aChar := #0; end; // if end;
// Accepterér kun heltal procedure TForm1.OnlyInteger(aSender: TObject; var aChar: char); begin with (aSender as TEdit) do if aChar >= #32 then begin if not (aChar in ['0'..'9']) then aChar := #0; end; end;
// Accepterér positive og negative heltal med '-' som skifter fortegnet procedure TForm1.OnlyUnsignedInteger(aSender: TObject; var aChar: char); var SaveSelPos : integer; begin with (aSender as TEdit) do if aChar >= #32 then begin if not (aChar in ['0'..'9','-']) then aChar := #0;
if aChar = '-' then begin SaveSelPos := SelStart; aChar := #0; if pos('-',Text) = 0 then begin Text := '-' + Text; SelStart := SaveSelPos + 1; end // if else begin Text := copy(Text,2,MaxInt); SelStart := SaveSelPos - 1; end; // else end; // if end; end;
g'nat
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.