Delphi-PRAXiS

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

SirThornberry 4. Jul 2007 20:35

Re: Dummer Schleifen Fehler!
 
das ganze mal ordentlich:
Delphi-Quellcode:
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;
@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.

DeddyH 4. Jul 2007 20:36

Re: Dummer Schleifen Fehler!
 
Wobei ich dann doch marabus Lösung bevorzugen würde (20 * ShowMessage ist irgendwie nervig, gell?)

Stillmatic 4. Jul 2007 21:27

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!

Namenloser 4. Jul 2007 21:32

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.

Stillmatic 4. Jul 2007 22:14

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!

SirThornberry 5. Jul 2007 07:02

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.

Namenloser 5. Jul 2007 12:51

Re: Dummer Schleifen Fehler!
 
Dafür gibt es die Funktion Delphi-Referenz durchsuchentrim


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