AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi Zinsrechner

Ein Thema von Siggy · begonnen am 13. Nov 2008 · letzter Beitrag vom 15. Nov 2008
Antwort Antwort
Seite 1 von 3  1 23      
Siggy

Registriert seit: 25. Okt 2008
20 Beiträge
 
#1

Delphi Zinsrechner

  Alt 13. Nov 2008, 17:28
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
  Mit Zitat antworten Zitat
Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Delphi Zinsrechner

  Alt 13. Nov 2008, 18:09
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...
  Mit Zitat antworten Zitat
Benutzerbild von Marc.
Marc.

Registriert seit: 14. Mär 2008
Ort: Aachen
22 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Delphi Zinsrechner

  Alt 13. Nov 2008, 18:19
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.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Delphi Zinsrechner

  Alt 13. Nov 2008, 21:11
Zitat von Marc.:
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:

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

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

Re: Delphi Zinsrechner

  Alt 13. Nov 2008, 23:29
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 ...

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]
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Michael Habbe
Michael Habbe

Registriert seit: 10. Aug 2005
264 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Delphi Zinsrechner

  Alt 14. Nov 2008, 01:04
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

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 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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Delphi Zinsrechner

  Alt 14. Nov 2008, 09:53
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

Re: Delphi Zinsrechner

  Alt 14. Nov 2008, 10:32
@Luckie: ok ... ... aber es tut auf jeden Fall

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 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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#9

Re: Delphi Zinsrechner

  Alt 14. Nov 2008, 16:56
Zitat von Sir Rufo:
[...]
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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

Re: Delphi Zinsrechner

  Alt 14. Nov 2008, 17:25
@xZise: you're totally right ... sorry 4 that ...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:17 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