Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Taschenrechner : ' ' ist kein Gleitkommawert (https://www.delphipraxis.net/161889-taschenrechner-ist-kein-gleitkommawert.html)

Ric 26. Jul 2011 10:43

Delphi-Version: 5

Taschenrechner : ' ' ist kein Gleitkommawert
 
Hallo liebe Community,

Ich versuche seit ner Woche einen Taschenrechner in Delphi zu erstellen.
Dank den anderen Threads kam ich auch relativ weit.
Ich habe ein Fehler bei den Rechenzeichen festgestellt.
Bsp.
Wenn ich 2 mal auf '+' Klicke kommt die Fehlermeldung
'' ist kein Gleitkommawert.

http://s7.directupload.net/images/110726/q9rjswg3.jpg



Delphi-Quellcode:
procedure TForm1.btn_plusClick(Sender: TObject);
  begin
  opperator := '+';
  if zwischenergebnis = 0  then
  begin
  try
      zwischenergebnis := strtofloat(edit1.text);
    except
      zwischenergebnis := 0;
  end;
  edit1.Text := '';// Hier habe ich auch versucht die Zeile in: if edit1.Text = '' then exit; umzuwandeln.

Was mache ich falsch?

Hier der QT

Delphi-Quellcode:
unit taschenrechner;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    btn_1: TButton;
    BTN_2: TButton;
    BTN_3: TButton;
    BTN_4: TButton;
    BTN_5: TButton;
    BTN_6: TButton;
    BTN_7: TButton;
    BTN_8: TButton;
    BTN_9: TButton;
    BTN_0: TButton;
    btn_div: TButton;
    btn_mal: TButton;
    btn_minus: TButton;
    btn_plus: TButton;
    btn_gleich: TButton;
    btn_clear: TButton;
    BTN_komma: TButton;
    procedure btn_clearClick(Sender: TObject);
    procedure btn_plusClick(Sender: TObject);
    procedure btn_malClick(Sender: TObject);
    procedure btn_gleichClick(Sender: TObject);
    procedure btn_1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btn_divClick(Sender: TObject);
    procedure btn_minusClick(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);

private
    { Private-Deklarationen }
    zwischenergebnis : real;
    opperator : String;
    oppbool : bool;
public
    { Public-Deklarationen }
end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var  ausgabe : real;

procedure TForm1.btn_divClick(Sender: TObject);
  begin
      opperator := '/';
  if zwischenergebnis = 0  then
  begin
  try
      zwischenergebnis := strtofloat(edit1.text);
  except
      zwischenergebnis := 0;
  end;
      edit1.Text := '';
  end
  else
  begin
      edit1.Text := FloatToStr(zwischenergebnis / strtofloat(edit1.text));
      zwischenergebnis := StrToFloat(edit1.text);
      oppbool := true;
  end;
  end;

procedure TForm1.btn_malClick(Sender: TObject);
  begin
      opperator := '*';
  if zwischenergebnis = 0  then
  begin
  try zwischenergebnis := strtofloat(edit1.text);
  except
      zwischenergebnis := 0;
  end;
      edit1.Text := '';
  end
  else
  begin
      edit1.Text := FloatToStr(zwischenergebnis * strtofloat(edit1.text));
      zwischenergebnis := StrToFloat(edit1.text);
      oppbool := true;
  end;

end;

procedure TForm1.btn_minusClick(Sender: TObject);
  begin
      opperator := '-';
  if zwischenergebnis = 0  then
  begin
  try
      zwischenergebnis := strtofloat(edit1.text);
  except
      zwischenergebnis := 0;
  end;
      edit1.Text := '';

  end
  else
  begin
      edit1.Text := FloatToStr(zwischenergebnis - strtofloat(edit1.text));
      zwischenergebnis := StrToFloat(edit1.text);
      oppbool := true;

  end;
  end;

procedure TForm1.btn_plusClick(Sender: TObject);
  begin
  opperator := '+';
  if zwischenergebnis = 0  then
  begin
  try
      zwischenergebnis := strtofloat(edit1.text);
    except
      zwischenergebnis := 0;
  end;
  edit1.Text := '';

  end
  else
  begin
      edit1.Text := FloatToStr(zwischenergebnis + strtofloat(edit1.text));
      zwischenergebnis := StrToFloat(edit1.text);
      oppbool := true;
  end;
  end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
  begin
      Key:= #0;
  end;

procedure TForm1.btn_gleichClick(Sender: TObject);

  begin

  if edit1.text = '' then
  begin
      edit1.Text := FloatToStr(zwischenergebnis);
      exit;
  end;

  if (opperator = '+') and (zwischenergebnis <> 0 ) then
  begin
      edit1.Text := FloatToStr(zwischenergebnis + strtofloat(edit1.text));
      zwischenergebnis := 0;
  end
  else
  if (opperator = '*') and (zwischenergebnis <> 0) then
  begin
      edit1.Text := FloatToStr (zwischenergebnis * strtofloat(edit1.Text));
      zwischenergebnis := 0;
  end
  else
  if (opperator = '/') and (zwischenergebnis <> 0) then
  begin
      edit1.Text := FloatToStr (zwischenergebnis / strtofloat(edit1.Text));
      zwischenergebnis := 0;
  end
  else
  if (opperator = '-') and (zwischenergebnis <> 0) then
  begin
      edit1.Text := FloatToStr (zwischenergebnis - strtofloat(edit1.Text));
      zwischenergebnis := 0;
  end;
  end;


procedure TForm1.btn_clearClick(Sender: TObject);
  begin
      Edit1.Text := '';
      zwischenergebnis := 0;
  end;

procedure TForm1.btn_1Click(Sender: TObject);

  begin
  if oppbool = true then
  begin
      Edit1.Text := '';
      oppbool := false;
  end;

      Edit1.Text :=Edit1.Text + tbutton(sender).Caption;

  end;


  procedure TForm1.FormCreate(Sender: TObject);
  begin
      zwischenergebnis := 0;
      opperator := '';
  end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
  begin
  if not (key in [#48..#57,#8,#27, #44, #43, #13, #47, #45, #42]) then Key:= #0;
      //#48 = 0, #57 = 9, #8 = Backspace, #44 = ,
      //Damit sind im Edit1 Feld nur Zahlen, Kommas und die Rücktaste erlaubt.
      btn_1click(FindComponent('BTN_'+key));
      if key = #27 then btn_clearclick(self);
      if key = #43 then btn_plusclick(self);
      //if not (key in [#13]) then btn_gleichclick(self);
      if key = #13 then btn_gleichclick(self);
      if key = #47 then btn_divclick(self);
      if key = #45 then btn_minusclick(self);
      if key = #42 then btn_malclick(self);

  end;

  end.

patti 26. Jul 2011 10:54

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
Hi.

Ich geh mal stark davon aus, dass das Problem in der Zeile hier liegen dürfte:

Delphi-Quellcode:
zwischenergebnis := strtofloat(edit1.text);
Hier versuchst du den Inhalt von edit1 in einen Float zu wandeln, wenn aber nichts im Edit steht, dann knallts. Das passiert, weil deine Variable "zwischenergebnis" nach zweimaligem Drücken von "+" wohl 0 ist und die obige Zeile daher erreicht wird. Entweder du benutzt Methoden wie TryStrToFloat, oder du baust einen try-except-Block außenrum, oder du fragst vorher ab, ob sich der Inhalt vom Edit-Feld in einen Float wandeln lässt.

Gruß

himitsu 26. Jul 2011 10:57

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
Bring hierfür blos niemanden diesen Sch* mit den Try-Except bei.
Beim Debuggen wird sich sowas später sehr übel rächen, da hier der Debuger natürlich auf die Exception anspringt.
(Exception = "Ausnahmesituation" und nicht "normale Fehlerbehandlung")

Es gibt nicht umsonst die TryStrToXyz- und StrToXyzDef-Funktionen.

Delphi-Referenz durchsuchenTryStrToFloat Delphi-Referenz durchsuchenStrToFloatDef

patti 26. Jul 2011 11:05

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
Zitat:

Zitat von himitsu (Beitrag 1113571)
Bring hierfür blos niemanden diesen Sch* mit den Try-Except bei.

Hm, hab gerade etwas drüber nachgedacht und in Delphi ist das vielleicht wirklich nicht so das wahre. Java kennt da ein etwas ausgefeilteres try-catch-Konstrukt, bei dem verschiedene Exceptions unterschiedlich behandelt werden können, da ists dann ein leichtes, z.B. eine NumberFormatException abzufangen und entsprechend zu behandeln:

Code:
try {
  int i = Integer.parseInt("a");
} catch (NumberFormatException ex) {
  // whatever
}
Vorteil ist m.M.n., dass ich hier alle Möglichkeiten habe, auf eine Fehl-Eingabe zu reagieren, da bin ich bei den TryStrTo*-Methoden schon etwas eingeschränkter. Dann seh ich eigentlich auch kein Problem mehr beim Debuggen :gruebel: Gibts in Delphi eigentlich eine entpsrechende Möglichkeit?

Grüße

Medium 26. Jul 2011 11:09

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
Delphi-Quellcode:
try
  //foo
except
  on e: SomeSpecialExceptionClass do ...
  on e: SomeLessSpecialExceptionClass do ...
  on e: SomeFairlyGeneralExceptionClass do ...
  ...
  on e: Exception do ...
end;
Dennoch ist es nicht sinnvoll diesen Fall mit Exceptions zu behandeln, da ja eine erwartete Fehleingabe vorliegt.

patti 26. Jul 2011 11:21

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
Zitat:

Zitat von Medium (Beitrag 1113575)
Dennoch ist es nicht sinnvoll diesen Fall mit Exceptions zu behandeln, da ja eine erwartete Fehleingabe vorliegt.

Gut, darüber lässt sich diskutieren. Danke für das Beispiel!

Grüße

Medium 26. Jul 2011 11:24

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
Naja, er setzt mit "edit1.Text := '';" den Inhalt ja selbst, programmseitig, auf einen nicht wandelbaren Wert, somit muss das als definierter Zustand angesehen werden, der alles andere als eine Ausnahme ist. Find ich. Wo wir schon mal dabei sind =)

himitsu 26. Jul 2011 12:19

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
Kennt Delphi auch,
Delphi-Quellcode:
try

except
  on E: EIrgendwas do begin

  end;
  on E: Exception do begin

  end;
end;
Aber da der "Debugger" Exceptions standardmäßig erstmal anzeigt, wenn sie ausgelöst werden, auch wenn sie dann über Try-Except weggefangen werden.
Wie gesagt, im laufenden Betrieb mag es "funktionieren", aber vorallem im Debugger isses blöd.
Klar könnte man bestimmte Excepionklassen im Debugger ausschließen, aber dann isses blöd, wenn man soeine Exception von wo anders nicht mehr so schön mitbekommt.


[edit] ups, da hab ich wohl 2 Beiträge mittendrin übersehn :oops:

Ric 26. Jul 2011 13:58

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
Danke für eure antworten,

hab jetzt rausbekommen woran es lag

Delphi-Quellcode:
 if  edit1.Text = '' then exit;
Diese umwandlung war richtig, aber falsch positioniert.

himitsu 26. Jul 2011 14:07

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
Zitat:

Zitat von Ric (Beitrag 1113634)
Delphi-Quellcode:
if edit1.Text = '' then ...
Diese umwandlung war richtig,

Was für eine Umwandlung?

Tipp: Gib mal irgendwo ein Leerzeichen, einen Buchstaben oder einen zweiten Punkt in dein Edit ein.

Ric 27. Jul 2011 07:18

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
Es hat alles prima geklappt, erscheint auch keine Fehlermeldung mehr :-D
So sieht das jetzt aus

Delphi-Quellcode:
procedure TForm1.btn_malClick(Sender: TObject);
begin
  if  edit1.Text = '' then exit;
  opperator := '*';
  if zwischenergebnis = 0  then
  begin
    try
      zwischenergebnis := strtofloat(edit1.text);
    except
      zwischenergebnis := 0;
    end;
    edit1.Text := '';
  end
  else
  begin
      edit1.Text := FloatToStr(zwischenergebnis * strtofloat(edit1.text));
      zwischenergebnis := StrToFloat(edit1.text);
      oppbool := true;
  end;
end;

himitsu 27. Jul 2011 08:50

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
Zitat:

erscheint auch keine Fehlermeldung mehr
Hast du dir alle Beiträge durchgelesen?

DeddyH 27. Jul 2011 12:20

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
Anscheinend nicht. Aber die erste Abfrage lässt sich ja beliebig erweitern.
Delphi-Quellcode:
if (Edit1.Text = '') or (Edit1.Text = ' ') or (Edit1.Text = 'A') or (Edit1.Text = 'a')
{...} or (Edit1.Text = 'Meine Fresse, was so alles in einem String stehen kann') then exit;
:stupid:

biby90 29. Jul 2011 14:19

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
ich habs mit einer for schleife gemacht aber es geht irgendiwe trotzdem nicht
Delphi-Quellcode:
function TForm1.IsValidFloat(AValue1: String): Boolean;
var
  i: Integer;
begin

  Result := false;
    {
    Gegeben: String, Gesucht: Boolean}

    if AValue1 <> '' then
    begin
      for i := 0 to Length(AValue1) do
      begin
        if AValue1[i] in ['0'..'9', ','] then
          begin
            Result := true;
          end;
      end;

    end else
    begin
      ShowMessage('String ist leer.');
    end;
end;

DeddyH 29. Jul 2011 14:35

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
Natürlich nicht, denn das Result wird ja auf true gesetzt, sobald auch nur ein einziges Zeichen gültig ist. Du musst es genau anders herum machen.

biby90 29. Jul 2011 14:44

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
sonst ist es so richtig? weil wenn ich true und false vertausche klappts immer noch nicht
oder ich bin einfach zu blöd.. blond eben :)

himitsu 29. Jul 2011 15:00

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
Delphi-Quellcode:
function TForm1.IsValidFloat(AValue1: String): Boolean;
var
  i: Integer;
begin

  Result := true;
    {
    Gegeben: String, Gesucht: Boolean}

    if AValue1 <> '' then
    begin
      for i := 1 to Length(AValue1) do // Strings beginnen bei 1 !!!
      begin
        if not (AValue1[i] in ['0'..'9', ',']) then
          begin
            Result := false;
            Exit; // das Ergebnis steht fest, also kann man mit Exit oder Break die Bearbeitung auch abbrechen
          end;
      end;
    end else
    begin
      ShowMessage('String ist leer.');
      Result := false;
    end;
end;

Aber wozu der Aufwand?

Es gibt fertige Funktionen, um sowas zu prüfen.

Delphi-Referenz durchsuchenTryStrToFloat
Delphi-Referenz durchsuchenStrToFloatDef
Delphi-Referenz durchsuchenVal (das sagt einem sogar wo der Fehler steckt)

PS: Das Komma ist nicht immer das Dezimaltrennzeichen. (die Amis nutzen z.B. den Punkt dafür)
Delphi-Referenz durchsuchenDecimalSeparator

Deine Funktion erlaubt auch noch mehrere Kommas oder das Weglassen des Vorkomma- und/oder Nachkommaanteils.
Wenn man schon eine manuelle Syntakprüfung machen möchte, dann doch besser richtig prüfen, denn sonst bringt das Ganze ja nichts, da es später dennoch knallen kann.


Zitat:

Strings beginnen bei 1
Ich rate dir dringend mal, in den Projektoptionen, die Indexprüfung zu aktivieren. (eventuell auch mal probehalber die Überlaufprüfung)

p80286 29. Jul 2011 15:07

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
versuch es doch mal so:
Delphi-Quellcode:
function TForm1.IsValidFloat(AValue1: String): Boolean;
var
  i: Integer;
begin

  Result := false;
    {
    Gegeben: String, Gesucht: Boolean}

    if AValue1 <> '' then
    begin
      result := true;
      for i := 1 to Length(AValue1) do
        if AValue1[i] not in ['0'..'9', ','] then
          Result := false;
     
    end else
    begin
      ShowMessage('String ist leer.');
    end;
end;
Gruß
K-H

Edith:
Erst zu langsam, dann auch noch vertippt.

biby90 29. Jul 2011 15:16

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
es kommt immer noch die meldung

Im Projekt Project1.exe ist eine Exception der Klasse EConvertError mit der Meldung ''' ist kein gültiger Gleitkommawert' aufgetreten.

biby90 29. Jul 2011 15:37

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
da habt ihr mal den ganzen QT
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    txt_rechnung: TEdit;
    cmd_7: TButton;
    Label1: TLabel;
    cmd_clear: TButton;
    cmd_div: TButton;
    cmd_gleich: TButton;
    cmd_0: TButton;
    cmd_komma: TButton;
    cmd_1: TButton;
    cmd_2: TButton;
    cmd_3: TButton;
    cmd_mul: TButton;
    cmd_6: TButton;
    cmd_5: TButton;
    cmd_4: TButton;
    cmd_add: TButton;
    cmd_9: TButton;
    cmd_8: TButton;
    cmd_sub: TButton;
    procedure cmd_clearClick(Sender: TObject);
    procedure cmd_2Click(Sender: TObject);
    procedure cmd_3Click(Sender: TObject);
    procedure cmd_4Click(Sender: TObject);
    procedure cmd_5Click(Sender: TObject);
    procedure cmd_6Click(Sender: TObject);
    procedure cmd_7Click(Sender: TObject);
    procedure cmd_8Click(Sender: TObject);
    procedure cmd_9Click(Sender: TObject);
    procedure cmd_0Click(Sender: TObject);
    procedure cmd_divClick(Sender: TObject);
    procedure cmd_mulClick(Sender: TObject);
    procedure cmd_subClick(Sender: TObject);
    procedure cmd_addClick(Sender: TObject);
    procedure cmd_gleichClick(Sender: TObject);
    procedure cmd_kommaClick(Sender: TObject);
    Procedure Rechenarten;
    procedure cmd_1Click(Sender: TObject);

  private
    function IsValidFloat(AValue1: String): Boolean;


  public
{ Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Rechenart: Integer;
  Speicher: Real;
  GZahl: array[0..9] of Integer;

const
  GZahl0 = 0;
  GZahl1 = 1;
  GZahl2 = 2;
  GZahl3 = 3;
  GZahl4 = 4;
  GZahl5 = 5;
  GZahl6 = 6;
  GZahl7 = 7;
  GZahl8 = 8;
  GZahl9 = 9;


implementation

{$R *.dfm}

procedure TForm1.cmd_0Click(Sender: TObject);
begin
  txt_rechnung.Text := txt_rechnung.Text + IntToStr(GZahl0);
end;

procedure TForm1.cmd_1Click(Sender: TObject);
begin
  txt_rechnung.Text := txt_rechnung.Text + IntToStr(GZahl1);
end;

procedure TForm1.cmd_2Click(Sender: TObject);
begin
  txt_rechnung.Text := txt_rechnung.Text + IntToStr(GZahl2);
end;

procedure TForm1.cmd_3Click(Sender: TObject);
begin
  txt_rechnung.Text := txt_rechnung.Text + IntToStr(GZahl3);
end;

procedure TForm1.cmd_4Click(Sender: TObject);
begin
  txt_rechnung.Text := txt_rechnung.Text + IntToStr(GZahl4);
end;

procedure TForm1.cmd_5Click(Sender: TObject);
begin
  txt_rechnung.Text := txt_rechnung.Text + IntToStr(GZahl5);
end;

procedure TForm1.cmd_6Click(Sender: TObject);
begin
  txt_rechnung.Text := txt_rechnung.Text + IntToStr(GZahl6);
end;

procedure TForm1.cmd_7Click(Sender: TObject);
begin
  txt_rechnung.Text := txt_rechnung.Text + IntToStr(GZahl7);
end;

procedure TForm1.cmd_8Click(Sender: TObject);
begin
  txt_rechnung.Text := txt_rechnung.Text + IntToStr(GZahl8);
end;

procedure TForm1.cmd_9Click(Sender: TObject);
begin
  txt_rechnung.Text := txt_rechnung.Text + IntToStr (GZahl9);
end;

procedure TForm1.cmd_addClick(Sender: TObject);
begin
  label1.Caption := '+';
  Rechenarten;
  Rechenart := 1;
  Speicher := StrToFloat(txt_Rechnung.Text);
  txt_rechnung.text := '';
end;

procedure TForm1.cmd_clearClick(Sender: TObject);
begin
  txt_rechnung.Clear;
  label1.caption := '';
  Speicher := 0;
  Rechenart := 0;
end;

procedure TForm1.cmd_divClick(Sender: TObject);
begin
  label1.Caption := '/' ;
  Rechenarten;
  Rechenart := 4;
  Speicher := StrToFloat(txt_Rechnung.Text);
  txt_rechnung.text := '';
end;

procedure TForm1.cmd_mulClick(Sender: TObject);
begin
  label1.Caption := '*' ;
  Rechenarten;
  Rechenart := 3;
  Speicher := StrToFloat(txt_Rechnung.Text);
  txt_rechnung.text := '';
end;

procedure TForm1.cmd_subClick(Sender: TObject);
begin
  label1.Caption := '-' ;
  Rechenarten;
  Rechenart := 2;
  Speicher := StrToFloat(txt_Rechnung.Text);
  txt_rechnung.Text := '';
end;

function TForm1.IsValidFloat(AValue1: String): Boolean;
 var
   i: Integer;
 begin

  Result := false;
     {
     Gegeben: String, Gesucht: Boolean}

    if AValue1 <> '' then
     begin
       for i := 0 to Length(AValue1) do
       begin
         if AValue1[i] in ['0'..'9', ','] then
           begin
             Result := true;
           end;
       end;
     end else
      begin
       ShowMessage('String ist leer.');
      end;
 end;

procedure TForm1.Rechenarten;
begin
  IsValidFloat(txt_rechnung.text);

  case Rechenart of
    0:
    begin
      Speicher := StrToFloat(txt_rechnung.Text);
    end;
    1:
    begin
      Speicher := Speicher + StrToFloat(txt_rechnung.text);
    end;
    2:
    begin
      Speicher := Speicher - StrToFloat(txt_rechnung.text);
    end;
    3:
    begin
      Speicher := Speicher * StrToFloat(txt_rechnung.text);
    end;
    4:
    begin
      Speicher := Speicher / StrToFloat(txt_rechnung.text);
    end;
  end;
end;

procedure TForm1.cmd_gleichClick(Sender: TObject);
begin
  Rechenarten;
  txt_rechnung.text := FloatToStr(Speicher);
  Speicher := 0;
  Rechenart := 0;
end;

procedure TForm1.cmd_kommaClick(Sender: TObject);
begin
  txt_rechnung.Text := txt_rechnung.Text + ',';
end;

end.

p80286 29. Jul 2011 16:39

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
Du hast zwei Hinweise bekommen wie Du Deine Probleme in den Griff bekommen könntest.
Aber immer noch steht bei Dir:
Delphi-Quellcode:
function TForm1.IsValidFloat(AValue1: String): Boolean;
 var
   i: Integer;
 begin

  Result := false;
     {
     Gegeben: String, Gesucht: Boolean}

    if AValue1 <> '' then
     begin
       for i := 0 to Length(AValue1) do
       begin
         if AValue1[i] in ['0'..'9', ','] then
           begin
             Result := true;
           end;
       end;
     end else
      begin
       ShowMessage('String ist leer.');
      end;
 end;
Gruß
K-H

himitsu 29. Jul 2011 16:56

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
So, zu der Nummernprüfung wurde eigentlich schon alles gesagt...






Unnötige Konstanten besser vermeiden.
Delphi-Quellcode:
procedure TForm1.cmd_0Click(Sender: TObject);
begin
  txt_rechnung.Text := txt_rechnung.Text + IntToStr(0);
end;
Aber du weißt ja eh schon, was IntToStr liefern wird.
Delphi-Quellcode:
procedure TForm1.cmd_0Click(Sender: TObject);
begin
  txt_rechnung.Text := txt_rechnung.Text + '0';
end;
Und dann gibt es eine "Regel" (OK, eigentlich mehr Hinweis/Tipp), daß man doppelten Code vermeiden sollte.
In Sender steckt die Komponente, von welcher der Aufruf kommt, also welche den Befehl gesendet hat.

In .Hint kann man nun das Zeichen "verstecken":
Delphi-Quellcode:
procedure TForm1.cmd_NumClick(Sender: TObject);
begin
  txt_rechnung.Text := txt_rechnung.Text + TButton(Sender).Hint;
end;
Außerdem hätte jede Komponente .Tag, welches man auch verwenden könnte.
(wird nicht von Delphi genutzt und kann von dir verwendet werden, wofür du auch willst)
Delphi-Quellcode:
procedure TForm1.cmd_NumClick(Sender: TObject);
begin
  txt_rechnung.Text := txt_rechnung.Text + IntToStr(TButton(Sender).Tag);
end;
Nun muß man nur noch diese Methoden allen Nummern-Buttons zuweisen und im OI, bei diesen Buttons, das .Hint oder .Tag entsprechend setzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:06 Uhr.

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