![]() |
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:
Ziel ist es (soweit ich weiss) dass wenn man eine falsche Eingabe macht, zum Beispiel bei Jahre: 1a2x
+#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. , 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 |
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:
Die Messages nach except werden ja glaubig nur beim arbeiten mit der .exe angezeigt.
+#13#13+
'Bitte Eingabe wiederholen...'); 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... |
Re: Delphi Zinsrechner
Zitat:
Lösung:
Delphi-Quellcode:
Zur zweiten Frage sagt mir die Delphi-Hilfe folgendes:
procedure TForm1.FormActivate(Sender: TObject);
begin Edit2.SetFocus; end;
Delphi-Quellcode:
Val unterstützt bereits eine Fehlerbehandlung, daher ist ein Try-Except-Block absolut überflüssig. ;)
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; |
Re: Delphi Zinsrechner
Zitat:
Delphi-Quellcode:
Übrigens ist es sinnvoll seine Codezeilen einzurücken.
OnActivate := nil;
MfG xZise |
Re: Delphi Zinsrechner
Zitat:
Zitat:
Der Event OnCreate wird _nach_ dem kompletten Erzeugen des Formulars gefeuert. Sonst würde eine andere Fehlermeldung kommen Statt
Delphi-Quellcode:
würde ich das eher in OnShow platzieren
procedure TForm1.FormActivate(Sender: TObject);
begin Edit2.SetFocus; end;
Delphi-Quellcode:
und wenn das wirklich ausschließlich nach dem Erzeugen passieren soll, dann einen Timer nehmen, den Interval auf 1 setzen und
procedure TForm1.FormShow(Sender: TObject);
begin Edit2.SetFocus; end;
Delphi-Quellcode:
cu
procedure TForm1.Timer1Timer(Sender: TObject);
begin if Sender is TTimer then TTimer( Sender ).Enabled := False; Edit2.SetFocus; end; Oliver [edit]sorry xZise, da habe ich wohl beim Zitieren zuviel weggelöscht[/edit] |
Re: Delphi Zinsrechner
Zitat:
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:
mfg Michael |
Re: Delphi Zinsrechner
Zitat:
|
Re: Delphi Zinsrechner
@Luckie: ok ... :-) ... aber es tut auf jeden Fall :mrgreen:
Zitat:
Hier der Abschnitt aus den Unit Forms.pas:
Delphi-Quellcode:
Also beim Event OnCreate sind alle Elemente im Formular erzeugt, aber dort ist halt noch kein Leben.
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; Erst ab dem ersten Event OnActivate, sind die Elemente aktiviert und dann verstehen wir auch die Fehlermeldung. cu Oliver |
Re: Delphi Zinsrechner
Zitat:
Und ist eine Form in OnCreate schon sichtbar? Generell nicht. Deshalb das mit Activate! MfG xZise |
Re: Delphi Zinsrechner
@xZise: you're totally right ... sorry 4 that ...
|
Re: Delphi Zinsrechner
So... Ersteinmal vielen Dank für die vielen Antworten.
Hat mir sehr geholfen muss ich sagen =) Zitat:
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:
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:
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.
+#13#13+
'Bitte Eingabe wiederholen...'); end; //end else 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:
Und dann einfach auch noch für die Laufzeit das gleiche mit der anderen Variable und dem anderen Editfeld.
+#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; 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 |
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 |
Re: Delphi Zinsrechner
Ah ok vielen Dank. Habe verstanden. Hätte ich auch drauf kommen können :D
Siggy |
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:
Sagte ich schon mal was zum Lehrer tauschen ... (Hildesheimer, da vergisst man nur die Hälfte) ...
+#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; 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:
und schöne Grüße an den Lehrer, ist wie im Deutsch, da gibt es Duden, das mich auch ganz doll helft ...
if ( StrToFloatDef( Edit1.Text, -1 ) < 0 )
then begin ShowMessage( '' ); ... end; cu Oliver |
Re: Delphi Zinsrechner
Zitat:
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:
Vielleicht hilft dir das etwas, es ist natürlich noch ausbaufähig ...
+#13+
'Falsches Zeichen im zweiten Eingabefeld=' + Edit3.text[code2]+#13+ 'Bitte Eingabe wiederholen...'); end; |
Re: Delphi Zinsrechner
Zitat:
![]() |
Re: Delphi Zinsrechner
Zitat:
|
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 [............] |
Re: Delphi Zinsrechner
Zitat:
|
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:
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.
+#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 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:
auch nur dann angezeigt, wenn in beiden Edit Feldern ein Fehler gemacht wurde.
'Bitte Eingabe wiederholen...' +#13+
'Nur ganze Zahlen (0-9) erlaubt!', 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] |
Re: Delphi Zinsrechner
Tätige die Fehlermeldungen doch dann, wenn die Fehler auch auftreten.
Delphi-Quellcode:
So in etwa, möglich wäre auch Zwischenspeichern der Fehler und Ausgabe am Ende, das kann man recht variabel handhaben.
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; |
Re: Delphi Zinsrechner
Zitat:
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:
Noch einmal vielen Dank! Wird bestimmt nicht meine letzte Frage gewesen sein :wink:
+#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. Mfg Siggy |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 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