![]() |
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:
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 |
Re: Fehlersuche
Zitat:
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... |
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 ![]() |
Re: Fehlersuche
Was passiert, wenn Du
Zitat:
Delphi-Quellcode:
ä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.
y:= StrToInt(Copy(Edit1.Text,1,1));
|
Re: Fehlersuche
Wäre
Delphi-Quellcode:
nicht etwas lesbarer? ;) Es würde außerdem die Fehlerquellen minimieren.
y:= StrToInt(Edit1.Text[1]);
Genauso kannst du Edit1.Text direkt String2 zuweisen.
Delphi-Quellcode:
Edit:
String2 := Edit2.Text;
Das Beste wäre eine Eingangsprüfung auf Leerstrings. Oder TryStrToInt. |
Re: Fehlersuche
Zitat:
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:
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 |
Re: Fehlersuche
Zitat:
|
Re: Fehlersuche
Zitat:
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:
so einfach funktioniert ... ich dachte ich bekomme dann wieder irgend ne blö** fehlermeldung ....
String2 := Edit2.Text;
aber ich werde es jetzt mal ausprobieren |
Re: Fehlersuche
Zitat:
Delphi-Quellcode:
y:= StrToInt(Copy(Edit1.Text,0,1));
|
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] |
Re: Fehlersuche
Zitat:
|
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 ... |
Re: Fehlersuche
xD
das fänd ich zwar auch nicth schlecht ich würde aber lieber verstehen wo mein fehler ist ^^ |
Re: Fehlersuche
Dann setz doch einen Haltepunkt, steppe mit F8 durch und schau, wo es knallt.
|
Re: Fehlersuche
Hallo,
das kann nicht gehen:
Delphi-Quellcode:
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).
y:= StrToInt(Copy(Edit1.Text,0,1));
Vorschlag:
Delphi-Quellcode:
Zuerst mal alle Leerzeichen wegwerfen (Trim).
y:= StrToIntDef(Copy(Trim(Edit1.Text),1,1),1);
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:
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.
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; Warum
Delphi-Quellcode:
Memo1.Text := Pchar(Memo1.Text + 'a');
Delphi-Quellcode:
reicht vollkommen aus.
Memo1.Text := Memo1.Text + 'a';
|
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 ... |
Re: Fehlersuche
Zitat:
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? |
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:
|
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. |
Re: Fehlersuche
hab ich
der hält erst an wenn ich die fehlermedung bekomme und der Aufruf-Stack sagt Zitat:
|
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 .
|
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 .... |
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 .... |
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).
|
Re: Fehlersuche
okay
er stoppt jetzt auf einmal doch... vorher hatte ich echt kreuze dadrin.. Probier das jetzt mal mit dem Debuggen ... |
Re: Fehlersuche
okay
also er stopt an dem Breakpoint hier
Delphi-Quellcode:
und wenn ich dann F9 drücke dann kommt der Fehler
case StrToInt(sTemp) of
das bedeutet doch, dass der Fehler in dieser Zeile ist oder ? |
Re: Fehlersuche
Jap und das wird bestimmt auch daher kommen weil du
Delphi-Quellcode:
geschrieben hast es aber wohl
sTemp1:= Copy(String2, 1, y);
case StrToInt(sTemp) of
Delphi-Quellcode:
heißen müsste.
StrToInt(sTemp1)
Ich würde dir raten temporäre Daten auch nur in lokalen Variablen zwischenzuspeichern. |
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 ? ^^ |
Re: Fehlersuche
Wenn ich auf einen Button klicke und dabei kommt es zum Fehler, steppe ich logischweise erst einmal durch die ButtonClick-Methode ;)
|
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 .... |
Re: Fehlersuche
Zitat:
|
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 |
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); |
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); |
Re: Fehlersuche
Erklär doch einmal mit Worten, was der Code machen soll, dann kommen wir vielleicht eher zu einer Lösung.
|
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 ... |
Re: Fehlersuche
Aber nur das erste Zeichen des Edits muss eine Zahl sein, oder hab ich das falsch verstanden?
|
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 ! |
Re: Fehlersuche
Das mag ich zwar kaum glauben und hatte deshalb schon mit dem Code angefangen, aber wenn es jetzt geht, ist ja gut :)
|
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 02:34 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