![]() |
Dummer Schleifen Fehler!
1.Duchlauf Ungültiges Zeichen wird entfernt, falls vorhanden!
2.Durchlauf--> erneuter Aufruf der Procedure weil der Inhalt des Edt Feldes geändert wurde --> Edt_.Text := Ausgabe; Jetzt findet er kein Falsches Zeichen mehr und müsste beenden 3.Duchlauf --> Nach dem letzten End spring der Cursor an das vorletzte End und die Procedure wird erneut ausgeführt mit Falschen i Werten!! Das heißt i hat schon den Wert z.B. 5 und geht über die Länge von Ausgabe hinaus, und somit kommt eine Zugriffsverletzung!! Aber Warum???????
Delphi-Quellcode:
procedure TForm1.Edt_Change(Sender: TObject); var i: integer; Ausgabe: String; Begin Ausgabe := Edt_.Text; For i:= 1 to length(Ausgabe) do Begin If Ausgabe[i] <> '' then If (Ausgabe[i] <> ' ') and (Ausgabe[i] <> '.') and (Ausgabe[i] <> '-') then Begin showmessage('Ungültige(s) Zeichen in der Eingabe!'); Delete(Ausgabe,i,1); Edt_.Text := Ausgabe; End; End; End;//Edt_Change |
Re: Dummer Schleifen Fehler!
Hallo,
der Ausdruck Length(Ausgabe) in einer for-Schleife wird nur einmal ausgewertet. Das Löschen eines Zeichens ändert deshalb die Abbruchbedingung nicht. |
Re: Dummer Schleifen Fehler!
Ahhh!
Und wie meinst du könnte ich das Problem lösen??? |
Re: Dummer Schleifen Fehler!
Hi,
lass die Schleife einfach rückwärts durchlaufen, dann müsste es funktionieren. |
Re: Dummer Schleifen Fehler!
Hi,
Grundsätzlich sollten Löschvorgänge in einer Zeichenkette "von hinten" gestartet werden. also
Delphi-Quellcode:
In einer Vorwärtsschleife kann es passieren, daß Du einzelne Elemente nicht prüfst
procedure TForm1.Edt_Change(Sender: TObject);
var i: integer; Ausgabe: String; Begin Ausgabe := Edt_.Text; For i:= length(Ausgabe) downto 1 do Begin If Ausgabe[i] <> '' then If (Ausgabe[i] <> ' ') and (Ausgabe[i] <> '.') and (Ausgabe[i] <> '-') then Begin showmessage('Ungültige(s) Zeichen in der Eingabe!'); Delete(Ausgabe,i,1); Edt_.Text := Ausgabe; End; End; End;//Edt_Change Beispiel: W.XY-Z i steht auf 1, löscht W (Zeichenkette wird kürzer) i steht auf 2, löscht X i steht auf 3, löscht nichts (Y ist hier nun an 2. Stelle) ... Einfach mal zum nachdenken :) Grüße Michael:) |
Re: Dummer Schleifen Fehler!
Oder - der Vollständigkeit halber - man verwendet eine While-Schleife ;)
|
Re: Dummer Schleifen Fehler!
Danke, jetzt geht es!!
@m.wollert Danke für den Tip, werd ich mir merken! |
Re: Dummer Schleifen Fehler!
Andere Möglichkeit mit case:
Delphi-Quellcode:
procedure TForm1.Edt_Change(Sender: TObject);
var i: integer; Ausgabe: String; Begin Ausgabe := Edt_.Text; For i:= length(Ausgabe) downto 1 do case Ausgabe[i] of ' ', '.', '-':; else Begin showmessage('Ungültige(s) Zeichen in der Eingabe!'); Delete(Ausgabe,i,1); Edt_.Text := Ausgabe; End; end; End;//Edt_Change |
DP-Maintenance
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Es geht um Delphi. |
Re: Dummer Schleifen Fehler!
Hallo,
auch wenn es jetzt "funktioniert" ist es dennoch etwas ungeschickt: Die Zuweisung an Edt_.Text triggert das gerade bearbeitete Ereignis erneut. Ich würde die ungültigen Zeichen beim Ereignis OnKeyPress() abfangen:
Delphi-Quellcode:
Grüße vom marabu
procedure TForm1.Edt_KeyPress(Sender: TObject; var Key: Char);
begin if not (key in [' ', '.', '-']) then key := #0; end; |
Re: Dummer Schleifen Fehler!
das ganze mal ordentlich:
Delphi-Quellcode:
@Marabu: Natürlich hast du recht. Aber auch OnChange sollte man nicht außer acht lassen da per Strg + V oder Context-Menü und einfügen aus der Zwischenablage ungewollte Zeichen eingefügt werden können.
procedure TForm1.Edt_Change(Sender: TObject);
var i, lLen : integer; lDst, lSrc : String; begin lLen := 0; lSrc := Edt_.Text; SetLength(lDst, Length(lSrc)); for i := 1 to Length(lSrc) do begin if (lSrc[i] in [' ', '.', '-']) then begin inc(lLen); lDst[lLen] := lSrc[i]; end; end; if (lLen <> Length(lSrc)) then begin ShowMessage('Ungültige(s) Zeichen in der Eingabe!'); Edt_.Text := copy(lDst, 1, lLen); end; end; |
Re: Dummer Schleifen Fehler!
Wobei ich dann doch marabus Lösung bevorzugen würde (20 * ShowMessage ist irgendwie nervig, gell?)
|
Re: Dummer Schleifen Fehler!
Hab gerade das mal alles durchgetestet!!
Wenn man jetzt natürlich 10 Falsche Zeichen per Copy 'n' Paste einfügt kommt 10 mal Falsche Eingabe!! Ist auch net so toll! |
Re: Dummer Schleifen Fehler!
Ist ja auch kein Wunder, weil du die Message box bei jedem Schleifendurchlauf auslöst.
Du kannst aber in der function eine Boolean-Variable deklarieren, die du am Anfang der function auf false setzt. Wenn ein Zeichen gefunden wird setzt du die Variable auf True. Nach der Schleife prüfst du dann, welchen Wert die Variable hat. Wenn sie den Wert true hat, zeigst du die Messagebox. |
Re: Dummer Schleifen Fehler!
Nachdem man die Zeichen gelöscht hat, kommt es vor das der "leere" String leerzeichen enthält!!
Also meine Frage, wie kann man überprüfen ob ein String nur aus Leerzeichen besteht??? Mit einer For Schleife und einem Booleschen Wert ist das ja eigentlich nicht realisierbar weil der String ja aus 5 Zeichen bestehen kann wovon die ersten vier LeerZeichen sind und eins Ein anderes Zeichen sein kann! |
Re: Dummer Schleifen Fehler!
du könntest einfach die Leerzeichen zählen und wenn es genau soviel Leerzeichen sind wie der gefilterte String lang ist und es mehr als 0 Leerzeichen sind dann machst du einen Leerstring draus.
|
Re: Dummer Schleifen Fehler!
Dafür gibt es die Funktion
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz