Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Hilfe mit value Befehl (https://www.delphipraxis.net/71685-hilfe-mit-value-befehl.html)

Maeuschen 19. Jun 2006 15:04


Hilfe mit value Befehl
 
Hallo zusammen!

letztens hat uns unser Lehrer gezeigt, wie man ein Programm absturzsicher machen kann. Verstanden hat es leider keiner und den Quelltext hat er auch nicht rausgegeben "Probiert das mal alleine". Prima, wie soll ich denn etwas programmieren, wenn ich nichteinmal den Ansatz kenne?

Das einzige, was ich mitbekam war, dass er irgendetwas mit Value schwafelte, mehr nicht.

Mein konkretes Problem ist jetzt: Was muss ich in den Quelltext eingeben, dass mit mein Programm nicht abstürzt, wenn ich ins Edit1-Feld nicht "4", sondern "vier" eingebe?

Danke an alle, die bis hier hergelesen haben und mir versuchen zu helfen :)

mkinzler 19. Jun 2006 15:07

Re: Hilfe mit value Befehl
 
In eine Edit-Feld kannst du problemlos "vier" eingeben, da es ja einen String aufnimmt.
Ich weiß nicht, von was dein Lehrer geredet hat, ich könnte mir vorstellen, das er die .value Eigenschaft von Datenbankzugriffsobjekten gemeint hat welche Varianten sind.

[Edit: oder er hat den val()-Befeh gemeint]

Maeuschen 19. Jun 2006 15:11

Re: Hilfe mit value Befehl
 
Achso, sorry, das hätte ich erwähnen sollen :oops:
Die zahlen der beiden Editfelder muss man Multiplizieren, d.h ich habe ja schon stehen:

Edit1.text:=strtofloat(z1);
Edit2.text:=strtofloat(z2);
Ergebnis:=(z1*z2);

droppi 19. Jun 2006 15:17

Re: Hilfe mit value Befehl
 
Aber wenn du die Zahlen multiplizieren willst muss das dann nich heißen:
Delphi-Quellcode:
z1:=strtofloat(Edit1.text);
z2:=strtofloat(Edit2.text);
Ergebnis:=(z1*z2);
Wenn du abfragen willst ob ein eingegebener Wert keine Zahl ist würd ich dir if...then... Empfehlen.

mkinzler 19. Jun 2006 15:17

Re: Hilfe mit value Befehl
 
Zitat:

Delphi-Quellcode:
Edit1.text:=strtofloat(z1);
Edit2.text:=strtofloat(z2);
Ergebnis:=(z1*z2);

geht wohl nicht:

Delphi-Quellcode:
z1 := strtofloat(Edit1.text);
z2 := strtofloat(Edit1.text);
Ergebnis := (z1*z2);
müßte es heißen oder besser

Delphi-Quellcode:
if (TryStrToFloat( Edit1.Text, z1)) and (TryStrToFloat( Edit2.Text, z2)) then
   Ergebnis:=(z1*z2)
else
   //Fehler;

droppi 19. Jun 2006 15:22

Re: Hilfe mit value Befehl
 
Ach genau :wall: . Naj wird Zeit dass es wieder Wochenende wird.
Jetzt hab ich doch gedacht du willst mich verbessrn naja.

Maeuschen 19. Jun 2006 15:26

Re: Hilfe mit value Befehl
 
Delphi-Quellcode:
z1:=strtofloat(Edit1.text);
z2:=strtofloat(Edit2.text);
summe:=z1*z2;
Genau das steht jetzt bei mir ^^"

@mkinzler

Ist dein letzter Code jetzt der Code, der zum absturzsicheren Programm führt?

mkinzler 19. Jun 2006 15:29

Re: Hilfe mit value Befehl
 
Ja. Zumindest bezüglich dieser Typumwandlungen

nailor 19. Jun 2006 15:33

Re: Hilfe mit value Befehl
 
also ich würde dir die verwendung eines try/except-Blockes empfehlen (falls ich dein Problem richtig verstanden habe, du wirst nicht gerade mit Informationen um dich)

andimx 19. Jun 2006 15:34

Re: Hilfe mit value Befehl
 
Man kann auch das OnKeyPress Event abfangen den Key Code (Wert der gedrückten Taste) analysieren:

Delphi-Quellcode:
procedure TfrmMain.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 if not (Key in [#46, #48..#57, #8]) then Key := #0;
end;
Gruß
Andi

JKING 19. Jun 2006 15:35

Re: Hilfe mit value Befehl
 
Hier habe ich mal eine function Value() geschrieben.
Wenn keine Zahl eingegeben wurde wird als Ergebnis 0 zurückgeliefert.


Delphi-Quellcode:
function Value(s:string):Double ;
begin
  try
    result:=StrToFloat(s);
  except
    // Eingabe ist keine Zahl
    result:=0;
  end;
end;

procedure TForm1.Edit1Exit(Sender: TObject);
var z1,z2,ergebnis:double;
begin
  z1:=Value(Edit1.text);
  z2:=value(Edit2.text);
  Ergebnis:=(z1*z2);
  edit3.text:=floattostr(ergebnis);
end;

mkinzler 19. Jun 2006 15:39

Re: Hilfe mit value Befehl
 
Da finde ich aber die TryStrToFloat-Variante besser, da sie false als Ergebnis liefert, wenn der wert nicht gewandelt werden konnte. Bei dir kann man nicht unterscheiden ob der benutzer 0 oder jkklfjkskskjf in den Edit eingegeben hat.

Maeuschen 19. Jun 2006 15:42

Re: Hilfe mit value Befehl
 
@mkinzler
Das geht nicht :\

Undefinierter Bezeichner 'TryStrtofloat'
Ausdruckstyp muss Boolean sein

@ anderen
Das klappt zwar alles, nur brauche ich das dann auch in der Klausur und so viel kann ich mir nicht merken, deswegen wäre mir eine unkomplizierte Lösung wirklich lieber. Aber danke für die großzügige Hilfsbereitschaft hier ^__^

mkinzler 19. Jun 2006 15:47

Re: Hilfe mit value Befehl
 
Zitat:

Undefinierter Bezeichner 'TryStrtofloat'
Welche delphi-Version? Funktion befindet sich in SysUtils.

Aber nochmal zur Grundfrage, was eird eingegeben 'vier' oder '4' StrToFloat/TryStrToFloat hilft nur beim 2.

Das 1. kannst du mit Val() erreichen

Maeuschen 19. Jun 2006 16:05

Re: Hilfe mit value Befehl
 
Zitat:

Zitat von mkinzler
Das 1. kannst du mit Val() erreichen

Ja genauuu...diesen Befehl brauche ich ^^ nur was soll ich in die Klammer reinschreiben? Und das ist mein Problem xD

mkinzler 19. Jun 2006 16:08

Re: Hilfe mit value Befehl
 
Zitat:

Zitat von Delphi-Hilfe
Val Routine

Konvertiert einen String in seine numerische Entsprechung.

Unit
System

Syntax


(Delphi) procedure Val(S: string; var V: Type; var Code: Integer);


Beschreibung
In Delphi konvertiert Val den mit S angegebenen String in einen numerischen Wert, der dem Ergebnis einer Leseoperation mit Read aus einer Textdatei entspricht.

S ist ein String-Ausdruck und muss einer vorzeichenbehafteten reellen Zahl entsprechen.
V ist eine Gleitkomma- oder Integer-Variable. Wenn V eine Variable des Typs Integerist, muss S eine ganze zahl ergeben.
Code ist eine Variable des Typs Integer.

Ist der String ungültig, wird der Index des betreffenden Zeichens im Parameter Code gespeichert. Andernfalls wird Code der Wert Null zugewiesen. Bei einem nullterminierten String ist die in Code zurückgegebene Fehlerposition um eins größer als der auf Null basierende Index des Zeichens.


mkinzler 19. Jun 2006 17:28

Re: Hilfe mit value Befehl
 
Nur leider macht die Funktion nicht ganz was ich versprochen hat habe :oops:
Sie Ignoriert nur falsche Zeichen im String.

Delphi-Quellcode:
wert := StrToInt( '400x');
würde eine Fehler liefern, aber
Delphi-Quellcode:
Val( '400x', wert, fehlerpos);
würde wert = 400 liefern. Ich nehme trotzdem an, das dein Lehrer diese Funktion gemeint hat.

[Edit: Sch.... Tippfehler]

Hawkeye219 19. Jun 2006 17:39

Re: Hilfe mit value Befehl
 
So schlecht ist die Routine doch gar nicht, Markus.

Zitat:

Zitat von Delphi-Hilfe
Ist der String ungültig, wird der Index des betreffenden Zeichens im Parameter Code gespeichert. Andernfalls wird Code der Wert Null zugewiesen.

Nur wenn in Code der Wert 0 zurückgegeben wird, konnte der String vollständig umgewandelt werden. Ansonsten gibt Code die Position des "Fehlers" an. Auch das kann manchmal sehr nützlich sein.

Einziger Nachteil der Prozedur: sie akzeptiert nur Dezimalpunkte.

Gruß Hawkeye

mkinzler 19. Jun 2006 17:42

Re: Hilfe mit value Befehl
 
Nein, sie (?) such ja ne Funktion die 'vier' in 4 wandelt.

Hawkeye219 19. Jun 2006 17:48

Re: Hilfe mit value Befehl
 
Ich kann mir ehrlich gesagt nicht vorstellen, daß ein Lehrer solche Anforderungen an die Schüler stellt. Meiner Meinung nach soll durch die Eingabe von "vier" nur getestet werden, wie sich das Programm bei der Eingabe von Texten verhält. Die Aufgabe der Schüler wird wohl lediglich darin bestehen, solche Eingaben als fehlerhaft zurückweisen.

Vielleicht kann uns "Maeuschen" dazu mehr sagen?

Gruß Hawkeye

3_of_8 19. Jun 2006 17:55

Re: Hilfe mit value Befehl
 
Ich nehme eher mal an, dass der Lehrer Try-Except Blöcke gemeint hat.

mkinzler 19. Jun 2006 17:57

Re: Hilfe mit value Befehl
 
Ich bin mir auch relativ sicher, das er den Val-Befehl gemeint hat; sie hatt auch sowas behalten ( value ~ Val).

Amateurprofi 20. Jun 2006 01:28

Re: Hilfe mit value Befehl
 
edit: hatte übersehen, daß da schon 2 Seiten waren... sorry
Delphi-Quellcode:
var
   v:double; // oder anderer numerischer typ
   vc:integer;

begin
   //...
   val(Edit1.Text,v,vc);
   if vc<>0 then begin
      // Fehler
   end;
   //...
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz