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;