Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Dummer Schleifen Fehler! (https://www.delphipraxis.net/95295-dummer-schleifen-fehler.html)

Stillmatic 4. Jul 2007 19:52


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

MrSpock 4. Jul 2007 19:56

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.

Stillmatic 4. Jul 2007 20:02

Re: Dummer Schleifen Fehler!
 
Ahhh!

Und wie meinst du könnte ich das Problem lösen???

Namenloser 4. Jul 2007 20:04

Re: Dummer Schleifen Fehler!
 
Hi,

lass die Schleife einfach rückwärts durchlaufen, dann müsste es funktionieren.

m.wollert 4. Jul 2007 20:05

Re: Dummer Schleifen Fehler!
 
Hi,

Grundsätzlich sollten Löschvorgänge in einer Zeichenkette "von hinten" gestartet werden.

also
Delphi-Quellcode:
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
In einer Vorwärtsschleife kann es passieren, daß Du einzelne Elemente nicht prüfst

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:)

leddl 4. Jul 2007 20:09

Re: Dummer Schleifen Fehler!
 
Oder - der Vollständigkeit halber - man verwendet eine While-Schleife ;)

Stillmatic 4. Jul 2007 20:09

Re: Dummer Schleifen Fehler!
 
Danke, jetzt geht es!!

@m.wollert

Danke für den Tip, werd ich mir merken!

DeddyH 4. Jul 2007 20:11

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 4. Jul 2007 20:24

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Es geht um Delphi.

marabu 4. Jul 2007 20:28

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:
procedure TForm1.Edt_KeyPress(Sender: TObject; var Key: Char);
begin
  if not (key in [' ', '.', '-']) then
    key := #0;
end;
Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:37 Uhr.
Seite 1 von 2  1 2      

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