Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Eingabebedingungen (https://www.delphipraxis.net/154059-eingabebedingungen.html)

CIADelphianer 26. Aug 2010 10:12

Eingabebedingungen
 
Hallo,
wir haben wieder eine Frage an euch:

Wir haben eine Comboxbox und zwei Editfelder über die wir eine Containerbezeichnung hinzufügen wollen.
Im zweiten Edit-Feld soll eine vierstellige Zahlen- und Buchstabenkombination eingegeben werden. Die Eingabebeschränkungen haben wir soweit hinbekommen aber manche Kombinationen funktionieren trotzdem nicht..
wie z.B 25G3. G kann mit den Zahlen 0,1,2 und 3 kombiniert werden, es lassen aber nur die Zahlen von 0-2 eingeben.

Delphi-Quellcode:
if (key in ['G']) and
(EditISOCode.SelStart = 2) then
begin
  Statusbar.SimpleText := 'Mit G können Sie nur die Zahlen 0,1,2 und 3 kombinieren, sonst ungültige Containerbezeichnung!';
end;
   if not (key in [#8,'0'..'3']) and
   (EditISOCode.SelStart =3) then
    begin
    Key:= #0;
    end;
Dieser Quellcode bezieht sich jetzt nur auf das 3. und 4.Zeichen.
Vielen Danke für eure Hilfe!
Liebe Grüße:)

himitsu 26. Aug 2010 10:29

AW: Eingabebedingungen
 
Eigentlich sollte das mit der 3 genauso gehn, wie mit 0 bis 2. :gruebel:

Delphi-Quellcode:
(EditISOCode.SelStart = 2)
...
(EditISOCode.SelStart = 3)
2 oder 3 ... beides geht nicht :zwinker:

ihr meint bestimmt
"wenn an 3. Stelle ein 'G' steht, und die der Cursor auf Position 4 (SelStart 3) liegt, dann darf nur #8, '0', '1', '2' oder '3' eingegeben werden"

und nicht
"wenn Cursor auf 2 liegt, ein 'G' eingegeben wurde und gleichteitig der Cursor auf 3 steht kein [#8, '0'..'3'] eingegeben wurde, dann..."
> Die Position kann nicht gleichzeitig 2 und 3 sein und auch die Taste (Key) kann nicht gleichzeizeitig 'G' und was Anderes sein.



PS:
Gib mal eine "9" ein, geh mit dem Cursor davor und gib nun "12G" ein. :zwinker:
Oder Speichere die 9 in der Zwischenablage (Strg+C) und kopiere sie dann an diese Stelle.
Oder schreibe "12G39" und lösche die 3 dort raus.

Schon steht "12G9" im Feld. :angel2:

Soll heißen ... Ich hoffe ihr prüft dieses nicht nur wärend der Eingabe.

CIADelphianer 26. Aug 2010 10:35

AW: Eingabebedingungen
 
Hallo,
danke für die Anwort.
So geht das ausnahmsweise, aber das bringt uns nichts.
Wir müssen das Programm vorstellen und es muss über die Tastatureingabe funktionieren..

himitsu 26. Aug 2010 10:46

AW: Eingabebedingungen
 
Hatte oben meinen Text noch etwas editiert, bzw. ausführlicher ergänzt.

Wie gedsagt, ihr müßt eure Abfragen anpassen.
- das 'G' wurde schon eingegeben und muß demnach im Edit geprüft werden
- Key und SelStart beziehen sich nur auf die aktuelle Eingabe, also die Zahlen
Delphi-Quellcode:
//if (Length(EditISOCode.Text) => 3) and (EditISOCode.Text[3] = 'G')
//    and (EditISOCode.SelStart = 3) then
if (EditISOCode.SelStart = 3) and (EditISOCode.Text[3] = 'G') then
begin
  Statusbar.SimpleText := 'Mit G können Sie nur die Zahlen 0,1,2 und 3 kombinieren, sonst ungültige Containerbezeichnung!';
  if not (Key in [#8, '0'..'3']) then Key := #0;
end;

[edit]
ahhh, jetzt seh ich grade das END ... bitte achtet mal mehr auf eure Einrückung ... es ah so aus, als wenn das
Delphi-Quellcode:
if not (key in [#8,'0'..'3']) and ...
innerhalb der vorhergehenden Abfrage liegt.

Hmmm, wenn man das nun nochmal anguckt, dann sollte es eigentlich Funktionieren, so wie du es in Post #1 geschrieben hast. :gruebel:

Oder wird die '3' durch eine Andere Abfrage blockiert?
(Du hast ja nur einen Teil hier gepostet.)

Delphi-Quellcode:
if (Key in ['G']) and (EditISOCode.SelStart = 2) then
  Statusbar.SimpleText := 'Mit G können Sie nur die Zahlen 0,1,2 und 3 kombinieren, sonst ungültige Containerbezeichnung!';
//if (Length(EditISOCode.Text) => 3) and (EditISOCode.Text[3] = 'G')
//  and (EditISOCode.SelStart = 3) and not (Key in [#8, '0'..'3']) then
if (EditISOCode.SelStart = 3) and (EditISOCode.Text[3] = 'G')
    and not (Key in [#8, '0'..'3']) then
  Key := #0;
Delphi-Quellcode:
if (Key in ['G']) and (EditISOCode.SelStart = 2) then
  Statusbar.SimpleText := 'Mit G können Sie nur die Zahlen 0,1,2 und 3 kombinieren, sonst ungültige Containerbezeichnung!';
//if (Length(EditISOCode.Text) => 3) and (EditISOCode.Text[3] = 'G')
// and (EditISOCode.SelStart = 3) then
if (EditISOCode.SelStart = 3) and (EditISOCode.Text[3] = 'G') then
begin
  if Key in [#8, '0'..'3'] then
  begin
    Statusbar.SimpleText := '';
  end
  else
  begin
    Statusbar.SimpleText := 'ungültiges Zeichen';
    Key := #0;
  end;
end;

CIADelphianer 26. Aug 2010 11:28

AW: Eingabebedingungen
 
Hey danke für deine Hilfe aber es funktioniert immer noch nicht :cry:!! 0,1 und 2 lassen sich eingeben aber immer noch nicht die 3.
Hast du noch eine Idee wie es klappen könnte?
Ich häng mal den Quellcode ran, vielleicht ist da ja ein Fehler..


Delphi-Quellcode:
procedure TForm1.EditISOCodeKeyPress(Sender: TObject; var Key: Char);
begin
if not(key in [#8,'1'..'4','A'..'H','K'..'N','P']) and
(EditISOCode.SelStart =0) then
begin
Key:= #0; // Ignoriert die Tastatureingabe
StatusBar.SimpleText:= 'An der ersten Stelle des ISOCodes kann nur 1, 2, 3, 4, A,B,C,D,E,F,G,H,K,L,M,N oder P stehen.';
end
else

//2.Zeichen
if not (key in [#8, '0','2','5','6','8','C'..'F','L'..'N','P']) and
(EditISOCode.SelStart =1) then
begin
Key:= #0; // Ignoriert die Tastatureingabe
StatusBar.SimpleText:= 'An der zweiten Stelle des ISOCodes kann nur 0,2,5,6,8,C,D,E,F,L,M,N oder P stehen.';
end
else

 //3. Zeichen
 if not (key in [#8,'G','V','R','H','U','T','B','P','S']) and
 (EditISOCode.SelStart = 2) then
 begin
   Key:= #0;
   Statusbar.SimpleText:= 'An der dritten Stelle des ISOCodes kann nur G,V,R,H,T,B,P,S stehen.' ;
end
else

//4.Zeichen
if not (key in [#8,'0'..'9']) and
(EditISOCode.SelStart =3) then
begin
  Key:= #0;
 // Statusbar.SimpleText:='An der vierten Stelle des ISOCodes kann nur 1,2,3,4,5,6,7,8 und 9.';
end;

//Bedingung vom 3. zum 4. Zeichen (z.B. G nur mit 0,1,2,3 kombinierbar)

if (key in ['G']) and
(EditISOCode.SelStart = 2) then
begin
  Statusbar.SimpleText := 'Mit G können Sie nur die Zahlen 0,1,2 und 3 kombinieren, sonst ungültige Containerbezeichnung!';
end;
   if not (key in [#8,'0'..'3']) and
   (EditISOCode.SelStart =3) then
    begin
    Key:= #0;
    end;

if (key in ['V']) and
(EditISOCode.SelStart = 2) then
begin
  Statusbar.SimpleText := 'Mit V können Sie nur die Zahlen 0,2 und 4 kombinieren, sonst ungültige Containerbezeichnung!';
end;
   if not (key in [#8,'0'..'2','4']) and
   (EditISOCode.SelStart =3) then
    begin
    Key:= #0;
    end;

if (key in ['R']) and
(EditISOCode.SelStart = 2) then
begin
  Statusbar.SimpleText := 'Mit R können Sie nur die Zahlen 0,1,2 und 3 kombinieren, sonst ungültige Containerbezeichnung!';
end;
   if not (key in [#8,'0'..'3']) and
   (EditISOCode.SelStart =3) then
    begin
    Key:= #0;
    end;

if (key in ['H']) and
(EditISOCode.SelStart = 2) then
begin
  Statusbar.SimpleText := 'Mit H können Sie nur die Zahlen 0,1,2,3 und 4 kombinieren, sonst ungültige Containerbezeichnung!';
end;
   if not (key in [#8,'0'..'4']) and
   (EditISOCode.SelStart =3) then
    begin
    Key:= #0;
    end;

if (key in ['U']) and
(EditISOCode.SelStart = 2) then
begin
  Statusbar.SimpleText := 'Mit U können Sie nur die Zahlen 0,1,2,3,4 und 5 kombinieren, sonst ungültige Containerbezeichnung!';
end;
   if not (key in [#8,'0'..'5']) and
   (EditISOCode.SelStart =3) then
    begin
    Key:= #0;
    end;

if (key in ['T']) and
(EditISOCode.SelStart = 2) then
begin
  Statusbar.SimpleText := 'Mit T können Sie nur die Zahlen 0,1,2,3,4,5,6,7,8 und 9 kombinieren, sonst ungültige Containerbezeichnung!';
end;
   if not (key in [#8,'0'..'9']) and
   (EditISOCode.SelStart =3) then
    begin
    Key:= #0;
    end;

if (key in ['B']) and
(EditISOCode.SelStart =2) then
begin
  Statusbar.SimpleText := 'Mit B können Sie nur die Zahlen 0,1,3,4,5 und 6 kombinieren, sonst ungültige Containerbezeichnung!';
end;
   if not (key in [#8,'0'..'6']) and
   (EditISOCode.SelStart =3) then
    begin
    Key:= #0;
    end;

if (key in ['P']) and
(EditISOCode.SelStart =2) then
begin
  Statusbar.SimpleText := 'Mit P können Sie nur die Zahlen 0,1,2,3,4 und 5 kombinieren, sonst ungültige Containerbezeichnung!';
end;
   if not (key in [#8,'0'..'5']) and
   (EditISOCode.SelStart =3) then
    begin
    Key:= #0;
    end;

if (key in ['S']) and
(EditISOCode.SelStart = 2) then
begin
  Statusbar.SimpleText := 'Mit S können Sie nur die Zahlen 0,1 und 2 kombinieren, sonst ungültige Containerbezeichnung!';
end;
   if not (key in [#8,'0'..'2']) and
   (EditISOCode.SelStart =3) then
    begin
    Key:= #0;
    end;

himitsu 26. Aug 2010 11:54

AW: Eingabebedingungen
 
Delphi-Quellcode:
procedure TForm1.EditISOCodeKeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in [#8, '1'..'4', 'A'..'H', 'K'..'N', 'P'])
    and (EditISOCode.SelStart = 0) then
  begin
    Key := #0; // Ignoriert die Tastatureingabe
    StatusBar.SimpleText := 'An der ersten Stelle des ISOCodes kann nur 1, 2, 3, 4, A,B,C,D,E,F,G,H,K,L,M,N oder P stehen.';
  end
  else
    // 2. Zeichen
    if not (Key in [#8, '0', '2', '5', '6', '8', 'C'..'F', 'L'..'N', 'P'])
      and (EditISOCode.SelStart = 1) then
    begin
      Key := #0; // Ignoriert die Tastatureingabe
      StatusBar.SimpleText := 'An der zweiten Stelle des ISOCodes kann nur 0,2,5,6,8,C,D,E,F,L,M,N oder P stehen.';
    end
    else
      // 3. Zeichen
      if not (Key in [#8, 'G', 'V', 'R', 'H', 'U', 'T', 'B', 'P', 'S'])
        and (EditISOCode.SelStart = 2) then
      begin
        Key := #0;
        StatusBar.SimpleText := 'An der dritten Stelle des ISOCodes kann nur G,V,R,H,T,B,P,S stehen.';
     end
     else
       // 4.Zeichen
       if not (Key in [#8, '0'..'9']) and (EditISOCode.SelStart = 3) then
       begin
         Key := #0;
         // Statusbar.SimpleText:='An der vierten Stelle des ISOCodes kann nur 1,2,3,4,5,6,7,8 und 9.';
       end;

  // Bedingung vom 3. zum 4. Zeichen (z.B. G nur mit 0,1,2,3 kombinierbar)

  if (Key in ['G']) and (EditISOCode.SelStart = 2) then
  begin
    StatusBar.SimpleText := 'Mit G können Sie nur die Zahlen 0,1,2 und 3 kombinieren, sonst ungültige Containerbezeichnung!';
  end;
  if not (Key in [#8, '0'..'3']) and (EditISOCode.SelStart = 3) then
  begin
    Key := #0;
  end;

  if (Key in ['V']) and (EditISOCode.SelStart = 2) then
  begin
    StatusBar.SimpleText := 'Mit V können Sie nur die Zahlen 0,2 und 4 kombinieren, sonst ungültige Containerbezeichnung!';
  end;
  if not (Key in [#8, '0'..'2', '4']) and (EditISOCode.SelStart = 3) then
  begin
    Key := #0;
  end;

  if (Key in ['R']) and (EditISOCode.SelStart = 2) then
  begin
    StatusBar.SimpleText := 'Mit R können Sie nur die Zahlen 0,1,2 und 3 kombinieren, sonst ungültige Containerbezeichnung!';
  end;
  if not (Key in [#8, '0'..'3']) and (EditISOCode.SelStart = 3) then
  begin
    Key := #0;
  end;

  if (Key in ['H']) and (EditISOCode.SelStart = 2) then
  begin
    StatusBar.SimpleText := 'Mit H können Sie nur die Zahlen 0,1,2,3 und 4 kombinieren, sonst ungültige Containerbezeichnung!';
  end;
  if not (Key in [#8, '0'..'4']) and (EditISOCode.SelStart = 3) then
  begin
    Key := #0;
  end;

  if (Key in ['U']) and (EditISOCode.SelStart = 2) then
  begin
    StatusBar.SimpleText := 'Mit U können Sie nur die Zahlen 0,1,2,3,4 und 5 kombinieren, sonst ungültige Containerbezeichnung!';
  end;
  if not (Key in [#8, '0'..'5']) and (EditISOCode.SelStart = 3) then
  begin
    Key := #0;
  end;

  if (Key in ['T']) and (EditISOCode.SelStart = 2) then
  begin
    StatusBar.SimpleText := 'Mit T können Sie nur die Zahlen 0,1,2,3,4,5,6,7,8 und 9 kombinieren, sonst ungültige Containerbezeichnung!';
  end;
  if not (Key in [#8, '0'..'9']) and (EditISOCode.SelStart = 3) then
  begin
    Key := #0;
  end;

  if (Key in ['B']) and (EditISOCode.SelStart = 2) then
  begin
    StatusBar.SimpleText := 'Mit B können Sie nur die Zahlen 0,1,3,4,5 und 6 kombinieren, sonst ungültige Containerbezeichnung!';
  end;
  if not (Key in [#8, '0'..'6']) and (EditISOCode.SelStart = 3) then
  begin
    Key := #0;
  end;

  if (Key in ['P']) and (EditISOCode.SelStart = 2) then
  begin
    StatusBar.SimpleText := 'Mit P können Sie nur die Zahlen 0,1,2,3,4 und 5 kombinieren, sonst ungültige Containerbezeichnung!';
  end;
  if not (Key in [#8, '0'..'5']) and (EditISOCode.SelStart = 3) then
  begin
    Key := #0;
  end;

  if (Key in ['S']) and (EditISOCode.SelStart = 2) then
  begin
    StatusBar.SimpleText := 'Mit S können Sie nur die Zahlen 0,1 und 2 kombinieren, sonst ungültige Containerbezeichnung!';
  end;
  if not (Key in [#8, '0'..'2']) and (EditISOCode.SelStart = 3) then
  begin
    Key := #0;
  end;
die Ganzen
Delphi-Quellcode:
if not (Key in [...]) and (EditISOCode.SelStart = ...)
hängen zusammen ... das ergibt in Kurz:
Delphi-Quellcode:
if (not (Key in [#8, '0'..'3']) and (EditISOCode.SelStart = 3))
  or (not (Key in [#8, '0'..'2', '4']) and (EditISOCode.SelStart = 3))
  or (not (Key in [#8, '0'..'3']) and (EditISOCode.SelStart = 3))
  or (not (Key in [#8, '0'..'4']) and (EditISOCode.SelStart = 3))
  or (not (Key in [#8, '0'..'5']) and (EditISOCode.SelStart = 3))
  or (not (Key in [#8, '0'..'9']) and (EditISOCode.SelStart = 3))
  or (not (Key in [#8, '0'..'6']) and (EditISOCode.SelStart = 3))
  or (not (Key in [#8, '0'..'5']) and (EditISOCode.SelStart = 3))
  or (not (Key in [#8, '0'..'2']) and (EditISOCode.SelStart = 3)) then
begin
  Key := #0;
end;
Was fällt nun auf?
Egal welcher Buchstabe auf 2 liegt, es wird immer nur [#8, '0'..'2'] zugelassen.

Debugge doch einfach mal deinen Code?
- starte dein Programm gibt "23G" ein
- lege einen Haltepunkt (F5) auf den ersten Befehl dieser Methode/Prozedur
- drück auf die "3"
- und nun geh einfach mal mit F7 durch diese Methode durch ... und schon wirst du sehn wann/wo und warum Key aud #0 gesetzt wird.

Und schau dir mal jeweils das 2. IF im Post #4 an, dort wird auch nochmal der Buchstabe geprüft.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz