[gelöst]Hilfe: Hartnäckiger Bug in meinem Programm

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

[gelöst]Hilfe: Hartnäckiger Bug in meinem Programm

Beitrag von Marsmännchen »

Hi,

normalerweise gehe ich davon aus, dass man seine Programme selbst entwanzt, aber an diesem Bug knobel ich jetzt schon 2-3 Tage rum. Das Projekt hier ist ein ganz banaler Taschenrechner. Er verarbeitet unter anderem natürlich Tastatureingaben (dabei habt ihr mir schon geholfen, wer nachsehen will: http://www.lazarusforum.de/viewtopic.php?f=55&t=9517).
Meine Rechenroutine läuft noch nicht ganz rund (eine Macke ist mir schon klar geworden), aber mein derzeitiges Hauptproblem ist die Tastatureingabe. Wenn ich auf Enter haue, dann soll die Ergebnisberechnung angestoßen werden. Wird sie auch, aber unmittelbar, nachdem das Ergebnis angezeigt wird, fügt das Prog der Anzeige noch eine "1" hinzu. Wenn man dann erneut Enter drückt, dann fügt es wieder eine "1" an. Wenn man die Ergebnisberechnung mit '=' anstößt (was auch zulässig ist), passiert das nicht. Es liegt also eindeutig an der Verarbeitung der Entertaste.
Der Witz ist: Wenn ich die kompilierte Version meines Rechners starte, dann zeigt sich dieses Verhalten immer. Wenn ich das Programm im Debugmodus durchlaufe, passiert es manchmal, manchmal nicht. Ich habe schon alles mit Einzeldurchlauf und Breakpoints abgegrast, ich finde die Stelle nicht, die dafür verantwortlich ist. Vielleicht habe ich ja nur ein Brett vor dem Kopf. Bitte schaut doch mal nach, ob ihr was seht. Hier sind die verdächtigen Prozeduren (das Projekt hänge ich auch noch als Zip an):

Code: Alles auswählen

procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
begin
  case Key of
    #8: Rechner.EingabeLoeschen;
    'c', 'C',#27: Rechner.Zuruecksetzen;
  else
    Rechner.EingabeAnfuegen(Key);
  end;
  Key:=#0;
end;        

Code: Alles auswählen

procedure TRechner.EingabeAnfuegen(zeichen: char);
begin
 
   if (IstKorrekteEingabe(zeichen)) then
     begin
       if (zeichen = '=') or (zeichen = #13) then
         begin
           BerechneErgebnis;
           Exit;
         end;
       if (FEingabepuffer = '0') then
         begin
           FEingabepuffer:=zeichen;
           FIstErgebnis:=false;
         end
       else
         FEingabepuffer:= FEingabepuffer + zeichen;
     (* Klammern zählen! *)
     if zeichen = '(' then Inc(FOffeneKlammern);
     if zeichen = ')' then Dec(FOffeneKlammern);
     FAusgabeText:=FEingabepuffer;
     { TODO : Hier noch Eingabepuffer in Zahl umwandeln, wenn Ausdruck eine Zahl ist und an FAusgabeZahl übergeben }
     AusgabeBeobachterInformieren;;
     end;
end;             
Wahrscheinlich müsste ich jetzt noch ein paar Routinen anhängen, die da auch mit reinspielen, aber dann wird der Post hier zu lang. Schaut ggf. in das Projekt. Vermutlich seht ihr noch andere Macken: wie ich schon sagte, ich bin mit dem Kammerjägern noch nicht fertig.
Dateianhänge
Taschenrechner.zip
(6.28 KiB) 51-mal heruntergeladen
Zuletzt geändert von Marsmännchen am So 13. Mär 2016, 21:02, insgesamt 1-mal geändert.
Ich mag Pascal...

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Hilfe: Hartnäckiger Bug in meinem Programm

Beitrag von Socke »

Marsmännchen hat geschrieben:Meine Rechenroutine läuft noch nicht ganz rund (eine Macke ist mir schon klar geworden), aber mein derzeitiges Hauptproblem ist die Tastatureingabe. Wenn ich auf Enter haue, dann soll die Ergebnisberechnung angestoßen werden. Wird sie auch, aber unmittelbar, nachdem das Ergebnis angezeigt wird, fügt das Prog der Anzeige noch eine "1" hinzu. Wenn man dann erneut Enter drückt, dann fügt es wieder eine "1" an. Wenn man die Ergebnisberechnung mit '=' anstößt (was auch zulässig ist), passiert das nicht. Es liegt also eindeutig an der Verarbeitung der Entertaste.
Könnte es sein, dass die Taste "1" den Fokus hat und bei einem Enter zuerst die Berechnung durchgeführt wird und danach ein "Click" auf die "1" ausgeführt wird?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

Re: Hilfe: Hartnäckiger Bug in meinem Programm

Beitrag von Marsmännchen »

Socke hat geschrieben:Könnte es sein, dass die Taste "1" den Fokus hat und bei einem Enter zuerst die Berechnung durchgeführt wird und danach ein "Click" auf die "1" ausgeführt wird?
Ich hab jetzt mal folgendes probiert: Wenn das KeyPress-Event verarbeitet wird, setzte ich zum Schluss den Focus auf einen der Buttons meines Gui. Mein Problem ist jetzt weg :D !
Danke Mann, darauf wäre ich echt nicht gekommen.
Ich mag Pascal...

Antworten