Delphi-PRAXiS
Seite 1 von 3  1 23      

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 ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:31 Uhr.
Seite 1 von 3  1 23      

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