AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Key-Code Ziffer Null

Ein Thema von TomyN · begonnen am 27. Jan 2021 · letzter Beitrag vom 28. Jan 2021
Antwort Antwort
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
124 Beiträge
 
Delphi 10.3 Rio
 
#1

Key-Code Ziffer Null

  Alt 27. Jan 2021, 15:30
Manchmal passieren seltsame Sachen.

Ich habe in meiner Software eine Art Taschenrechner, bei der entweder mit Tasten oder über die Tastatur Zahlen eingegeben werden können.
Eigentlich trivial, die Hauptarbeit passiert hier

Code:
 case key of
      ord('0'), VK_NUMPAD0: AddChar('0');
      ord('1')..ord('9'): AddChar(Char(key));
      VK_NUMPAD1: AddChar('1');
      VK_NUMPAD2: AddChar('2');
      VK_NUMPAD3: AddChar('3');
      VK_NUMPAD4: AddChar('4');
      VK_NUMPAD5: AddChar('5');
      VK_NUMPAD6: AddChar('6');
      VK_NUMPAD7: AddChar('7');
      VK_NUMPAD8: AddChar('8');
      VK_NUMPAD9: AddChar('9');

      VK_BACK:   ResetMe();
      VK_DELETE: RemoveChar();
      VK_ESCAPE: HideMe();
      VK_RETURN: HideMe();
    end;
AddChar wertet das ganze aus.

Bei mir läuft es wunderbar, jetzt hat sich aber eine Kunde aus China gemeldet, bei dem alle Eingaben, bis auf die Ziffer 0 funktionieren. Die 0 funktioniert nicht, weder über die virtuelle Taste noch über die 0 auf der Tastatur (Num-pad hat er keines). Jetzt habe ich ihm ein kleines Programm geschrieben, dass die key-codes in ein Memo loggt. Da liefert die Ziffer Numm immer $00 30, wie auch bei mir. Irgendeine Idee, woran das liegen könnte?

Tomy
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
39.422 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Key-Code Ziffer Null

  Alt 27. Jan 2021, 15:55
Bist du denn sicher, dass dein AddChar richtig funktioniert?

Nja, ein Logging im "richtigen" Programm bringt wohl mehr.
Eventuell, fängt irgendeine andere Komponente/Funktion die 0 ab und sie kommt garnicht erst in deiner EventMethode an?
Dass "einfache" minimalistische Testprogramme manchmal/oftmals ein klein bissl anders arbeiten/reagieren, als wie ein hochkomplexes Programm, wo sehr viel Code/Komponenen drin arbeiten, das könnte man sich vielleicht denken.

PS:
Warum ist die 0 denn hier anders behandetl, als wie alle Anderen?
Delphi-Quellcode:
case key of
  ord('0')..ord('9'): AddChar(Char(key));
  VK_NUMPAD0: AddChar('0');
  VK_NUMPAD1: AddChar('1');
  VK_NUMPAD2: AddChar('2');
  VK_NUMPAD3: AddChar('3');
  VK_NUMPAD4: AddChar('4');
  VK_NUMPAD5: AddChar('5');
  VK_NUMPAD6: AddChar('6');
  VK_NUMPAD7: AddChar('7');
  VK_NUMPAD8: AddChar('8');
  VK_NUMPAD9: AddChar('9');
  VK_BACK: ResetMe();
  VK_DELETE: RemoveChar();
  VK_ESCAPE: HideMe();
  VK_RETURN: HideMe();
end;
Wobei, wenn schon '0'..'9' zusammen, warum dann nicht auch VK_NUMPAD0..VK_NUMPAD9
Delphi-Quellcode:
case Key of
  Ord('0')..Ord('9'): AddChar(Char(Key));
  VK_NUMPAD0..VK_NUMPAD9: AddChar(Char(Key - VK_NUMPAD0 + Ord('0')));
  VK_BACK: ResetMe();
  VK_DELETE: RemoveChar();
  VK_ESCAPE, VK_RETURN: HideMe();
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (27. Jan 2021 um 17:36 Uhr)
  Mit Zitat antworten Zitat
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
124 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Key-Code Ziffer Null

  Alt 27. Jan 2021, 16:28
Nun ja, auch wenn ich es nicht müsste, hier meine 'Verteidigungsrede'.

Die Null wird extra behandelt, weil ursprünglich eine Sonderbehandlung der Null geplant war (diese ist aber noch nicht realisiert). So soll zum Beispiel eine 'Doppelnull' am Anfang des Strings vermieden werden.

In meinen Augen ist der Vorteil der Verwendung von benannten Konstanten der, dass man sich bei einer Änderung der Zahlenwerte keine Gedanken machen, bzw. nur die Definition ändern muss. Daher verlasse ich mich ungern auf Annahmen (wobei die Annahme, dass VK_NUMPAD_0 bis VK_NUMPAD_9 ohne Zwischenraum und in aufsteigender Reihenfolge definiert sind und immer bleiben werden, doch recht wahrscheinlich ist) über eine Reihenfolge oder eines Absolutwertes einer benannten Konstante.

Tomy
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Key-Code Ziffer Null

  Alt 28. Jan 2021, 14:32
Da wäre ggf. die Auswertung deines "AddChar" interessant, wenn die "0" dort richtig ankommt, muss der Fehler ja da drinnen passieren.
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
124 Beiträge
 
Delphi 10.3 Rio
 
#5

Problem gefunden - Frage zu RegEx

  Alt 28. Jan 2021, 17:28
Ja.... wenn man sich auf den Kunden verlässt. Das Problem lag nicht an der Null sondern dran, dass keine zweite Ziffer möglich war. Er hat nur immer versucht eine Null einzugeben.

Ansonsten bleibt mir das ganze immer noch etwas rätselhaft. Ich bin mit Regulären Ausdrücken nicht so vertraut und wollte es mal versuchen. Der Zweck war, zu erkennen wenn ein zweites Mal ein Dezimaltrenner eingegeben wird und das zu verhindern.

Code:
 i:= TRegEx.Matches(myValueString, formatSettings.DecimalSeparator).Count;
 if (i > 1) then begin
   //Wir haben zwei DS...
   SetLength(myValueString, Pred(Length(myValueString)));
 end;
Allderdings war i beim Kunden immer zwei, wenn der String 2 Zeichen lang wurde, so dass er immer gekürzt wurde. Bei mir gab es keinerlei Probleme.

Tomy
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de

Geändert von TomyN (28. Jan 2021 um 17:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
39.422 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Key-Code Ziffer Null

  Alt 28. Jan 2021, 18:44
Kann man den Punkt nur am Ende eingeben?

Also Grundsätzlich ist es einfacher "Ungültiges" garnicht erst ins Edit reinkommen zu lassen.
-> Wenn Key='.' und ein Punkt bereits vorhanden, dann Key:=0; (eventuell das Ganze bereits im OnKeyDown, anstatt im OnKeyPress)



PS: Sobald das Edit nicht ReadOnly/Disabled ist und die Eingaben ausschließlich durch deinen Code in der Anzeige landen:

Im Notpade den Text "....." mit Strg+C abholen
und dann via Strg+V, Shift+Einfg, Kontextmenü oder sonstwie in dein Edit rein.

Schon hast du viele Punkte und dein "bei . prüfen ob schon vorhanden" hat nix mitbekommen.
Im OnChange könnte man sowas zusätzlich/sichrer prüfen und dann das "Böse" rauslöschen.
Alternativ im OnChange nur Prüfen und das Edit nur "rot" malen, und eine Fehlermeldung/Exception erst bei anschließender Verarbeitung, um den Eingabefluss nicht zu stören.



Ach ja, statt RegEx hier eher ein Delphi-Referenz durchsuchenTStringHelper.CountChar
oder die "billige" alte Variante ala Anzahl := Length(myValueString) - Length(ReplaceStr(myValueString, '.', ''));
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
124 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Key-Code Ziffer Null

  Alt 28. Jan 2021, 18:48
Hallo,

Welches Edit siehst Du denn? Ich fange die Tastendrücke ab und bastel mir den String indem ich das zuletzt eingegebene Zeichen hinten anhänge. Reinkommen da nur die Zahlen sowie der Decimalseparator.

Tomy
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 05:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf