Autor Beitrag
T.Peters
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 22.01.04 15:25 
Hi Leute,

ich hätte da mal ne Frage.
Ich möchte einen String einlesen. Danach soll der String überprüft werden und abgefragt werden, ob in ihm ungültige Zeichen sind. Wenn ja, dann soll eine Fehlermeldung erscheinen.
Die Abfrage darf nicht glich bei der Eingabe geschehen, sondern danach, weil es auf einen RadiButton ankommt, welche Zeichen in dem String sein dürfen.

Um es Euch etwas verständlicher zu machen: Es sollen hierbei nur Römische Zeichen eingegeben werden dürfen (IVXLCDM).

Danke im Vorraus
Gruß Torsten


Zuletzt bearbeitet von T.Peters am So 25.01.04 19:57, insgesamt 1-mal bearbeitet
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Do 22.01.04 15:28 
also mit dem befehl pos kannst du testen, ob ein buchstabe in eine string vorkommt.
ausblenden Delphi-Quelltext
1:
2:
     if pos ('e',edit1.text) > 0 then
        showmessage ('es ist ein e drin !');

pos gibt nämlich die position des zeichens zurück.
probier damit mal rum, ich denké mal, dass dir das helfen wird...

_________________
In the beginning was the word.
And the word was content-type: text/plain.
T.Peters Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 22.01.04 15:32 
OK könnte man verwenden.
Allerdings wird die Abfrage dann ziemlich lang, weil ich brauche das ganze ja für ABEFGHJKNOP....!
Kann man die Abfragen irgendwie koppeln und wird GROß- und kleinschreibung unterschieden?

PS Thx für deine schnelle Hilfe
MaxiTB
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 679

Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
BeitragVerfasst: Do 22.01.04 15:32 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function IsLegal(Value: string; Legals: string): boolean;
var
 lIndex: integer;
 lPos: integer;
begin
 Result:=true;
 for lIndex:=1 to Length(Legals) do
 begin
  lPos:=Pos(Legals[lndex],Value);
  if lPos>-1 then begin Result:=false; end;
 end;
end;


Value ist der string, den du überprüfen willst, Legals enthält die gültigen Zeichen.

_________________
Euer Mäxchen
Wer früher stirbt, ist länger tot.
Chatfix
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1583
Erhaltene Danke: 10

Win 10, Win 8, Win 7, Win Vista, Win XP
VB.net (VS 2015), MsSQL (T-SQL), HTML, CSS, PHP, MySQL
BeitragVerfasst: Do 22.01.04 15:34 
Groß und klein wird unterschieden.
Mit UpperCase bzw UpCase könnte man das aber umgehen...

_________________
Gehirn: ein Organ, mit dem wir denken, daß wir denken. - Ambrose Bierce
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Do 22.01.04 16:09 
ich wollte auch nur einen denkanstoss geben !

_________________
In the beginning was the word.
And the word was content-type: text/plain.
T.Peters Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 22.01.04 18:21 
@Mäxchen
Danke, funktioniert wunderbar. Da ich diese Abfrage 4 Mal machen muß und jedsmal andere Zeichen gültig sind, bietet sich deine Lösung sehr an. Thx nochmal...

@matze
Danke, das hast du geschafft

@Chatfix
ich benutze dafür AnsiUpperCase();

Danke für die schnelle Hilfe
Gruß Torsten
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 22.01.04 18:34 
Siehste, das ist doch mal eine Antwort. Der Mann ist nicht sauer, wenn man ihm "nur" einen Denkanstoß gibt. :)

@Torsten: Wenn du willst, kannst du den Titel deines allerersten Beitrags ja noch bearbeiten und ein "[Erledigt]" anhängen, also:
Zitat:
String nach Zeichen überprüfen [Erledigt]

Dann wissen alle, dass du eine Lösung hast, und wer das gleiche Problem hat, weiß, dass er sie (die Lösung) hier findet. ;)

Gruß.
T.Peters Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 22.01.04 19:12 
hehe Mathias

Wiso sollte ich sauer sein. Das ganze Forum baut auf Kulanz auf und jeder der Antwortet will doch nur mein Bestes und das des Forums.

Ich werde später das Erledigt anhängen, da ich mir mittlerweile doch nicht mehr so sicher bin, das alles richtig ist.
Meine Antwort war ein wenig zu voreilig.
Wenn ich den Fehler finde un der in dem Code ist, werde ich natürlich die Lösung posten.

Gruß Torsten
T.Peters Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 22.01.04 20:20 
Also wenn ich das richtig verstanden habe, dann liefert Pos, wenn es den String nicht findet 0 zurück. Desshalb kann man nicht nach >-1 fragen; Weil die Funktion ja nur False zurückliefern soll, wenn eines der Zeichen gefunden werden.

Und die Legals sind bei mir jetzt die nicht legalen :D.

Dh: Wenn einer der Zeichen(nicht Gültige Zeichen) in Wert vorhanden ist gebe ein False zurück und showMessage();.

Das funktioniert auch soweit, bis ich dafür Zahlen benutze. Hier mal das Beispiel:

Habe die Variablen mal nach meinen Vorstellungen umbenannt

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function TForm1.Gueltigkeit(Wert: string; nErlaubt: string): boolean;
var
 iFor, iPos: integer;
begin
 Result:=true;
 for iFor:=1 to Length(nErlaubt) do
 begin
  iPos:= Pos(nErlaubt[iFor],Wert);
  if iPos>0 then begin Result:=false; end;
  Erg.Lines.Add('iPos ' + IntToStr(iPos));
 end;
end;


Der Aufruf lautet:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
begin
        nErl:= 'ABCDEFILMVX';
        Edt_Wert.text:= AnsiUpperCase(Edt_Wert.text);
        if (Gueltigkeit(Edt_Wert.text, nErl)= false)
          then
            begin
               Anweisungen;
            end
            else showmessage('keine gültige Eingabe');
      end;


Ich hoffe, das ich nix vergessen habe.
Also wenn ich nun als Wert eine 12 eingebe, sollte normalerweise alles funktionieren, aber es passiert anders rum. zahlen gehen nicht, aber die Buchstaben.

Währe nett wenn sich das nochmal einer anschauen kann.
Werde es mir dann morgen mal anschauen, also falls noch Fragen sind, kann ich die erst Morgen beantworten.

Thx & Gruß
Torsten

Moderiert von user profile iconMotzi: Code- durch Delphi-Tags ersetzt
MaxiTB
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 679

Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
BeitragVerfasst: Do 22.01.04 20:27 
Ups - kann sein, daß ich mich hier irre aber Pos liefert auf jedenfall die erste Position des Auftretens im String ab (pascal typisch) 1.

Es kann also durchaus sein, daß der Fehlerfall 0 ist ... passiert einen C-Veteranen öfters, daß er den String-1-Spezialfall durcheinanderbringt.

Aber einen kleinen Bug hast trotzdem, weil du die Logik doppelt umgedreht hast:

ausblenden Delphi-Quelltext
1:
  if iPos<=0 then begin Result:=false; exit; end;					


Result:=false wenn ungültig.
iPos liefert <=0 wenn das Zeichen nicht gefunden, daher ungültig.

Und dann noch das exit vergessen ... das wars schon.

Klar :wink: ?

_________________
Euer Mäxchen
Wer früher stirbt, ist länger tot.
T.Peters Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Fr 23.01.04 20:44 
OK Thx Mäxchen, ich bin momentan viel unterwegs, werde aber spätestens Sonntag sagen, was drus geworden ist. Bis dahin, frohes Wochenende und hoch die Tassen.

LG Torsten

PS: Ja das mit den Sprachen durcheinander bringen kenne ich, aber in der Delphi Hilfe steht das, wenn der/das Teilstring/Zeichen nicht gefunden wird, dann wird NULL zurückgegeben.
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Fr 23.01.04 21:08 
komische krise krieg. Soviel Code für ein simples problem.
Ein Edit-Feld hat eine OnKey...() Methode. Einfach abfragen, ob die grad gedrückte Taste, innerhalb eines Wertebereiches liegt, wenn ja, --> inherited ansonsten key:=''.

Beispiel:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TEdit.nummerKeyPress(Sender: TObject; var Key: Char);
const
  KeysAllowed: Set of Char =['A','B','C'];
begin
  if not(Key in KeysAllowed) then Key:=#0;
  inherited;
end;


grez
msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
MaxiTB
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 679

Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
BeitragVerfasst: Fr 23.01.04 21:13 
::msch

Er hat aber explizit geschrieben, er will den Check erstens erst später machen und zweitens mit verschiedenen Sets :wink:

_________________
Euer Mäxchen
Wer früher stirbt, ist länger tot.
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Fr 23.01.04 21:19 
wo liegt das Problem, wenn man statt einem, verschiedene Sets von Zeichen definiert die erlaubt sind und diese dann in der OnKeyXXX() Methode abfragt?
grez
msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Sa 24.01.04 11:55 
aber man kann den code ja abwnadeln und dann später mal die zeichen des strings zeichen für zeichen durchgehen und schauen, ob die in dem set enthalten sind.

_________________
In the beginning was the word.
And the word was content-type: text/plain.
T.Peters Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: So 25.01.04 14:42 
Also ich weiß ja nicht.
Erst mal was ist ein Set?
Zweitens: Ich habe soeine Key-Abfrage schon eingebaut, aber was du mit OnKeyXXX() meinst, versteh ich nicht ganz. kurze Erklärung: Ein EditFeld, vier RadioButtons, Es kommt drauf an, welcher Button aktiviert ist, weil damit definiert wird welche Zeichen erlaubt sind. Außerdem wird es meistens so gemacht, das der RadioButton, der die Zahl definiert, erst nach der Zahleingabe getätigt wird.
Nun meine Frage: Wie soll es gehen, etwas nach Gültigkeit abzufragen, wenn nicht definiert ist, was gültig ist?

Jetzt bin ich mal gespannt... :D

Gruß Torsten
MaxiTB
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 679

Win2000, WinXp, Workbench ;-)
D7 Ent, VS2003 Arch.
BeitragVerfasst: So 25.01.04 14:48 
Antwort:
Geht gar nicht, weil du durchs umschalten ungültige Strings haben könntest; und wenn du die immer Löschen würdest, wäre das sehr, sehr benutzerunfreundlich - ist schon okay - hast es schon richtig angedacht.

On the fly Benutzereingaben zu zensieren ist selten eine gute Idee; ist zwar meistens die bequemere Art zu programmieren, aber damit macht man sich nicht viele Freund bei den Usern ...

Set sind eine Spezialität von Delphi ... bei einer solchen Menge von Zeichen würde ich aber trotzdem die Stringvariante verwenden (persönlich), weil so ein Set mir persönlich zuviel Tipparbeit ist und strings einfach universaler und bequemer zum Handieren sind - besonders wenn man später noch dies und das ändern will.

_________________
Euer Mäxchen
Wer früher stirbt, ist länger tot.
T.Peters Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: So 25.01.04 19:56 
Also ich habe jetzt noch ein paar Fehler ausgebügelt, aber dies ist die End-Lösung:

Als erstes werden über eine KeyPress Funktion die erlaubten Zeichen ins EditFeld eingetragen.
Danach wird über die RadioButtons der Typ und somit die restichen unerlauben Zeichen definiert (gespeichert in var nErlaubt)

Abfrage des RB`s; nicht erlaubte Zahlen deklarieren; String in Großbuchstaben umwandeln; abfragen ob das Ergebnis der Gültigkeitsabfrage True or False ist und ausführen der entsprechenden Anweisungen.
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
if RadioButton1.Checked = true
    then
      begin
        nErl:= 'ILMVX';
        Edt_Wert.text:= AnsiUpperCase(Edt_Wert.text);
        if (Gueltigkeit(Edt_Wert.text, nerl)= True)
          then
            begin
              Anweisungen
            end
            else showmessage('keine gültige Eingabe');
      end;


ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function TForm1.Gueltigkeit(Wert: string; nErlaubt: string): boolean;
var
 iFor, iPos: integer;
begin
 Result:=true;
 for iFor:=1 to Length(nErlaubt) do
 begin
  iPos:= Pos(nErlaubt[iFor],Wert);
  if iPos>0 then begin Result:=false; exit; end;
 end;
end;


Durch Pos() wird abgefragt, ob "Wert" das Zeichen, welches in "nErlaubt[iFor]" gespeichert ist, enthällt. Ist das Zeichen vorhanden, wird der Indexwert des ersten Zeichens zurückgegeben (Das Zeichen kann ja auch öffters vorkommen). Wird das Zeichen nicht gefunden, so gibt Pos() eine NULL zurück. Daher muß die Abfrage iPos>0 heißen.

Danke an alle, bis zum nächsten Mal

Gruß Torsten