Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zinsrechner (https://www.delphipraxis.net/124054-delphi-zinsrechner.html)

Siggy 13. Nov 2008 16:28


Delphi Zinsrechner
 
Hallo Delhpi-Gemeinde!
Habe dieses Schuljahr mit Delphiangefangen (wird von nem Lehrer als Art Wahlfach angegeben, das ich aber abrechnen kann).
Wir sind noch ziemlich am Anfang und bis jetz bin ich überall mitgekommen und habe zuhause meistens schon vorgearbeitet.
Letzte Woche haben wir einen Zinsrechner (den wir vorher programmiert haben) versucht noch ein bisschen zu erweitern.
Zum einen haben wir eingebaut, dass wenn man das Programm öffnet, dass man automatisch in das Edit1 Fenster springt mit eingabe von Enter kommt man in Edit2 und bei weiterem Drücken von Enter rechnet das Programm.
Soweit so gut. Leider kommt bei Start des Programms immer die Nachricht:

Deaktiviertes oder unsichtbares Fenster kann den Fokus nicht enthalten!

Unser Lehrer hat gemeint, ist halt so aber irgendwie kann ic das nicht glauben. Deswegen meine 1. Frage:
Wie kann man das verbessern??

So nun zu meiner 2. Frage:

Wir haben dann noch etwas gemacht mit val(Edit1.text, Var, code )
Leider haben wir das nicht "fertig" gemacht und unser Programm dann so stehen lassen:

[code=delphi]var
Form1: TForm1;
code: Integer;
Anfangskapital: real;
Jahre: real;
Endkapital: real;
Zinssatz : real;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
try
val (edit1.text, anfangskapital, code); // E ingabe
val (edit3.text, Jahre, code);


if Jahre <=4
then
begin
Zinssatz := 3;
Label4.Caption :=
'mit einem Zinssatz von 3%';
end

else
begin
Zinssatz := 5;
Label4.Caption :=
'mit einem Zinssatz von 5%' ;
end;

if Jahre >= 10
then
begin
Zinssatz := 7 ;
Label4.Caption :=
'mit einem Zinssatz von 7%' ;
end;



if code = 0 then
Endkapital :=
(Round(100*(Anfangskapital * exp (Jahre * ln (1+ Zinssatz/100))))/100) ; // V erarbeitung
Label2.Caption := FloatToStr (Endkapital); // A usgabe

except
Showmessage ('Eingabefehler:' +#13+
'Variable = Laufzeit' +#13+
'Stelle =' +FloatToStr(code) +#13+
'Falsches Zeichen=' + Edit3.text
Code:
+#13#13+
               'Bitte Eingabe wiederholen...');

    end;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
edit3.SetFocus;
end;

procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
Button1.Click;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
edit1.SetFocus;
end;

end.
Ziel ist es (soweit ich weiss) dass wenn man eine falsche Eingabe macht, zum Beispiel bei Jahre: 1a2x
, dass dann eine Meldung kommt die dem Benutzer des Programms sagt, wo der Fehler liegt und wie man das besser machen kann.

Bis jetzt funktioniert das aber noch nicht. Wenn man eine falsche Eingabe macht bleibt einfach das alte Ergebnis stehen oder es tut sich gar nichts.


Nun wüsste ich gerne was noch nicht stimmt und wie man das verbessern kann?

Ich weiss ziemlich viel Text, aber ich hoffe dennoch dass mein Problem klar geworden ist und dass ihr mir helfen könnt.

Mfg Siggy

Ginko 13. Nov 2008 17:09

Re: Delphi Zinsrechner
 
Hallo zu Frage zwei meint er vielleicht das hier:

[code=delphi]
if code = 0 then
begin
Endkapital :=(Round(100*(Anfangskapital * exp (Jahre * ln (1+ Zinssatz/100))))/100) ;
Label2.Caption := FloatToStr (Endkapital);
end
else showmessage ('Eingabefehler:' +#13+
'Variable = Laufzeit' +#13+
'Stelle =' +FloatToStr(code) +#13+
'Falsches Zeichen=' + Edit1.text
Code:
+#13#13+
                  'Bitte Eingabe wiederholen...');
Die Messages nach except werden ja glaubig nur beim arbeiten mit der .exe angezeigt.
Also wenn du die .exe Datei deines Programmes ausführst, müsste die Fehlerabfrage auch ohne meine Änderung klappen.

Zu Frage 1 hab ich aber jetzt keine Idee...

Marc. 13. Nov 2008 17:19

Re: Delphi Zinsrechner
 
Zitat:

Zitat von Siggy
Leider kommt bei Start des Programms immer die Nachricht:

Deaktiviertes oder unsichtbares Fenster kann den Fokus nicht enthalten!

Das ist auch klar! Wie willst du einem Edit-Feld den Focus geben, wenn es noch gar nicht wirklich "existiert" ?
Lösung:
Delphi-Quellcode:
procedure TForm1.FormActivate(Sender: TObject);
begin
  Edit2.SetFocus;
end;
Zur zweiten Frage sagt mir die Delphi-Hilfe folgendes:
Delphi-Quellcode:
uses Dialogs;
var
  I, Code: Integer;
begin
  { Get text from TEdit control }
  Val(Edit1.Text, I, Code);
  { Error during conversion to integer? }
  if Code <> 0 then
    MessageDlg('Error at position: ' + IntToStr(Code), mtWarning, [mbOk], 0, mbOk);
  else
    Canvas.TextOut(10, 10, 'Value = ' + IntToStr(I));
end;
Val unterstützt bereits eine Fehlerbehandlung, daher ist ein Try-Except-Block absolut überflüssig. ;)

xZise 13. Nov 2008 20:11

Re: Delphi Zinsrechner
 
Zitat:

Zitat von Marc.
Zitat:

Zitat von Siggy
Leider kommt bei Start des Programms immer die Nachricht:

Deaktiviertes oder unsichtbares Fenster kann den Fokus nicht enthalten!

Das ist auch klar! Wie willst du einem Edit-Feld den Focus geben, wenn es noch gar nicht wirklich "existiert" ?
Lösung:
Delphi-Quellcode:
procedure TForm1.FormActivate(Sender: TObject);
begin
  Edit2.SetFocus;
end;

Danach könnte es aber von Vorteil sein, dass nicht ständig wieder das Edit2 fokussiert wird. Abhilfe schafft da einfach das FormActivate wieder "abgekoppelt" wird (es also nicht mehr ausgeführt wird sobald es einmal ausgeführt wurde). Dazu muss einfach da irgendwo in dieser Prozedur das rein:

Delphi-Quellcode:
OnActivate := nil;
Übrigens ist es sinnvoll seine Codezeilen einzurücken.

MfG
xZise

Sir Rufo 13. Nov 2008 22:29

Re: Delphi Zinsrechner
 
Zitat:

Zitat von Siggy
Unser Lehrer hat gemeint, ist halt so aber irgendwie kann ic das nicht glauben. Deswegen meine 1. Frage:
Wie kann man das verbessern??

Den Leerkörper wechseln! ... eine andere Möglichkeit sehe ich da nicht ... :stupid:

Zitat:

Zitat von Marc.
Das ist auch klar! Wie willst du einem Edit-Feld den Focus geben, wenn es noch gar nicht wirklich "existiert" ?

Das ist leider falsch!
Der Event OnCreate wird _nach_ dem kompletten Erzeugen des Formulars gefeuert.
Sonst würde eine andere Fehlermeldung kommen

Statt
Delphi-Quellcode:
procedure TForm1.FormActivate(Sender: TObject);
begin
  Edit2.SetFocus;
end;
würde ich das eher in OnShow platzieren
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
  Edit2.SetFocus;
end;
und wenn das wirklich ausschließlich nach dem Erzeugen passieren soll, dann einen Timer nehmen, den Interval auf 1 setzen und
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Sender is TTimer
  then
    TTimer( Sender ).Enabled := False;
  Edit2.SetFocus;
end;
cu

Oliver

[edit]sorry xZise, da habe ich wohl beim Zitieren zuviel weggelöscht[/edit]

Michael Habbe 14. Nov 2008 00:04

Re: Delphi Zinsrechner
 
Zitat:

Zitat von Siggy
Hallo Delhpi-Gemeinde!
[...]
Soweit so gut. Leider kommt bei Start des Programms immer die Nachricht:

Deaktiviertes oder unsichtbares Fenster kann den Fokus nicht enthalten!

Unser Lehrer hat gemeint, ist halt so aber irgendwie kann ic das nicht glauben.
[...]

Naja:

1. Wie schon gesagt wurde: Lehrer austauschen. Sollte im Zeitalter der Objekte kein Problem mehr darstellen :twisted:

2. Kann es sein, dass Du das Eingabefeld, auf welches Du den Fokus setzen willst im Objektinspektor auf Visible = False oder Enabled = False stehen hast?!?


Zitat:

Zitat von Siggy
Delphi-Quellcode:
var
procedure TForm1.FormCreate(Sender: TObject);
begin
edit1.SetFocus; // ein nicht sichtbares oder deaktiviertes Eingabefeld kann nicht den Fokus erhalten!!!
end;


mfg
Michael

Luckie 14. Nov 2008 08:53

Re: Delphi Zinsrechner
 
Zitat:

Zitat von Sir Rufo
und wenn das wirklich ausschließlich nach dem Erzeugen passieren soll, dann einen Timer nehmen, den Interval auf 1 setzen und

einen Timer halte ich da für ziemlich übertrieben. ein einfacher boolesche Variable würde es auch tun.

Sir Rufo 14. Nov 2008 09:32

Re: Delphi Zinsrechner
 
@Luckie: ok ... :-) ... aber es tut auf jeden Fall :mrgreen:

Zitat:

Zitat von Michael Habbe
2. Kann es sein, dass Du das Eingabefeld, auf welches Du den Fokus setzen willst im Objektinspektor auf Visible = False oder Enabled = False stehen hast?!?


Zitat:

Zitat von Siggy
Delphi-Quellcode:
var
procedure TForm1.FormCreate(Sender: TObject);
begin
edit1.SetFocus; // ein nicht sichtbares oder deaktiviertes Eingabefeld kann nicht den Fokus erhalten!!!
end;


Nein, daran liegt es bestimmt nicht ...
Hier der Abschnitt aus den Unit Forms.pas:
Delphi-Quellcode:
procedure TCustomForm.AfterConstruction; // <-- After Construction ;-)
begin
  if not OldCreateOrder then DoCreate; // Der feuert das Event OnCreate
  if fsActivated in FFormState then
  begin
    Activate;                          // Hier wird alles aktiviert und dann OnActivate gefeuert
    Exclude(FFormState, fsActivated);
  end;
end;
Also beim Event OnCreate sind alle Elemente im Formular erzeugt, aber dort ist halt noch kein Leben.
Erst ab dem ersten Event OnActivate, sind die Elemente aktiviert und dann verstehen wir auch die Fehlermeldung.

cu

Oliver

xZise 14. Nov 2008 15:56

Re: Delphi Zinsrechner
 
Zitat:

Zitat von Sir Rufo
[...]
Zitat:

Zitat von xZise
Das ist auch klar! Wie willst du einem Edit-Feld den Focus geben, wenn es noch gar nicht wirklich "existiert" ?

Das ist leider falsch!
Der Event OnCreate wird _nach_ dem kompletten Erzeugen des Formulars gefeuert.
Sonst würde eine andere Fehlermeldung kommen[...]

Ich möchte darauf hinweisen, dass ICH diesen zitierten Text NICHT geschrieben sondern nur ZITIERT habe. Außerdem steht doch schon in der Fehlermeldung „[...]ein nicht sichtbares Eingabefeld[...]“

Und ist eine Form in OnCreate schon sichtbar? Generell nicht. Deshalb das mit Activate!

MfG
xZise

Sir Rufo 14. Nov 2008 16:25

Re: Delphi Zinsrechner
 
@xZise: you're totally right ... sorry 4 that ...

Siggy 14. Nov 2008 16:28

Re: Delphi Zinsrechner
 
So... Ersteinmal vielen Dank für die vielen Antworten.
Hat mir sehr geholfen muss ich sagen =)


Zitat:

Zitat von Sir Rufo
Zitat:

Zitat von Siggy
Unser Lehrer hat gemeint, ist halt so aber irgendwie kann ic das nicht glauben. Deswegen meine 1. Frage:
Wie kann man das verbessern??

Den Leerkörper wechseln! ... eine andere Möglichkeit sehe ich da nicht ... :stupid:

Mh geht nicht, da unser Lehrer der einzige an der Schule ist der Informatik anbietet.
Bin an nem normalen Gymnasium und wie schon gesagt ist so ne art AG. Ohne den Lehrer würde es gar nicht angeboten werden.


Zitat:

Zitat von Sir Rufo
[...]
Statt
Delphi-Quellcode:
procedure TForm1.FormActivate(Sender: TObject);
begin
  Edit2.SetFocus;
end;
würde ich das eher in OnShow platzieren
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
  Edit2.SetFocus;
end;

Habe das 1. gestern abend noch gelesen und so gemacht. Hat wunderbar funktioniert. Was ist nun der unterschied zwischen:

FormActivate und OnShow ?

Zu meinem 2. Problem:
Das habe ich nun so gelöst:

[code=delphi]
if code = 0 then
begin
Endkapital :=
(Round(100*(Anfangskapital * exp (Jahre * ln (1+ Zinssatz/100))))/100) ; // V erarbeitung
Label2.Caption := FloatToStr (Endkapital)
end //end if code = 0

else // A usgabe
Showmessage ('Eingabefehler:' +#13+
'Variable = Laufzeit' +#13+
'Stelle =' +intToStr(code) +#13+
'Falsches Zeichen=' + Edit3.text
Code:
+#13#13+
               'Bitte Eingabe wiederholen...');
end; //end else
Klappt auch einwandfrei. Mit einer Ausnahme: Es wird mir nur der Fehler angezeigt, wenn bei der Variablen 'Laufzeit' ein Fehler gemacht wurde. Allerdings will ich ja auch,dass wenn jemand bei der Variable 'Anfangskapital' eine falsche Eingabe macht eine Nachricht erhält.

Unser Lehrer hat das so gemacht:

[code=delphi]
begin

try
Anfangskapital := StrToFloat (edit1.text) ;
Laufzeit.SetFocus ;

except
Val (edit1.text, wert, code);
ShowMessage (‘Eingabefehler!’ +#13#13+
'Variable = Anfangskapital' +#13+
'Stelle = ' +IntToStr(code) +#13+
'Falsches Zeichen=' + Edit1.text
Code:
            +#13#13+
        'Bitte Eingabe wiederholen...')

   Edit1.text := ’’ ;     // oder Edit1.clear;
   Shortint(key) := 0 ;    

// EDIT!!!: Hier hat unser Lehrer gemeint, er weiss nicht wieso man das hier reinschreiben muss, damit es funktioniert. Naja ich denke mal dass es hier einige geben wird, die das wissen. Deshalb wäre ich sehr verbunden wenn mir das jemand erklären könnte ;) Also das " ShortInt(key) = 0; " meine ich.

   Edit1.SetFocus;
end;
Und dann einfach auch noch für die Laufzeit das gleiche mit der anderen Variable und dem anderen Editfeld.
Ich finde das allerdings umständlicher als es mit
[delphi]
if code = 0 then
begin
[...]

else

[...]

end;
[/delhpi]
zu machen. Ist es zu kompliziert das bei mir jetz auch noch für die Variable 'Anfangskapital' einzubinden oder kann das ein Anfänger wie ich es bin verstehen?
Falls ja dann wäre ich über weitere Vorschläge sehr dankbar!
Noch einmal vielen Dank an das was bis jetzt vorgeschlangen wurde. Und ich hoffe niemand ist sauer dass ich nicht auf alle Vorschläge eingegangen bin ;)

Mfg Siggy

Sir Rufo 14. Nov 2008 16:37

Re: Delphi Zinsrechner
 
OnShow wird aufgerufen wenn der Befehl Form1.Show ausgeführt wird.
Dieses passiert z.B. automatisch mit dem MainForm wenn die Anwendung startet.
Wird das Formual versteckt (Form1.Hide) oder geschlossen (Form1.Close), dann kann ich es nur mit Form1.Show wieder zeigen und OnShow wird gefeuert.

OnActivate wird immer dann gefeuert, wenn das Formular aktiviert wird. Also man wechselt zu einer anderen Anwendung und wechselt dann wieder zu dieser zurück, schupps wird OnActivate gefeuert.

cu

Oliver

Siggy 14. Nov 2008 16:40

Re: Delphi Zinsrechner
 
Ah ok vielen Dank. Habe verstanden. Hätte ich auch drauf kommen können :D

Siggy

Sir Rufo 14. Nov 2008 16:50

Re: Delphi Zinsrechner
 
[code=delphi]begin

try
Anfangskapital := StrToFloat (edit1.text) ;
Laufzeit.SetFocus ;

except
Val (edit1.text, wert, code);
ShowMessage (‘Eingabefehler!’ +#13#13+
'Variable = Anfangskapital' +#13+
'Stelle = ' +IntToStr(code) +#13+
'Falsches Zeichen=' + Edit1.text
Code:
            +#13#13+
        'Bitte Eingabe wiederholen...')

   Edit1.text := ’’ ;     // oder Edit1.clear;
   Shortint(key) := 0 ;    

// EDIT!!!: Hier hat unser Lehrer gemeint, er weiss nicht wieso man das hier reinschreiben muss, damit es funktioniert. Naja ich denke mal dass es hier einige geben wird, die das wissen. Deshalb wäre ich sehr verbunden wenn mir das jemand erklären könnte ;) Also das " ShortInt(key) = 0; " meine ich.

   Edit1.SetFocus;
end;
Sagte ich schon mal was zum Lehrer tauschen ... (Hildesheimer, da vergisst man nur die Hälfte) ...

Also ein try except end nehme ich eigentlich nur dann, wenn ich vorher keine Chance habe zu prüfen, ob denn auch alles richtig laufen wird (z.B. Abfrage eines Datenbank-Servers, der könnte während der Abfrage auch abrauchen)

Für diesen speziellen Fall würde ich aber wie folgt prüfen
Delphi-Quellcode:
if ( StrToFloatDef( Edit1.Text, -1 ) < 0 )
then
  begin
    ShowMessage( '' );
    ...
  end;
und schöne Grüße an den Lehrer, ist wie im Deutsch, da gibt es Duden, das mich auch ganz doll helft ...

cu

Oliver

Ginko 14. Nov 2008 16:57

Re: Delphi Zinsrechner
 
Zitat:

Es wird mir nur der Fehler angezeigt, wenn bei der Variablen 'Laufzeit' ein Fehler gemacht wurde
Es wird mit der Abfrage If code = 0 abgefragt ob ein Fehler
bei der Umwandlung von dem Text im Edit1 Feld in eine Zahl gemacht wurde.

Der Ausdruck 'Varible = Laufzeit' ist ein String, also feststehend

[EDIT] Ach er meint wohl damit die Varible, der der Wert aus dem Edit Feld zugewiesen wurde. Ich hab es unten mal angepasst.

Ich glaube ich bin jetzt etwas verwirrt :spin2:


Jedenfalls solltest du bei 2 Edit Feldern auch zwei unterschiedliche Fehlercodes benutzen also das ganze sollte ungfähr so aussehen:

[code=delphi]
var
Form1: TForm1;
code,code2: Integer;
[.....]


procedure TForm1.Button1Click(Sender: TObject);
begin
try
val (edit1.text, anfangskapital, code); // E ingabe
val (edit3.text, Jahre, code2);
[.....]


if (code = 0) and (code2 = 0) then
begin
Endkapital :=
(Round(100*(Anfangskapital * exp (Jahre * ln (1+ Zinssatz/100))))/100) ;
Label2.Caption := FloatToStr (Endkapital)
end //end if code = 0

else Showmessage
('Eingabefehler:'+#13+
'Variable = Anfangskapital' +#13+
'Stelle im ersten Eingabefeld =' +FloatToStr(code) +#13+
'Variable = Jahre' +#13+
'Stelle im zweiten Eingabefeld =' +FloatToStr(code2) +#13+
'Falsches Zeichen im ersten Eingabefeld=' + Edit1.text
Code:
+#13+
               'Falsches Zeichen im zweiten Eingabefeld=' + Edit3.text[code2]+#13+
               'Bitte Eingabe wiederholen...');
end;
Vielleicht hilft dir das etwas, es ist natürlich noch ausbaufähig ...

Namenloser 14. Nov 2008 17:00

Re: Delphi Zinsrechner
 
Zitat:

Zitat von Sir Rufo
Für diesen speziellen Fall würde ich aber wie folgt prüfen
Delphi-Quellcode:
if ( StrToFloatDef( Edit1.Text, -1 ) < 0 )
then
  begin
    ShowMessage( '' );
    ...
  end;

Dann doch lieber Delphi-Referenz durchsuchenTryStrToInt :wink:

Sir Rufo 14. Nov 2008 17:05

Re: Delphi Zinsrechner
 
Zitat:

Zitat von NamenLozer
Dann doch lieber Delphi-Referenz durchsuchenTryStrToInt :wink:

wenn ich einen Float-Wert haben möchte ... :gruebel:

Ginko 14. Nov 2008 17:34

Re: Delphi Zinsrechner
 
Ach und die Fehlerabfrage sollt gleich zu anfag beginnen und nicht wenn schon mit Werten
gerechnet wurde, also so:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
    begin
    try
    val (edit1.text, anfangskapital, code);     // Eingabe
    val (edit3.text, Jahre, code2);
   
    if (code = 0) and (code2 = 0) then
     begin
     if Jahre <=4 then
       begin
         Zinssatz := 3;
         Label4.Caption := 'mit einem Zinssatz von 3%';
       end
[............]

Namenloser 14. Nov 2008 18:10

Re: Delphi Zinsrechner
 
Zitat:

Zitat von Sir Rufo
Zitat:

Zitat von NamenLozer
Dann doch lieber Delphi-Referenz durchsuchenTryStrToInt :wink:

wenn ich einen Float-Wert haben möchte ... :gruebel:

Sorry, da hab ich mich wohl verlesen. Ich gehe aber mal davon aus, dass eine entsprechende Funktion auf für Floats existiert. (oder?)

Siggy 15. Nov 2008 11:38

Re: Delphi Zinsrechner
 
Liste der Anhänge anzeigen (Anzahl: 1)
So ich bins mal wieder =)

Habe jetz zuerst mal das hier probiert, da es mir am einfachsten erschien:

[code=delphi]
var
Form1: TForm1;
code: Integer;
code2: Integer;
Anfangskapital: Integer;
Jahre: Integer;
Endkapital: real;
Zinssatz : real;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
try
val (edit1.text, anfangskapital, code); // E ingabe
val (edit3.text, Jahre, code2);

if (code = 0) and (code2 = 0) then
begin
if Jahre <=4
then
begin
Zinssatz := 3;
Label4.Caption :=
'mit einem Zinssatz von 3%';
end //end Jahre <=4

else
begin
Zinssatz := 5;
Label4.Caption :=
'mit einem Zinssatz von 5%' ;
end; //end Jahre >4

if Jahre >= 10
then
begin
Zinssatz := 7 ;
Label4.Caption :=
'mit einem Zinssatz von 7%' ;
end; //end Jahre >= 10

begin
Endkapital :=
(Round(100*(Anfangskapital * exp (Jahre * ln (1+ Zinssatz/100))))/100) ; // V erarbeitung
Label2.Caption := FloatToStr (Endkapital)
end //end if code = 0
end

else // A usgabe
MessageDlg ('Eingabefehler:' +#13#13+
'Variable = Anfangskapital' +#13+
'Stelle im ersten Eingabefeld = ' +intToStr(code) +#13#13+
'Variable = Laufzeit' +#13+
'Stelle im zweiten Eingabefeld = ' +intToStr(code2) +#13#13+
'Falsches Zeichen im ersten Eingabefeld = ' + Edit1.text
Code:
+#13+
               'Falsches Zeichen im zweiten Eingabefeld = ' + Edit3.text [code2]+#13#13+
               'Bitte Eingabe wiederholen...' +#13+
               'Nur ganze Zahlen (0-9) erlaubt!',
               mtWarning,[mbOK],0);
except
MessageDlg ('Felder dürfen nicht leer sein!'+#13+
             'Falls alle Felder ausgefüllt wurden bitte kleinere Werte benutzen',mtWarning,[mbOk],0);
end;//end try - except

end;//end procedure
Also das mit den 2 Codes. Habe dann aber als ich die .exe gestartet hab feststellen müssen, dass es bis jetzt nicht die beste Lösung ist.

Es gibt leider das Problem, dass wenn NUR im Edit3 Feld ein Fehler auftritt und im Edit1 alles i.O. ist, dann wird nicht angezeigt wo der Fehler in Feld3 liegt.
Ist jetz n bisschen kompliziert, deswegen hänge ich mal die .exe an.
Ausserdem wird der letzte Teil der Fehlermeldung

Delphi-Quellcode:
               'Bitte Eingabe wiederholen...' +#13+
               'Nur ganze Zahlen (0-9) erlaubt!',
auch nur dann angezeigt, wenn in beiden Edit Feldern ein Fehler gemacht wurde.
Ihr könnt euch das ja mal anscheun, falls jemand Zeit dazu findet. Is ja auch nicht unbedingt das wichtigste.
Werde mich dann auch mal an den anderen 2 Vorschlägen versuchen wenn ich Zeit dazu finde und die Vorschläge verstehe :-D

Mfg Siggy

[edit=Admin]Beitragscache aktualisiert. Mfg, Daniel[/edit]

DeddyH 15. Nov 2008 11:52

Re: Delphi Zinsrechner
 
Tätige die Fehlermeldungen doch dann, wenn die Fehler auch auftreten.
Delphi-Quellcode:
val(edit1.text, anfangskapital, code);
if code <> 0 then
  MessageBox(0,'Fehlerhafte Eingabe in Edit1',nil,0)
else
  begin
    val(edit3.text, Jahre, code2);
    if code <> 0 then
      MessageBox(0,'Fehlerhafte Eingabe in Edit3',nil,0);
  end;
So in etwa, möglich wäre auch Zwischenspeichern der Fehler und Ausgabe am Ende, das kann man recht variabel handhaben.

Siggy 15. Nov 2008 13:12

Re: Delphi Zinsrechner
 
Zitat:

Zitat von DeddyH
Tätige die Fehlermeldungen doch dann, wenn die Fehler auch auftreten.
Delphi-Quellcode:
val(edit1.text, anfangskapital, code);
if code <> 0 then
  MessageBox(0,'Fehlerhafte Eingabe in Edit1',nil,0)
else
  begin
    val(edit3.text, Jahre, code2);
    if code &lt;&gt; 0 then
      MessageBox(0,'Fehlerhafte Eingabe in Edit3',nil,0);
  end;
So in etwa, möglich wäre auch Zwischenspeichern der Fehler und Ausgabe am Ende, das kann man recht variabel handhaben.


Der Tipp hat mir entscheidend weiter geholfen :-D
Vielen Dank.
Ich denke ich dürfte soweit fertig sein. Zum Abschluß noch der komplette Code:

[code=delphi]
var
Form1: TForm1;
code: Integer;
code2: Integer;
Anfangskapital: Integer;
Jahre: Integer;
Endkapital: real;
Zinssatz : real;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin

try
val (edit1.text, anfangskapital, code); // E ingabe
val (edit3.text, Jahre, code2); // E ingabe

if (code <>0) and (code2 <> 0) then
begin
MessageDlg ('Eingabefehler:' +#13#13+
'Variable = Anfangskapital' +#13+
'Stelle des Fehlers = ' +intToStr(code) +#13#13+
'Falsches Zeichen = ' + Edit1.text [code]+#13#13#13+
'Variable = Laufzeit' +#13+
'Stelle des Fehlers = ' +intToStr(code2) +#13#13+
'Falsches Zeichen = ' + Edit3.text [code2]+#13#13+
'Bitte Eingabe wiederholen...' +#13+
'Nur ganze Zahlen (0-9) erlaubt!',
mtWarning,[mbOK],0)
end //end if code <> 0 and code2 <>0 then

else if code <> 0 then

MessageDlg ('Eingabefehler:' +#13#13+
'Variable = Anfangskapital' +#13+
'Stelle des Fehlers = ' +intToStr(code) +#13#13+
'Falsches Zeichen = ' + Edit1.text
Code:
+#13#13+
               'Bitte Eingabe wiederholen...' +#13+
               'Nur ganze Zahlen (0-9) erlaubt!',
               mtWarning,[mbOK],0)

else if code2 <> 0 then

    MessageDlg ('Eingabefehler:' +#13#13+
               'Variable = Laufzeit' +#13+
               'Stelle des Fehlers = ' +intToStr(code2) +#13#13+
               'Falsches Zeichen = ' + Edit3.text [code2]+#13#13+
               'Bitte Eingabe wiederholen...' +#13+
               'Nur ganze Zahlen (0-9) erlaubt!',
               mtWarning,[mbOK],0)


else if (code = 0) and (code2 = 0) then

begin
if Jahre <=4
then
  begin
      Zinssatz := 3;
      Label4.Caption :=
      'mit einem Zinssatz von 3%';
  end //end Jahre <=4

else
  begin
      Zinssatz := 5;
      Label4.Caption :=
      'mit einem Zinssatz von 5%' ;
  end; //end Jahre >4

if Jahre >= 10
  then
    begin
      Zinssatz := 7 ;
      Label4.Caption :=
      'mit einem Zinssatz von 7%' ;
    end; //end Jahre >= 10

begin
    Endkapital :=
    (Round(100*(Anfangskapital * exp (Jahre * ln (1+ Zinssatz/100))))/100) ;
    Label2.Caption := FloatToStr (Endkapital)
end
end //end if code = 0 and code2 = 0 then

except
MessageDlg ('Felder dürfen nicht leer sein!'+#13+
             'Falls alle Felder ausgefüllt wurden bitte kleinere Werte benutzen',mtWarning,[mbOk],0);
end;//end try - except

end;//end procedure



procedure TForm1.Button2Click(Sender: TObject);
begin
Edit1.Text := ('');
Edit3.Text := ('');
Label2.Caption := 'Endkapital';
Label4.Caption := 'Zinssatz';
edit1.SetFocus ;
edit1.color := clyellow;
end; // end button2click

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
begin
edit3.SetFocus;
edit3.Color := clyellow;
edit1.Color := clwhite;
end;
end;

procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
begin
Button1.Click;
edit3.Color := clwhite;
end;
end;


procedure TForm1.FormShow(Sender: TObject);
begin
edit1.SetFocus;
edit1.Color := clyellow;
end;

end.
Noch einmal vielen Dank! Wird bestimmt nicht meine letzte Frage gewesen sein :wink:

Mfg Siggy


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 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