Avatar billede hclarsen Nybegynder
03. april 2004 - 23:42 Der 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...
Avatar billede snowball Novice
03. april 2004 - 23:47 #1
type
  TCharSet = set of char;

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;
Avatar billede snowball Novice
03. april 2004 - 23:49 #2
Så passer det hele ;)

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TCharSet = set of char;

  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure Edit1Change(Sender: TObject);
  private
    procedure ValidateEdit(Edit: TEdit; ValidChars: TCharSet);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

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;

end.
Avatar billede hclarsen Nybegynder
03. april 2004 - 23:55 #3
Nuij, der kan man jo bare se !
Tak for hjælpen - du har sgu fortjent dine point!
Avatar billede snowball Novice
03. april 2004 - 23:58 #4
Hvis du har brug for at tillade flere forskellige tegn, så skriver du bare som f.eks. nedenstående:

ValidateEdit(Sender as TEdit, ['0'..'9', ',', '.']);

Så må man skrive tal, komma og punktum i feltet :)
Avatar billede hclarsen Nybegynder
04. april 2004 - 00:05 #5
Ahh nice!
Hvad gør jeg så, hvis min procedure skal gælde for 2 edits ?
Avatar billede snowball Novice
04. april 2004 - 00:12 #6
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.
Avatar billede hclarsen Nybegynder
04. april 2004 - 00:16 #7
Ok - tak for det !
Avatar billede hrc Mester
04. april 2004 - 10:10 #8
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;
Avatar billede snowball Novice
04. april 2004 - 14:07 #9
hrc: Det er jeg godt klar over. Desuden er det ikke mig, men Borrisholt der har lavet ValidateEdit ;)
Avatar billede js_delphi Nybegynder
29. juli 2004 - 22:24 #10
Hej hclarsen,

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!

Hvordan virker det hos dig??
Jeg har Delphi 7.
Avatar billede hrc Mester
30. juli 2004 - 01:16 #11
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester