Autor Beitrag
chris11
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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 user profile iconraziel: Topic aus Sonstiges (Delphi) verschoben am Mi 19.04.2006 um 11:38
DelphiAnfänger
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 112

Win XP, Firefox 2.0, IE6
Delphi 5 Prof., Delphi 2005 PE
BeitragVerfasst: So 16.04.06 13:02 
guck mal in die Delphi Hilfe unter "try...except"
hkk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 64

Win XP Pro, Win ME, openSUSE 10.2, Ubuntu 7.xx; Firefox 2 (en-US)
D7 Pers, D3 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 616
Erhaltene Danke: 33

Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
BeitragVerfasst: So 16.04.06 15:17 
user profile iconBenBE 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
{ Der übergebene Betrag wird auf Korrektheit überprüft }
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



BeitragVerfasst: Mo 17.04.06 09:39 
wie wär es mit einer TMaskEdit komponente? da kannst du auch dein zahlenformat vorgeben....
Peter2002
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103

Win XP, Win 7
Delphi 2007 / XE3
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 616
Erhaltene Danke: 33

Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
BeitragVerfasst: Di 18.04.06 21:57 
user profile iconPeter2002 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103

Win XP, Win 7
Delphi 2007 / XE3
BeitragVerfasst: Do 20.04.06 16:07 
user profile iconBlawen hat folgendes geschrieben:
user profile iconPeter2002 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 :gruebel:
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?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  // Nur Ziffern, Backspace und Komma zulassen
  if not (key in [#48..#57#8#44]) then key := #0
  else
    // Wenn bereits ein Komma im Edit steht, dann auch sperren
    if (key = #44and (Pos(',', Edit1.Text) > 0then key := #0;
end;

Bis hier her ist es jedenfalls nicht sonderlich viel Code
Amiga-Fan
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 534



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 616
Erhaltene Danke: 33

Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
BeitragVerfasst: 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!

user profile iconAmiga-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.
ausblenden 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
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 616
Erhaltene Danke: 33

Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
BeitragVerfasst: Fr 21.04.06 20:47 
user profile iconchris11 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)
ausblenden 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 ;-)