Toon posts:

[delphi] waarden checken op geldigheid.

Pagina: 1
Acties:
  • 119 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
vraagje:

Ik neem aan dat het bestaat maar wat is de functie om te checken of een ingevoerde waarde in een edit-field geldig is? om bijvoorbeeld te controleren of het een float is of een integer of een currency ofzo.

Ik kan het niet vinden in de help en ik weet ook niet hoe ik het in kernwoorden moet omschrijven voor een search op google.

bedankt alvast.

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
kernwoorden zijn al gauw van die dingen als
'isfloat' of 'isint'

maar zo'n functie kan je toch ook heel makkelijk zelf schrijven?

gewoon try except maken, en dan proberen die waarde te coverten naar een int of een float
als dit niet wil krijg je een except

This message was sent on 100% recyclable electrons.


Verwijderd

Topicstarter
BasieP schreef op 29 november 2003 @ 18:51:
kernwoorden zijn al gauw van die dingen als
'isfloat' of 'isint'

maar zo'n functie kan je toch ook heel makkelijk zelf schrijven?

gewoon try except maken, en dan proberen die waarde te coverten naar een int of een float
als dit niet wil krijg je een except
Ben ik het helemaal met je eens, maar waarom het wiel opnieuw uitvinden? Het lijkt mij namelijk iets wat veel gebruikt wordt en als het veel gebruikt wordt zal er vast een bestaande functie voor zijn. :)

  • TUX2K
  • Registratie: September 2001
  • Laatst online: 10:13
Je zou ook via een TRY execpt erg achter kunnen komen of een waarde klopt.
B.V.
PHP:
1
2
3
4
5
6
try
  varFloat := StrTOFloat(edit1.text);
  // do iest met de float
except
  ShowMessage('Geen float in gevoerd');
exit;

  • ta_chi79
  • Registratie: Juli 2001
  • Laatst online: 22:41
Delphi heeft daar enkele functies voor. Zie bijv. TryStrToFloat, TryStrToInt in SysUtils.pas

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18:25

Creepy

Tactical Espionage Splatterer

En niet te vergeten is er ook nog een TMaskEdit, waarin je kan aangeven aan welke "opmaak" je invoer moet voldoen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 20:23

Tomatoman

Fulltime prutser

Als je het helemaal mooi wilt doen zet je de focus weer terug naar de control als je de input afkeurt. OnExit ziet er dan zo uit:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TFom1.Edit1Exit(Sender: TObject);
var
  Leeftijd: Integer;
begin
  try
    Leeftijd := StrToInt(Edit1.Text);
    if (Leeftijd < 0) or (Leeftijd > 100) then
      Abort;
    ShowMessage(IntToStr(Leeftijd));
  except 
    ShowMessage('Geen geldige leeftijd ingevoerd');
    if Sender is TCustomEdit then
      ActiveControl := TCustomEdit(Sender); 
      { of in plaats van regel 13: TCustomEdit(Sender).SetFocus; }
  end;
end;

Een goede grap mag vrienden kosten.


  • MisterE
  • Registratie: April 2002
  • Laatst online: 19-04 12:43
de 'try' lijkt mij een beetje overkill voor zoiets te checken, ik denk dat dit sneller werkt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function IsInt(s: String): Boolean;
var
  i : Integer;
begin
  result := false;

  for i:=1 to Length(s) do
  begin
    if not (s[i] in ['0'..'9']) then Exit;
  end;

  result := true;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;
  b: Boolean;
begin
  s := '1234a';
  b := IsInt(s);

  if b then
    ShowMessage('int')
  else
    ShowMessage('Geen int');
end;

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 17:57

Knutselsmurf

LED's make things better

MisterE schreef op 29 november 2003 @ 23:50:
de 'try' lijkt mij een beetje overkill voor zoiets te checken, ik denk dat dit sneller werkt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function IsInt(s: String): Boolean;
var
  i : Integer;
begin
  result := false;

  for i:=1 to Length(s) do
  begin
    if not (s[i] in ['0'..'9']) then Exit;
  end;

  result := true;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;
  b: Boolean;
begin
  s := '1234a';
  b := IsInt(s);

  if b then
    ShowMessage('int')
  else
    ShowMessage('Geen int');
end;
Helaas is het geheel iets complexer dan dat. Is -12 geen integer dan? En stap 2 is het controleren op floats. Voordat je dat zelf hebt uitgezocht, ben je een heel end verder.

- This line is intentionally left blank -


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 20:23

Tomatoman

Fulltime prutser

MisterE schreef op 29 november 2003 @ 23:50:
de 'try' lijkt mij een beetje overkill voor zoiets te checken, ik denk dat dit sneller werkt:
[...]
Sneller :? Je bedoelt 100 nanoseconde of zo?

Het lijkt me nogal onzinnig om het wiel opnieuw uit te vinden. In Delphi is StrToInt aanwezig en die functie is er niet voor niets.

Een goede grap mag vrienden kosten.


  • MisterE
  • Registratie: April 2002
  • Laatst online: 19-04 12:43
tomatoman schreef op 30 november 2003 @ 01:21:
[...]
Sneller :? Je bedoelt 100 nanoseconde of zo?

Het lijkt me nogal onzinnig om het wiel opnieuw uit te vinden. In Delphi is StrToInt aanwezig en die functie is er niet voor niets.
Ik heb ooit gelezen dat de 'try' best wat resources en tijd nodig heeft. Het punt is alleen dat ik niet weet hoe een 'try' eigenlijk werkt? Wat doet Delphi dan?
Gebruikt ie net zo'n soort functie als IsInt om het getal te testen?
Levert Windows een error op?
Net zoals een naar een file scrijven , hoe checkt een computer dat nou intern?
een file kan gelockt zijn, geen rechten etc.
HOE werkt 'try' met een logische machine?

  • Dala
  • Registratie: November 2000
  • Laatst online: 26-05 23:47
Delphi:
1
2
3
4
5
6
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not ( Key in [#8] ) then        //backspace moet altijd kunnen
  if not (key in ['0'..'9']) then 
     key:=#0;                      //als het geen nummer is, niet intypen
end;

daarme kun je alleen maar getallen invoeren bij het edit veld, en wil je een floating getal laat je de ',' ook toe.. is denk ik nog het simpelste.

[ Voor 16% gewijzigd door Dala op 30-11-2003 16:26 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 20:23

Tomatoman

Fulltime prutser

MisterE schreef op 30 november 2003 @ 16:17:
Ik heb ooit gelezen dat de 'try' best wat resources en tijd nodig heeft.
Dat klopt, een try...except of een try...finally constructie kost meer dan 100 clock ticks. Bij een processorsnelheid van 2 GHz heb je het dus over maar liefst 50 nanoseconde :P.
Het punt is alleen dat ik niet weet hoe een 'try' eigenlijk werkt? Wat doet Delphi dan?
Zie de helpfiles van Delphi.

Een goede grap mag vrienden kosten.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

MisterE schreef op 30 november 2003 @ 16:17:
[...]
Ik heb ooit gelezen dat de 'try' best wat resources en tijd nodig heeft. Het punt is alleen dat ik niet weet hoe een 'try' eigenlijk werkt? Wat doet Delphi dan?
Gebruikt ie net zo'n soort functie als IsInt om het getal te testen?
Levert Windows een error op?
Net zoals een naar een file scrijven , hoe checkt een computer dat nou intern?
een file kan gelockt zijn, geen rechten etc.
HOE werkt 'try' met een logische machine?
Een try-statement stelt een stackframe op die het toestaat om als er middels 'throw' een exception gegooid wordt, zoals in dat geval vanuit StrToInt bijvoorbeeld, direct naar de catch/except statement door te springen van de try-statement. Dit gaat idd over de magistrale hoeveelheid van een stuk of 5-10 assemblerinstructies (een gemiddelde computer tegenwoordig trekt een 2 miljard instructies per seconde).

Professionele website nodig?


  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 15:42
Dala schreef op 30 november 2003 @ 16:25:
Delphi:
1
2
3
4
5
6
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not ( Key in [#8] ) then        //backspace moet altijd kunnen
  if not (key in ['0'..'9']) then 
     key:=#0;                      //als het geen nummer is, niet intypen
end;

daarme kun je alleen maar getallen invoeren bij het edit veld, en wil je een floating getal laat je de ',' ook toe.. is denk ik nog het simpelste.
Nog steeds niet het gemakkelijkste :) Zie de post van Knutselsmurf.

De gemakkelijkste is al gegeven door ta_chi79 als de TS delphi 7 heeft. (ben niet zeker of delphi 6 dat ook heeft. Iig heeft delphi 5 um niet.

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 27-05 23:18

Delphi32

Heading for the gates of Eden

Klopt, D5 heeft geen TryStrToInt. Maar die zijn vrij eenvoudig te bouwen als je gebruik maakt van de Val functie. Die zit er al eeuwen in en zorgt er in ieder geval voor dat je geen gebruik hoeft te maken van een try..except constructie.
Overigens heeft het weigeren van ongeldige invoer vaak veel meer effect, maar daarvoor verwijs ik naar eerdere posters.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 20:23

Tomatoman

Fulltime prutser

Delphi32 schreef op 01 december 2003 @ 00:01:
Klopt, D5 heeft geen TryStrToInt. Maar die zijn vrij eenvoudig te bouwen als je gebruik maakt van de Val functie. Die zit er al eeuwen in en zorgt er in ieder geval voor dat je geen gebruik hoeft te maken van een try..except constructie.
Bij Val moet je de error checking zelf uitvoeren. De implementatie van StrToInt c.s. in Delphi 7 (unit SysUtils) ziet er zo uit:
Delphi:
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
function StrToInt(const S: string): Integer;
var
  E: Integer;
begin
  Val(S, Result, E);
  if E <> 0 then ConvertErrorFmt(@SInvalidInteger, [S]);
end;

function StrToIntDef(const S: string; Default: Integer): Integer;
var
  E: Integer;
begin
  Val(S, Result, E);
  if E <> 0 then Result := Default;
end;

function TryStrToInt(const S: string; out Value: Integer): Boolean;
var
  E: Integer;
begin
  Val(S, Value, E);
  Result := E = 0;
end;
Ik zie trouwens nog steeds niet in waarom een try...except constructie evil is.

[ Voor 11% gewijzigd door Tomatoman op 01-12-2003 02:08 ]

Een goede grap mag vrienden kosten.


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

tomatoman schreef op 01 december 2003 @ 00:09:
Ik zie trouwens nog steeds niet in waarom een try...except constructie evil is.
Het kost iets meer processortijd, dus als het niet echt nodig is scheelt het wat. De grootste rede om het in het geval van StrToInt niet te gebruiken is dat het tijdens het debuggen vrij irritant is om die excepties elke keer te krijgen. Natuurlijk kan je die specifieke exceptie wel tijdens het debuggen uitzetten, maar ik wil m juist aanhouden en alleen excepties krijgen die ook echt een probleem zijn.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Al eens gekeken naar StrToIntDef en StrToFloatDef. Krijg je geen exceptions maar je moet wel een default value invullen.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

En als je geen default waarde wilt geven, maar gewoon een boolean wilt hebben die je verteld of het gelukt is of niet kan je TryStrToInt gebruiken, zoals hier al werd gezegt: [rml]ta_chi79 in "[ delphi] waarden checken op geldigheid."[/rml]

We adore chaos because we like to restore order - M.C. Escher

Pagina: 1