![]() |
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 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