Autor |
Beitrag |
chris11
Hält's aus hier
Beiträge: 2
|
Verfasst: So 16.04.06 12:38
Hallo Leute,
ich habe folgendes Problem, ich habe ein Edit Feld in dem der Benutzer des Programms eine Zahl zwischen 2 und 10 eingeben kann (Real). Diese Zahl wird durch ein Timer Ereignis im Sekundentakt abgefragt. Damit das Programm nicht aussteigt wenn der Benutzer mal einen Buchstaben eingibt, hab ich es soweit das ich die Felder für alle Tasten gesperrt habe außer den Zahlentasten.
Da ich für Real Werte aber auch noch die Komma Taste benötige habe ich die auch Freigegeben, damit stellt sich aber schon das nächste Problem, denn wenn der Benutzer zwei Kommas eingibt steigt das Programm ja auch schon wieder mit einer Fehlermeldung aus. Dann habe ich den Schritt gemacht, dass nach einmaliger Eingabe des Kommas auch diese gesperrt ist, dann ist es aber auch nicht mehr möglich bei Änderung der Zahl wieder ein Komma einzugeben. Meine Überlegung ging dann dahin das ich die „Entfernen“ Taste Abfrage und sobald der alte Wert damit gelöscht ist auch das Komma wieder Frei ist. Doch z.Zt. kann ich diese Taste gar nicht abfragen, eigentlich sollte dies doch gehen über: if key = chr (127) then …
Hab anstatt der 127 für Entfernen mal die 32 für die Leertaste eingefügt, damit geht’s dann.
Selbst wenn es funktionieren würde die Entfernen Taste abzufragen, kommt schon wieder das nächste Problem: Da das Programm jede Sekunde überprüft ob der Wert verändert wurde, würde auch wieder eine Fehlermeldung kommen wenn der Benutzer kurz dass Feld gelöscht hat (mit Entfernen), somit wäre das Feld lehr und das Programm kann keine gültige Real Zahl lesen.
Könnt ihr mir bitte weiterhelfen!? Das sollte doch eigentlich ein Alltägliches Problem sein, denn ich hab noch kein Programm gesehen das sich verabschiedet wenn der Benutzer mal was Falsches eingegeben hat. Es würde ja schon reichen wenn der Benutzer eine Meldung bekommt das er was Falsches eingegeben hat, aber so weit kann es ja durch die zyklische Abfragung des Programms gar nicht mehr kommen.
Freue mich über jede Hilfe
Gruß Moderiert von raziel: Topic aus Sonstiges (Delphi) verschoben am Mi 19.04.2006 um 11:38
|
|
DelphiAnfänger
      
Beiträge: 112
Win XP, Firefox 2.0, IE6
Delphi 5 Prof., Delphi 2005 PE
|
Verfasst: So 16.04.06 13:02
guck mal in die Delphi Hilfe unter "try...except"
|
|
hkk
      
Beiträge: 64
Win XP Pro, Win ME, openSUSE 10.2, Ubuntu 7.xx; Firefox 2 (en-US)
D7 Pers, D3 Prof
|
Verfasst: So 16.04.06 13:58
ja, die try..except anweisung ist dafür die treffendste.
aber warum fragst du die eingabe jede sekunde ab? ist das wirklich nötig?
Nun ja, vielleicht ist es das.
Übrigens würde ich dann bei solch schnellen Zyklen keine Meldung bringen (etwa mit ShowMessage), wenn ein Fehler auftritt, sondern ein Label in Sichtweite (z.B. unter dem Edit) platzieren und dort einen Text ausgeben, wenn etwas nicht stimmt, z.B. "Fehler bei Zahleneingabe! Bitte korrigieren"
~HKK
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 16.04.06 14:02
Für diesen Fall würd ich Dir TryStrToFloat empfehlen .... Ein allgemeines Try...Except ist schlechter Stil ...
Außerdem solltest Du keinen Timer nehmen, sondern das OnChange-Ereignis des Edits.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Blawen
      
Beiträge: 616
Erhaltene Danke: 33
Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
|
Verfasst: So 16.04.06 15:17
BenBE hat folgendes geschrieben: | Für diesen Fall würd ich Dir TryStrToFloat empfehlen .... Ein allgemeines Try...Except ist schlechter Stil ... |
TryStrToFloat ist erst bei neueren Delphi Versionen dabei
Wieso soll es ein schlechter Stil sein? Schlussendlich macht es ja auch nichts anderes als ein einfaches Try...StrToFloat...Except. Oder?
Wie wäre folgender Ansatz:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| Function TesteNumerischeEingabe(e : TEdit) : Boolean;
var s : String; r : Real;
begin try s := e.Text; StrToFloat(s); r := StrToCurr(s); s := FormatFloat('0.00',r) e.Text := s; Result := True; except Showmessage('Die Eingabe ist ungültig!'); Result := False; end; end; |
_________________ Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro
Zuletzt bearbeitet von Blawen am Sa 22.04.06 16:39, insgesamt 1-mal bearbeitet
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 17.04.06 09:39
wie wär es mit einer TMaskEdit komponente? da kannst du auch dein zahlenformat vorgeben....
|
|
Peter2002
      
Beiträge: 103
Win XP, Win 7
Delphi 2007 / XE3
|
Verfasst: Di 18.04.06 16:33
... oder im OnKeyPress könnte man zumindes die Eingabe von Buchstaben von vorn herein unterbinden
auch das Komma könnte abhängig davon ob bereits eins im Edit ist abgeblockt werden
|
|
Blawen
      
Beiträge: 616
Erhaltene Danke: 33
Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
|
Verfasst: Di 18.04.06 21:57
Peter2002 hat folgendes geschrieben: | ... oder im OnKeyPress könnte man zumindes die Eingabe von Buchstaben von vorn herein unterbinden
auch das Komma könnte abhängig davon ob bereits eins im Edit ist abgeblockt werden |
Klar könnte man (und genau dies hat Chris11 ja auch gemacht)
Aber wenn Du mal rein gedanklich an alle möglichen und unmöglichen "Benutzerfehler" denkst, wirst Du von dieser Variante schnell wieder abkommen. Zudem dürfte diese Lösung problemlos das 10fache an QT aufweisen.
_________________ Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro
|
|
Peter2002
      
Beiträge: 103
Win XP, Win 7
Delphi 2007 / XE3
|
Verfasst: Do 20.04.06 16:07
Blawen hat folgendes geschrieben: | Peter2002 hat folgendes geschrieben: | ... oder im OnKeyPress könnte man zumindes die Eingabe von Buchstaben von vorn herein unterbinden
auch das Komma könnte abhängig davon ob bereits eins im Edit ist abgeblockt werden |
Klar könnte man (und genau dies hat Chris11 ja auch gemacht)
Aber wenn Du mal rein gedanklich an alle möglichen und unmöglichen "Benutzerfehler" denkst, wirst Du von dieser Variante schnell wieder abkommen. Zudem dürfte diese Lösung problemlos das 10fache an QT aufweisen. |
Ein Feld in das eine Zahl eingegeben werden soll, oder
So viele Fehler können doch da nicht vorkommen
1. Der User versucht Buchstaben, Sonderzeichen o.ä. einzugeben (irgendwas, das keine Zahl ist)
2. Er versucht mehrere Kommas einzugeben
3. Er gibt gar nichts ein
Was kann mir der DAU noch so anstellen?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (key in [#48..#57, #8, #44]) then key := #0 else if (key = #44) and (Pos(',', Edit1.Text) > 0) then key := #0; end; |
Bis hier her ist es jedenfalls nicht sonderlich viel Code
|
|
Amiga-Fan
      
Beiträge: 534
|
Verfasst: Do 20.04.06 16:18
kann man in Windows bei Zahlen (Einstellungen für Währungen und so) nicht etwas anderes als Komma angeben?
_________________ - Leg dich nie mit einem Berufsprogrammierer an
- Wahre Profis akzeptieren keine einfachen Lösungen
|
|
Blawen
      
Beiträge: 616
Erhaltene Danke: 33
Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
|
Verfasst: Do 20.04.06 21:56
Zitat: | Was kann mir der DAU noch so anstellen? |
Wie wäre es z.B. mit kopieren und einfügen? (Ctrl-C / Ctrl-V)
Es gibt garantiert noch jenste Möglichkeiten! Auch solche an die Du nicht im entferntesten Denken würdest!
Amiga-Fan hat folgendes geschrieben: | kann man in Windows bei Zahlen (Einstellungen für Währungen und so) nicht etwas anderes als Komma angeben? |
Kann man. Ein Grund mehr nicht jeden Tastendruck einzeln überprüfen zu wollen. (Delphi berücksichtigt die Ländereinstellungen automatisch)
Zitat: | Bis hier her ist es jedenfalls nicht sonderlich viel Code |
Sicherlich nicht. Was machst Du aber z.B. wenn der User mit Ctrl-V arbeitet?
Mein obiges Beispiel ist nicht viel länger, aber es fängt eigentlich alle möglichen und unmöglichen Eingaben ab.
Zudem wird die Eingabe gleich auch noch formatiert (Die Eingabe sollten ja möglichst immer gleich aussehen und nicht z.B. einmal 10.00, 10.0, 10. oder einfach nur 10)
Ich mache es so, dass ich eine zentrale Prozedure à la obiges Beispiel habe und beim verlassen des Feldes diese Prozedur aufrufe.
Delphi-Quelltext 1:
| TesteNumerischeEingabe(((sender as TEdit)); |
Was noch nicht überprüft wurde, ist ob das Feld '0.00' enthält. Dies kannst Du in der Exit-Prozedur gleich mittesten Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TArtikel.Edit_AnzExit(Sender: TObject); begin TesteNumerischeEingabe((sender as TEdit)); IF Edit_Anz.Text = '0.00' THEN Edit_Anz.Text := '1.00'; end; |
oder wenn Du z.B. den "Speichern" oder "Weiter"-Button anklickst. (In den meisten Fällen muss ja auch kontrolliert werden ob ein Feld allenfalls leer ist)
_________________ Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro
|
|
chris11 
Hält's aus hier
Beiträge: 2
|
Verfasst: Fr 21.04.06 11:55
Also danke für alle eure Antworten, ich habe es jetzt auf folgende Weise gelöst:
Die Felder habe ich über eine ASCII Code Abfrage für alle Tasten außer Zahlen und die Entfernen Taste gespert. Um mir noch weiteren Aufwand zu ersparen habe ich einfach zwei Edit Felder nebeneinander gesetzt, eins für die ganzen Zahlen vor dem Komma und ein Feld für die Zahlen hinter dem Komma. Beide Felder habe ich dann über ein "," sichtbar getrennt. Dann addiere ich die Felder einfach über:
strtofloat(edit6.text+','+edit19.text);
So weit also, dann muss noch gewährleistet sein, dass wenn der Benutzer mit der Entfernen Taste das ganze Feld löscht, vor der eigentlichen Verarbeitung das Feld wieder mit einer Richtigen Zahlt bestückt wird, für meine Anwendung ist das OK wenn dafür die "2" (also die niedrigste Zahl die der Benutzer wählen kann) eingegeben wird, das gleiche gilt für das Feld wo die Kommazahl eingegeben wird, hier wird dann in das Feld eine "0" zurück geschrieben, also:
if (edit6.text='') or (edit6.Text<'2') then edit6.Text:='2';
if (edit19.text='') then edit19.Text:='00';
Gruß chris11
|
|
Blawen
      
Beiträge: 616
Erhaltene Danke: 33
Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
|
Verfasst: Fr 21.04.06 20:47
chris11 hat folgendes geschrieben: | Also danke für alle eure Antworten, ich habe es jetzt auf folgende Weise gelöst:
|
Klingt nach einer sehr komplexen und Fehleranfälligen Lösung!
Ich empfehle Dir noch immer die Variante: (angepasst und copy und paste fähig)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| Function TesteEingabe(e : TEdit) : Boolean;
var s : String; r : Real;
begin try s := e.Text; StrToFloat(s); r := StrToCurr(s); s := FormatFloat('0.00',r); e.Text := s; Result := True; except Showmessage('Die Eingabe ist ungültig!'); e.SetFocus; Result := False; end; end; |
Damit Du siehst, wie einfach es geht habe ich Dir ein Testprojekt hochgeladen.
In diesem Fall werden 3 Edit-Felder auf korrekten Inhalt kontrolliert (jeweils beim verlassen des jeweiligen Feldes)
Gruss
Blawen
Einloggen, um Attachments anzusehen!
_________________ Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro
|
|
|