AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dummer Schleifen Fehler!

Ein Thema von Stillmatic · begonnen am 4. Jul 2007 · letzter Beitrag vom 5. Jul 2007
Antwort Antwort
Seite 1 von 2  1 2      
Stillmatic

Registriert seit: 25. Apr 2007
110 Beiträge
 
#1

Dummer Schleifen Fehler!

  Alt 4. Jul 2007, 20:52
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
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Dummer Schleifen Fehler!

  Alt 4. Jul 2007, 20:56
Hallo,

der Ausdruck Length(Ausgabe) in einer for-Schleife wird nur einmal ausgewertet. Das Löschen eines Zeichens ändert deshalb die Abbruchbedingung nicht.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Stillmatic

Registriert seit: 25. Apr 2007
110 Beiträge
 
#3

Re: Dummer Schleifen Fehler!

  Alt 4. Jul 2007, 21:02
Ahhh!

Und wie meinst du könnte ich das Problem lösen???
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Dummer Schleifen Fehler!

  Alt 4. Jul 2007, 21:04
Hi,

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

Registriert seit: 18. Aug 2003
Ort: Heilbronn
92 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Dummer Schleifen Fehler!

  Alt 4. Jul 2007, 21:05
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
Michael
*Im Auftrag ewiger Jugend und Glückseligkeit*
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

Registriert seit: 13. Okt 2003
Ort: Künzelsau
1.613 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Dummer Schleifen Fehler!

  Alt 4. Jul 2007, 21:09
Oder - der Vollständigkeit halber - man verwendet eine While-Schleife
Axel Sefranek
A programmer started to cuss, cause getting to sleep was a fuss.
As he lay there in bed, looping round in his head
was: while(!asleep()) ++sheep;
  Mit Zitat antworten Zitat
Stillmatic

Registriert seit: 25. Apr 2007
110 Beiträge
 
#7

Re: Dummer Schleifen Fehler!

  Alt 4. Jul 2007, 21:09
Danke, jetzt geht es!!

@m.wollert

Danke für den Tip, werd ich mir merken!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#8

Re: Dummer Schleifen Fehler!

  Alt 4. Jul 2007, 21:11
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
4. Jul 2007, 21:24
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Es geht um Delphi.
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Dummer Schleifen Fehler!

  Alt 4. Jul 2007, 21:28
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:43 Uhr.
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