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/)
-   -   Delphi Fehlersuche (https://www.delphipraxis.net/132179-fehlersuche.html)

gangs-taas 7. Apr 2009 15:30


Fehlersuche
 
hey, ich habe versucht mir ein entschlüsselungsprogramm zu schreiben, wobei jeder buchstabe im verschlüsselten Text 'y' buchstaben hat. 'y' ist die erste Zahl in meinem EditFeld 1.
Wenn ich das Programm ausführe funktioniert es erst schon, aber wenn ic auf Button1 Klicke bekomme ich die Meldung
Zitat:

'' ist kein gültiger integer wert
ich weiß einfach nicht wo mein fehler ist ...
hier ist mein Code


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
String2 : string;
y : integer;
Schalter : integer;
begin
// Variablen Deklarieren //
String2 := Copy(Edit2.Text,1, Length(Edit2.Text));
y:= StrToInt(Copy(Edit1.Text,0,1));
Schalter := 0;
x := 1 ;
// Kontrollanzeige//
Edit3.Text := IntToStr(x);
Edit4.Text := IntToStr(y) ;
// String stückeln//
repeat
begin
  sTemp1:= Copy(String2, 1, y);
 case StrToInt(sTemp) of
 1234 : Memo1.Text := Pchar(Memo1.Text + 'a');
 5678 : Memo1.Text := Pchar(Memo1.Text + 'b');
  end;
  String2 := Copy(Edit2.Text,y, Length(Edit2.Text));
y := y+y   ;
{Edit3.Text := IntToStr(x);
Edit4.Text := IntToStr(y) ; }
If (y >= (Length(Edit2.Text))) Then
Schalter := 1  ;
End;
until (schalter = 1) ;

end;

ps. Danke schonmal für eure Hilfe

Phoenix 7. Apr 2009 15:37

Re: Fehlersuche
 
Zitat:

Zitat von gangs-taas
Delphi-Quellcode:
y:= StrToInt(Copy(Edit1.Text,0,1)); // wahrscheinlich hier...
// ...
 case StrToInt(sTemp) of // oder hier...

Die Fehlermeldung ist ganz klar: Es wird versucht, einen leeren String in eine Zahl umzuwandeln. Ein Leerer String ist aber keine gültige Zahl.

Also schau Dir mal ab, ob in Edit1 oder in dem temporären String nicht vielleicht nichts drin steht, was Du ungeprüft in eine Zahl umwandeln willst...

quendolineDD 7. Apr 2009 15:38

Re: Fehlersuche
 
Irgendwo, wo du StrToInt() verwendest hast, wird ein Leerstring sein. Und das ergibt den Fehler.
Setze dir zu Beginn von der Prozedur einen Breakpoint, drücke F9 und klicke auf deinen Schalter. Danach gehst du Zeile für Zeile durch und schaust mal, was für Werte du so im einzelnen erhälst und siehst dann auch an welcher Stelle es hakt.
Und dann guckst du dir mal das hier durch.

DeddyH 7. Apr 2009 15:39

Re: Fehlersuche
 
Was passiert, wenn Du
Zitat:

Delphi-Quellcode:
y:= StrToInt(Copy(Edit1.Text,0,1));

in
Delphi-Quellcode:
y:= StrToInt(Copy(Edit1.Text,1,1));
änderst? Eine weitere Fehlerquelle wäre sTemp, aber da das anscheinend eine globale Variable ist, kann man im Code nicht sehen, was drinstehen könnte.

quendolineDD 7. Apr 2009 15:45

Re: Fehlersuche
 
Wäre
Delphi-Quellcode:
y:= StrToInt(Edit1.Text[1]);
nicht etwas lesbarer? ;) Es würde außerdem die Fehlerquellen minimieren.
Genauso kannst du Edit1.Text direkt String2 zuweisen.
Delphi-Quellcode:
String2 := Edit2.Text;
Edit:
Das Beste wäre eine Eingangsprüfung auf Leerstrings. Oder TryStrToInt.

gangs-taas 7. Apr 2009 15:47

Re: Fehlersuche
 
Zitat:

Zitat von DeddyH
Was passiert, wenn Du
Zitat:

Delphi-Quellcode:
y:= StrToInt(Copy(Edit1.Text,0,1));

in
Delphi-Quellcode:
y:= StrToInt(Copy(Edit1.Text,1,1));
änderst? Eine weitere Fehlerquelle wäre sTemp, aber da das anscheinend eine globale Variable ist, kann man im Code nicht sehen, was drinstehen könnte.


okay
also das erste hat leider nichts gebracht ...


so und zu sTemp
das ist eine globale Variable, in der die ersten 'y' buchstaben von dem textfeld Edit2 stehen.
dann soll/wird überprüft ob das gleich einer von meinen verschlüsselten buchstaben ist....




Zitat:

Zitat von quendolineDD
Irgendwo, wo du StrToInt() verwendest hast, wird ein Leerstring sein. Und das ergibt den Fehler.
Setze dir zu Beginn von der Prozedur einen Breakpoint, drücke F9 und klicke auf deinen Schalter. Danach gehst du Zeile für Zeile durch und schaust mal, was für Werte du so im einzelnen erhälst und siehst dann auch an welcher Stelle es hakt.
Und dann guckst du dir mal das hier durch.


also ich weiß leider nicht wie das mit dem breakpoint funktioniert aber ich werde mir gerne das Tutorial durchlesen und hoffe ich bin danach schlauer.

vielen dank für den link auf jedenfall !!



lg

Phoenix 7. Apr 2009 15:48

Re: Fehlersuche
 
Zitat:

Zitat von quendolineDD
Wäre
Delphi-Quellcode:
y:= StrToInt(Edit1.Text[1]);
nicht etwas lesbarer? ;) Es würde außerdem die Fehlerquellen minimieren.

Naja.. wenn ich 10 Eingebe erwarte ich dann nicht was anderes als wenn ich 1 eingebe? ;-)

gangs-taas 7. Apr 2009 15:49

Re: Fehlersuche
 
Zitat:

Zitat von quendolineDD
Wäre
Delphi-Quellcode:
y:= StrToInt(Edit1.Text[1]);
nicht etwas lesbarer? ;) Es würde außerdem die Fehlerquellen minimieren.
Genauso kannst du Edit1.Text direkt String2 zuweisen.
Delphi-Quellcode:
String2 := Edit2.Text;
Edit:
Das Beste wäre eine Eingangsprüfung auf Leerstrings. Oder TryStrToInt.


für das bin ich auch dankbar und werde es gleich umändern.

wobei der einwurf meines vorredners gut ist ... ich werde da nochmal drübernachdenken, denke aber, dass ich es so lassen werde wie es bislang ist, da ich das dann leichter auf 'die ersten 2 zahlen in dem Editfeld' umändern kann....

ich wusste nicht das
Delphi-Quellcode:
String2 := Edit2.Text;
so einfach funktioniert ... ich dachte ich bekomme dann wieder irgend ne blö** fehlermeldung ....


aber ich werde es jetzt mal ausprobieren

quendolineDD 7. Apr 2009 15:49

Re: Fehlersuche
 
Zitat:

Zitat von Phoenix
Zitat:

Zitat von quendolineDD
Wäre
Delphi-Quellcode:
y:= StrToInt(Edit1.Text[1]);
nicht etwas lesbarer? ;) Es würde außerdem die Fehlerquellen minimieren.

Naja.. wenn ich 10 Eingebe erwarte ich dann nicht was anderes als wenn ich 1 eingebe? ;-)

Er hat aber auch nur eine Stelle kopiert
Delphi-Quellcode:
y:= StrToInt(Copy(Edit1.Text,0,1));

DeddyH 7. Apr 2009 15:50

Re: Fehlersuche
 
Naja, der Copy-Befehl nimmt aber auch nur ein Zeichen, so wie er da steht.

[edit] *gnarf* macht doch alleine weiter *püh* [/edit]

Phoenix 7. Apr 2009 15:54

Re: Fehlersuche
 
Zitat:

Zitat von quendolineDD
Er hat aber auch nur eine Stelle kopiert
Delphi-Quellcode:
y:= StrToInt(Copy(Edit1.Text,0,1));

Ja. Das schon. Stellt sich die Frage, ob das überhaupt korrekt ist, bzw. ob es nicht besser wäre, gleich mit anderen Controls eine fehlerhafte / andere als die erwartete Eingabe zu verhindern.

quendolineDD 7. Apr 2009 15:55

Re: Fehlersuche
 
Das wäre aber ein logischer Fehler und uns nicht ersichtlich.
Dann könnten wir ihm aber auch gleich eine performante endgültige Lösung hinkauen ...

gangs-taas 7. Apr 2009 15:57

Re: Fehlersuche
 
xD
das fänd ich zwar auch nicth schlecht ich würde aber lieber verstehen wo mein fehler ist ^^

DeddyH 7. Apr 2009 16:03

Re: Fehlersuche
 
Dann setz doch einen Haltepunkt, steppe mit F8 durch und schau, wo es knallt.

nahpets 7. Apr 2009 16:15

Re: Fehlersuche
 
Hallo,

das kann nicht gehen:
Delphi-Quellcode:
y:= StrToInt(Copy(Edit1.Text,0,1));
Ein String fängt bei 1 an und nicht bei 0 (bzw. in Pascal steht/stand im nullten Byte die Länge des Strings, das ist hier aber sicherlich nicht der gewünschte Wert).
Vorschlag:
Delphi-Quellcode:
y:= StrToIntDef(Copy(Trim(Edit1.Text),1,1),1);
Zuerst mal alle Leerzeichen wegwerfen (Trim).
Vom Rest das erste Zeichen nehmen (Copy 1,1).
Wenn das schief geht wird eine 1 geliefert (StrToIntDef)
Der Vorgabewert kann natürlich geändert werden.

Am Besten am Anfang von Button1Click eine Fehlerprüfung einbauen:
Delphi-Quellcode:
Edit1.Text := Trim(Edit1.Text);
If Edit1.Text = '' then begin
  ShowMessage('Bitte irgendwas in Edit1.Text eingeben.');
  Exit;
end;
If StrToIntDef(Edit1.Text,-99) = -99 then begin
  ShowMessage('Bitte eine Zahl in Edit1.Text eingeben.');
  Exit;
end;
Alternativ statt TEdit ein TMaskEdit benutzen, das kann so konfiguriert werden, dass nur Zahlen eingegeben werden können. Spart den Ärger mit nicht in Zahlen umzuwandelnde Zeichen, die Prüfung auf Leerstring sollte aber auch bei TMaskEdit erfolgen.

Warum
Delphi-Quellcode:
Memo1.Text := Pchar(Memo1.Text + 'a');
Delphi-Quellcode:
Memo1.Text := Memo1.Text + 'a';
reicht vollkommen aus.

gangs-taas 7. Apr 2009 16:20

Re: Fehlersuche
 
ich bekomme es nicht hin mit dem Breakpunkt...
auch nicht mit Tutorial ....


ich werde mein Fehlerhaftes Programm jetzt als Selbstentpackendes Archiv (deswegen .exe) hochladen und hoffe ihr findet den fehler ...

Phoenix 7. Apr 2009 16:24

Re: Fehlersuche
 
Zitat:

Zitat von gangs-taas
ich bekomme es nicht hin mit dem Breakpunkt...
auch nicht mit Tutorial ....

Wieso denn nicht?
EInen Breakpoint setzt man mit F5. Das Programm ganz normal mit F9 laufen lassen und wenn der Code dann die Stelle mit dem Haltepunkt kommt hält es an. Mit F7 kann man in eine Funktion / Prozedur hineinspringen und mit F8 kann man die markierte Zeile ausführen ohne hineinzuspringen.

Mit der Maus auf Variablen zeigen zeigt den Wert dieser Variablen an. Das sollte doch ausreichen für den Anfang. Wo klemmt es denn?

gangs-taas 7. Apr 2009 16:28

Re: Fehlersuche
 
es klemmt da, dass ich nur eine procedur habe und das ist der klick auf den button. Aber sofort wenn ich auf ihn klicke
/egal ob mit oder ohne Breakpoint) krieg ich diese fehlermeldung mit einer CPU stelle mit der ich rein garnichts anfangen kann, da ich keine arnung habe was die jetzt besagt ...


CPU-Wert ist
Zitat:

763342EB C9 leave

Phoenix 7. Apr 2009 16:31

Re: Fehlersuche
 
Dann setz den Breakpoint doch gleich mal auf die erste Zeile dieser Prozedur nach dem begin.
Dann hält die an, bevor Du in den Fehler läufst.

gangs-taas 7. Apr 2009 16:34

Re: Fehlersuche
 
hab ich

der hält erst an wenn ich die fehlermedung bekomme und der Aufruf-Stack sagt
Zitat:

auf den Prozess kann nicht zugegriffen werden

Phoenix 7. Apr 2009 16:40

Re: Fehlersuche
 
Das klingt seltsam. Welche Delphi-Version hast Du? Hast Du in den Projekt-Optionen auch eingestellt, dass das Projekt mit Debug-Informationen erstellt wird? Wenn die nicht mit erstellt werden fehlen die dem Debugger logischerweise .

gangs-taas 7. Apr 2009 16:43

Re: Fehlersuche
 
ich habe Turbo Delphi 2005 (ich hoffe das 'Turbo' ist kein Problem ich konnte einfach kein richtiges Delphi finden und das war ne freeware ...)

und bei irg. Optionen habe ich alles so gelassen wie es von der instalation an war ....

gangs-taas 7. Apr 2009 16:50

Re: Fehlersuche
 
also ich hab mal ausprobiert was bei anderen Programmen un dem Breakpoint passiert und in einem wie
Delphi-Quellcode:
begin
x := StrToInt(Edit1.Text);
c := StrToInt(Edit2.Text) ;
y := x + c;
Edit3.Text := IntToStr(y) ;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
x := StrToInt(Edit1.Text);
c := StrToInt(Edit2.Text) ;
y := x - c;
Edit3.Text := IntToStr(y) ;
end;

da bleibt das auch nicht am breakpoint stehen sondern läuft einfach durch ....

DeddyH 7. Apr 2009 16:53

Re: Fehlersuche
 
Wo hast Du den Breakpoint denn gesetzt? Ist da so ein kleines Kreuz drin? Dann hast Du eine Codezeile erwischt, die niemals angesprungen wird (z.B. wegen Optimierung).

gangs-taas 7. Apr 2009 16:57

Re: Fehlersuche
 
okay
er stoppt jetzt auf einmal doch...

vorher hatte ich echt kreuze dadrin..
Probier das jetzt mal mit dem Debuggen ...

gangs-taas 7. Apr 2009 17:00

Re: Fehlersuche
 
okay
also
er stopt an dem Breakpoint hier
Delphi-Quellcode:
 case StrToInt(sTemp) of
und wenn ich dann F9 drücke dann kommt der Fehler

das bedeutet doch, dass der Fehler in dieser Zeile ist oder ?

quendolineDD 7. Apr 2009 17:02

Re: Fehlersuche
 
Jap und das wird bestimmt auch daher kommen weil du
Delphi-Quellcode:
  sTemp1:= Copy(String2, 1, y);
case StrToInt(sTemp) of
geschrieben hast es aber wohl
Delphi-Quellcode:
StrToInt(sTemp1)
heißen müsste.
Ich würde dir raten temporäre Daten auch nur in lokalen Variablen zwischenzuspeichern.

gangs-taas 7. Apr 2009 17:07

Re: Fehlersuche
 
okay
mach ich


vielen dank für eure Hilfe.
Ich bekomme jetzt aber noch ne andere Fehlermeldung aber werde jetzt auch rausfinden wo genau der Fehler ist ^^
Ich fange an meine Logig in dem Programm nochmal zu überdenken bevor ich weiter frage ^^


noch eine letzte frage. Wenn ihr Breakpoints setzt, macht ihr das dann zufällig oder wie ?
weil ich habe eben einfach in jede Zeile einen gesetzt und dann geguckt welche die letzte funktionierende ist aber wie machen das Profies ? ^^

DeddyH 7. Apr 2009 17:26

Re: Fehlersuche
 
Wenn ich auf einen Button klicke und dabei kommt es zum Fehler, steppe ich logischweise erst einmal durch die ButtonClick-Methode ;)

gangs-taas 7. Apr 2009 17:32

Re: Fehlersuche
 
hey,
ich hab schon wieder ein Problem was ich einfach nicht verstehe.


(in meinem Edit2 steht nun 12345678)
Delphi-Quellcode:
String2 := Copy(Edit2.Text,1, Length(Edit2.Text));
y:= StrToInt(Copy(Edit1.Text,1,1));
Schalter := 0;
x := 1 ;
// String stückeln//
Memo1.Text := '';
repeat
begin
  sTemp1:= Copy(String2, 1, y);
 case StrToInt(sTemp1) of
 1234 : Memo1.Text := Pchar(Memo1.Text + 'a');
 5678 : Memo1.Text := Pchar(Memo1.Text + 'b');
  end;
  String2 := Copy(Edit2.Text,(y+1), Length(Edit2.Text));  // String jetzt nur noch von 'einer Zahl nach y' bis zum ende'
y := y+y   ; // Wenn ich diese Zeile entferne (habe gemerkt dass sie sinnlos ist) hängt sich das Programm auf
If (y >= (Length(Edit2.Text))) Then
Schalter := 1  ;
End;
until (schalter = 1) ;

außerdem steht in dem memo-feld hinterher nicht 'ab' wie ich es will sondern nur 'a'
das ist sehr komisch


ich versteh das Programm einfach nicht ....

DeddyH 7. Apr 2009 17:37

Re: Fehlersuche
 
Zitat:

ich versteh das Programm einfach nicht ....
Da haben wir etwas gemeinsam mit dem Unterschied, dass Du es ja selbst geschrieben hast :mrgreen:. Könntest Du evtl. mal nachvollziehbar einrücken, dann ist das besser zu lesen. Und y muss in der Schleife geändert werden, damit die Abbruchbedingung irgendwann eintreffen kann.

gangs-taas 7. Apr 2009 17:48

Re: Fehlersuche
 
Delphi-Quellcode:
String2 := Copy(Edit2.Text,1, Length(Edit2.Text));
y:= StrToInt(Copy(Edit1.Text,1,1));
Schalter := 0;
x := 1 ;
// String stückeln//
Memo1.Text := '';
repeat
      begin
      sTemp1:= Copy(String2, 1, y);
           case StrToInt(sTemp1) of
           1234 : Memo1.Text := Pchar(Memo1.Text + 'a');
           5678 : Memo1.Text := Pchar(Memo1.Text + 'b');
           end;
       String2 := Copy(Edit2.Text,(y+1), Length(Edit2.Text));  // String jetzt nur noch von 'einer Zahl nach y' bis zum ende'
       y := y+y   ; // Wenn ich diese Zeile entferne (habe gemerkt dass sie sinnlos ist) hängt sich das Programm auf
       If (y >= (Length(Edit2.Text))) Then
       Schalter := 1  ;
       End;
until (schalter = 1) ;

so besser ?
wo muss ich das y entfernen ? ich will ja nur machen, das y nicht mehr y+y ist (da unten ...)
aber wenn ich das lösch hängt sichm ien programm auf

DeddyH 7. Apr 2009 17:59

Re: Fehlersuche
 
Delphi-Quellcode:
String2 := Copy(Edit2.Text,1, Length(Edit2.Text)); //was soll denn das hier?
y:= StrToInt(Copy(Edit1.Text,1,1)); //wie bereits erwähnt: Edit1.Text[1] hat denselben Effekt
Schalter := 0;
x := 1 ; //x wird anschließend nie benutzt
// String stückeln//
Memo1.Text := '';
repeat
      begin
      sTemp1:= Copy(String2, 1, y); //im ersten Durchlauf also "1", dann "12" usw.
           case StrToInt(sTemp1) of
           1234 : Memo1.Text := Pchar(Memo1.Text + 'a'); //wieso der Cast nach PChar?
           5678 : Memo1.Text := Pchar(Memo1.Text + 'b');
           end;
       String2 := Copy(Edit2.Text,(y+1), Length(Edit2.Text));  // String jetzt nur noch von 'einer Zahl nach y' bis zum ende'
       //y := y+y   ; // Wenn ich diese Zeile entferne (habe gemerkt dass sie sinnlos ist) hängt sich das Programm auf
       inc(y); //vermutlich war das so gemeint
       If (y >= (Length(Edit2.Text))) Then
         Schalter := 1;
       End;
until (schalter = 1);

gangs-taas 7. Apr 2009 18:27

Re: Fehlersuche
 
Delphi-Quellcode:
String2 := Copy(Edit2.Text,1, Length(Edit2.Text)); //was soll denn das hier? Das brauch ich für nen Eintrag weiter unten und ich wusste nicht wohin ich das sonst schreiben soll
y:= StrToInt(Copy(Edit1.Text,1,1)); //wie bereits erwähnt: Edit1.Text[1] hat denselben Effekt
Schalter := 0;
x := 1 ; {x wird anschließend nie benutzt stimmt hatte ich vergessen löschen (hatte ich aus einer früheren 'version' des Programmes über )}
// String stückeln//
Memo1.Text := '';
repeat
      begin
      sTemp1:= Copy(String2, 1, y); //im ersten Durchlauf also "1", dann "12" usw.
           case StrToInt(sTemp1) of
           1234 : Memo1.Text := Pchar(Memo1.Text + 'a'); //wieso der Cast nach PChar? okay du hast recht das ist unnötig
           5678 : Memo1.Text := Pchar(Memo1.Text + 'b');
           end;
       String2 := Copy(Edit2.Text,(y+1), Length(Edit2.Text));  // String jetzt nur noch von 'einer Zahl nach y' bis zum ende'
       2(y); // ja meinte ich
       If (y >= (Length(Edit2.Text))) Then
         Schalter := 1;
       End;
until (schalter = 1);

DeddyH 7. Apr 2009 18:36

Re: Fehlersuche
 
Erklär doch einmal mit Worten, was der Code machen soll, dann kommen wir vielleicht eher zu einer Lösung.

gangs-taas 7. Apr 2009 18:47

Re: Fehlersuche
 
zu erst soll er die zahlen aus Edit2 einlesen.
dann soll er die ersten 'y' zahlen des Strings (also ehemals Edit2) 'abtrennen' und überprüfen zu welchem Buchstaben die gehören (also in meinem Code 'a' oder 'b')

anschließend soll er von dem übrig geblibenen String wieder die ersten 'y' zahlen abtrennen und das hier auch überprüfen.
das soll er so langem machen, bis alle zahlen überprüft sind.


die anzahl der abzutrennenden Buchstaben/Zahlen (also 'y') ist die erste Zahl in Edit1


aber egal was ich mache ich bekomme immer nur ne fehlermeldung oder nur einen Buchstaben hinterher raus ...

DeddyH 7. Apr 2009 18:52

Re: Fehlersuche
 
Aber nur das erste Zeichen des Edits muss eine Zahl sein, oder hab ich das falsch verstanden?

gangs-taas 7. Apr 2009 18:54

Re: Fehlersuche
 
hey,
nachdem ich Delphi neu gestartet hab funktioniert es jetzt so wie ich es will...
*komisch*

danke für eure bzw deine hilfe !

DeddyH 7. Apr 2009 19:01

Re: Fehlersuche
 
Das mag ich zwar kaum glauben und hatte deshalb schon mit dem Code angefangen, aber wenn es jetzt geht, ist ja gut :)

gangs-taas 7. Apr 2009 19:05

Re: Fehlersuche
 
ist echt so.

vielen dank ^^


sag mal hab schon wieder ne frage.

kan ich in case abfragen variablen bauen ?


also

case StrToInt(sTemp1) of
variable1 : (Memo1.Text + 'a')


geht das ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:10 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