[Pascal] Eingabe verhindern / abfangen

The Prophet

Rear Admiral
Registriert
Aug. 2001
Beiträge
5.981
Hallo,

hab derzeit ein Problem in Sachen. Pascal eigentlich bilde ich mir ein das es dafür eine recht simple Lösung geben muss ich aber nicht wirklich was sinnvolles erhalte. Folgendes ich hab ein Programm was eine Adressdatenbank in einer Datei ablegt. Die Datensätze lassen sich eintragen, löschen etc. Mein eigentliches Problem besteht nun jedoch darin die Datensätze vom Benutzer sauber eintragen zu lassen, daher möchte ich an gegebener Stelle nur Zahlen oder eben nur Buchstaben zu lassen.

Code:
...
begin
   i:=anfang-1;
  repeat
      inc(i);
      clrscr; gotoxy(1,5);
      writeln('AV einlesen');writeln;
      with person[i] do
      begin
        writeln('ID-Nr ',i);
        writeln;
        write('Name:     ');readln(name);
        write('Vorname:  ');readln(vorname);
        write('Straße:   ');readln(strasse);
...

Hier wird der Datensatz eingelesen.. Das ganze ist als record gespeichert...
Code:
type datenblatt = record
                    name       : string[20];
                    vorname    : string[20];
                    strasse    : string[30];
                    nr         : Byte;
                    plz        : integer;
                    ort        : string [25];
                    telefon    : string[15];              
                  end;
Habe schon versucht die Eingabe mittels einer Repeat until schleife erst garnicht zu ermöglichen und im nachinnein zu korrigieren, doch keiner der Methoden hat sich als sicher erwiesen. Durch einfaches löschen der Zeichen war es dann z.B.: beim Namen wieder möglich Zahlen einzugebe.

Ich suche daher eine Möglichkeit von vornherein alle Zahlen der Tastatur zu sperren oder ggf. die Buchstaben. Ich weiß das sowas geht nur bekomm ich es einfach nicht zufriedenstellend hin.

mfg
 
Zuletzt bearbeitet:
OMG O_O

Ewigkeiten her, dass ich mit Pascal programmiert habe, ich kann nur _versuchen_, dir nen Code zu geben... Also: Von vornherein: Wenn der Code so 100%ig stimmt ist das _Zufall_, gedacht ist das hier nur als ein Schuss, der wenigstens ungefähr in die richtige Richtung gehen soll.

Code:
function FormatInput(allowed : String; maxlen : Integer) : String
var
  tmpstr, tmpstr2 : String;
  ch : char;
  i : Integer;
  ac : Boolean;
begin
  repeat
    repeat until keypressed;
    ch := ReadKey();
    ac := false;
    for i := 1 to Len(allowed) do
      if (allowed[i] = ch) then ac := true;
    if (ac) then begin
      if (Len(tmpstr)<maxlen) then begin
        Write(ch);
        tmpstr := tmpstr + ch;
      end;
      else Beep(); (* String zu lang *)
    end;
    else if (ch = #8) then begin (* 8 = Backspace *)
      tmpstr2 = '';
      for i := 1 to Len(tmpstr)-1 do
        tmpstr2 := tmpstr2 + tmpstr[i];
      tmpstr := tmpstr2;
      i := GetY();
      if (GetX() = 1) i := i - 1;
      GotoXY(((GetX()+79) mod 80)+1,i);
      Write(' '); (* Voriges Zeichen löschen *)
      GotoXY(((GetX()+79) mod 80)+1,i);
      (* Die GotoXY checken *)
    end;
  until ch = #13;
  FormatInput := tmpstr;
end;

Wie gesagt: Ich weiss nicht, in wieweit der Code so stimmt.
 
Hey,

danke die Funktion werde ich mal testen. Hatte eigentlich an eine einfachere Lösung gedacht mit ner simplen repeat until schleife aber die scheint es wohl nicht wirklich zu bringen wie ich feststellen musste.

mfg
 
Nach der Eingabe:

Du müsstest mit ner Schleife jedes einzelne Zeichen, der eingegebenen Namen usw., prüfen, ob es in einem best. ASCII Intervall liegt (eben Zahlen oder Buchstaben).

Bereiche siehe Tafelwerk!
 
Hm :)
Schau dir mal an, was der von mir gepastete Code machen soll ;) Und zwar schon _während_ der Eingabe ;)
 
@ Valium110

genau das hab ich versucht bin aber wie gesagt daran gescheitert, wenn du nen Codeschnipsel hast nur her damit.

@ </Life> bin noch am testen :)
 
Um einen bestehenden String zu prüfen, sollte das hier gehen: (getestet unter Delphi7)

Code:
program Project1;

type
  TBoolFunc = function (C: Char): Boolean;

function IsNumeric (C: Char): Boolean;
begin
  IsNumeric := (C >= '0') and (C <= '9');
end;

function IsAlpha (C: Char): Boolean;
begin
  IsAlpha := ((C >= 'A') and (C <= 'Z')) or
             ((C >= 'a') and (C <= 'z'));
end;

function CheckString (Check: TBoolFunc; S: string): Boolean;
var
  i, Len: Integer;
begin
  Len := Length (S);
  Result := True;
  for i := 1 to Len do
    Result := Result and Check (S [i]);
end;

begin
  if   CheckString (@IsNumeric, '123')
  then WriteLn ('True')
  else WriteLn ('False');
  if   CheckString (@IsAlpha, 'AbC')
  then WriteLn ('True')
  else WriteLn ('False');
  ReadLn;
end.

Wenn Du weitere Prüfungen willst, kannst Du einfach noch mehr Funktionen á la IsNumeric ... schreiben und an CheckString übergeben.
 
So in etwa müsste es aussehen, oder?
(hab das ned auf funktionalität geprüft)

Nur Zahlen (0-9), Großbuchstaben (A-Z) und Kleinbuchstaben (a-z) sowie RETURN/ENTER zum Beenden der eingabe zulassen.
Kannst es ja ggf. noch mit "ord(127)" (DEL) zum löschen des letzten Zeichens erweitern.

Code:
REPEAT
	WHILE NOT keypressed DO
		BEGIN END;
	eingabe:=Readkey;
	IF(
		(
			(ord(eingabe)>ord('0'))
			AND
			(ord(eingabe)<ord('9'))
		)
		OR
		(
			(ord(eingabe)>ord('A'))
			AND
			(ord(eingabe)<ord('Z'))
		)
		OR
		(
			(ord(eingabe)>ord('a'))
			AND
			(ord(eingabe)<ord('z'))
		)
	)
	THEN
	BEGIN
		ist_alphanum=TRUE;
		stringvar=stringvar+eingabe;
	END
	ELSE
	BEGIN
		IF(ord(eingabe)=13)THEN
		BEGIN
		  ende_der_eingabe=true;
		END;
	END;
UNTIL(ende_der_eingabe);
 
Danke euch allen, hab mir meine Lösung daraus bilden können!

mfg
 
Zurück
Oben