Autor |
Beitrag |
tempuss13
Hält's aus hier
Beiträge: 6
|
Verfasst: Mi 24.02.10 22:45
Hallo Delphi-Freunde!
Hab so einiges versucht, hänge hier fest.
Ich lese aus einer Datei div. Zeilen ein, hier sind Text und Datum(in Stringformat) abgelegt.
Wenn ich den 2-stelligen String in die entspr. Tageszahl umwandle, knallt mir immer eine Exception auf den Bildschirm.
In ca. 5 Fäleen von knapp 100 Zeilen steht, wo das Tages-Datum stehen sollte, z.B. <li>, wie auch immer das in die Datei gelangt.
Ich will solche Fehler abfangen, aber WIE???
Mit try und except klappt das nicht! Müsste ich noch einen Compilerschalter nutzen? Z.B. {$V-}?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TForm1.Button1Click(Sender: TObject); var done: boolean; i: integer; Dummy: string; begin repeat done := true; try for i := 0 to 780 do if strToInt(day[i]) > strToInt(day[i+1]) then begin Dummy := day[i]; day[i] := day[i+1]; day[i+1] := Dummy; done := false; end; except showmessage('KEINE Zahl!'); end; until done; end; |
Alles klappt bestens, bis der Tag mit <li> kommt(bei ca. 300. Zeile).
Unter TP hab ich solche Probs nicht so in Erinnerung.
Für den richtigen Tip/Trick wäre ich wirklich dankbar!
Gruß Uli
|
|
der organist
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: Mi 24.02.10 22:51
versuch mal was mit StrToIntDef, da kannst du noch nen Parameter angeben, der zurückgegeben wird, wenns nen Fehler gibt. Wenn du da z.B -1 nimmst und dann auf -1 abfragst, weisst du, ob es gelaufen is oder nich. Zum andern gibts da imho noch Funktionen wie StrToInfExecpt, schlag mich nich, iwas gabs da, schau mal im Forum...........................................................
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 24.02.10 22:55
tempuss13 hat folgendes geschrieben : | Mit try und except klappt das nicht! |
Wahnsinns Fehlerbeschreibung.
|
|
tempuss13 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mi 24.02.10 23:15
Danke Dir erstmal!
Zwar erhalte ich mit mit StrToIntDef keine Fehlermeldung, dafür kommen astronomische Zahlen raus..
Ich versuche es eben weiter.
...
Was soll ich zu dem Fehler schreiben?
Es kommt eine Box mit 'Exception'.
Habe einen Screenshot davon als Datei angehängt.
Einloggen, um Attachments anzusehen!
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 24.02.10 23:24
Dann starte die Exe mal nicht aus der IDE.
Und hättest du das gleich gesagt, dann hätte man dich gleich darauf hinweisen können.
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mi 24.02.10 23:25
Hast du mal in den Eingangswerten geschaut, ob da nicht doch li drin steht?
Ansonsten: Das ist nur eine Delphi Exception, start das Programm mal aus dem Explorer, dann taucht die nicht auf.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Chemiker
      
Beiträge: 194
Erhaltene Danke: 14
XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit
D7, BDS 2006, RAD Studio 2009+C++, Delphi XE2, XE3, VS 2010 Prof.
|
Verfasst: Mi 24.02.10 23:32
Hallo tempuss13,
ich habe Deine Frage nicht so ganz verstanden, aber vielleicht funktioniert Dein Vorhaben mit:
Delphi-Quelltext 1: 2:
| TryStrToFloat(Text, Zahl) TryStrToDate(Text,Datum) |
Bis bald Chemiker
|
|
tempuss13 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mi 24.02.10 23:32
Hallo Luckie!
Ich denke wohl nicht so weit, um gleich alle interressanten Fakten aufzulisten.
Habe eben in der Exceptionenbox einen Haken gesetzt, unter:
"Diesen Fehler ignorieren"
Nun klappt es zwar, kein Absturz und der Exceptionblock wird abgearbeitet.
Aber das ist doch sicher keine saubere Lösung, oder?
In meinem Delphi-Buch steht ausdrücklich drin, dass bei Fehlern der Except-Block abgearbeitet wird.
Doch der wird garnicht erreicht.
Danke Dir!!!
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 24.02.10 23:47
tempuss13 hat folgendes geschrieben : | Nun klappt es zwar, kein Absturz und der Exceptionblock wird abgearbeitet. |
Zitat: | Doch der wird garnicht erreicht. |
Du widersprichst dir.
|
|
tempuss13 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mi 24.02.10 23:54
Hallo Chemiker!
Was es alles für Befehle gibt!?
Habe 3 Delphi Bücher, in KEINEM steht sowas drin- traurig!
Auf jeden Fall versuche ich es damit auch noch.
Kann dabei ja nur lernen.
Alte TP-Bücher zeigen alle Befehle in Listenform oder ähnlich an.
Warum gibt es sowas nicht für Delphi??
Die Delphi-Bücher zeigen eher Beispiele auf,
doch fehlt so was wie eine Legende, ein Buch mit allen Delphi-Befehlen.
Vielleicht stelle ich mir das zu einfach vor.
Gruß Uli
--- Moderiert von Narses: Beiträge zusammengefasst---
Luckie BITTE!
Der Block wurde nicht erreicht, als ich den Ignorieren-Haken in der Exception-Meldung noch nicht gesetzt hatte!
Jetzt ist der Haken GESETZT!
Und jetzt wird der except-Block ABGEARBEITET!
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Do 25.02.10 00:02
Der Except Block wurde vorher auch abgearbeitet.. aber wenn man sein Programm aus Delphi heraus ausführt, hält Delphi trotzdem an.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
tempuss13 
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 25.02.10 00:05
Das ist auf jeden Fall ein wertvoller Hinweis!!!
Warum steht das in meinem Buch nicht drin??
DANKE Dir!
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Do 25.02.10 00:06
ALLE Delphi-Befehle??? Dann könntest du dir einen ganzen Aktenschrank anschaffen, nur um eine Auflistung unter zu bekommen.
Und die Exeption, die du gesehen hast, wird lediglich von der IDE ausgelöst bzw. dort angezeigt, um dir als Entwickler einen Hinweis zu geben. Du sollst nicht das Häkchen setzen, sondern die EXE aus dem Explorer heraus starten...
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Do 25.02.10 00:08
Kein Ahnung, was hast du denn für ein Buch?
Ich hatte "Jetzt lerne ich Delphi" ( www.amazon.de/Jetzt-...267049225&sr=8-1) - das hat mir eigentlich ganz gut geholfen
P.S.: Damit der except-Block abgearbeitet wird, muss man glaube ich auch Fortsetzen klicken - wenn du auf Anhalten klickt macht er natürlich genau das. Er hält an 
|
|
tempuss13 
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 25.02.10 00:21
Nacheinander:
Wie ich schon schrieb: stelle mir das wohl zu einfach vor.
Und dass nur die IDE den Fehler zeigt, für den Programmierer und als Exe nicht, das wusste ich nicht.
In TP habe ich wirklich Erfahrung sammeln können.
Doch über Delphi muss ich ich noch viel lernen!
Das Buch, dass ich habe heißt: "Delphi 6 in Team"
DANKE Euch allen!
|
|
Gammatester
      
Beiträge: 328
Erhaltene Danke: 101
|
Verfasst: Do 25.02.10 00:24
Xentar hat folgendes geschrieben : | Der Except Block wurde vorher auch abgearbeitet.. |
Bei Floatingpoint-Exceptions wäre ich vorsichtig mit solchen Behauptungen, wenn ich das nicht selbst gesehen habe. Manche FPU-Exeptions werden, erst beim nächsten FPU-Befehl ausgelöst, und das kann uU meilenweit außerhalb des try except sein.
@tempuss13: wenn's mit TP geklappt, kannst Du ja auch unter Delphi Val(S; var V; var Code: Integer); benutzen und Code auswerten (hat allerdings den Nachteil, daß das Dezimaldings immer ein '.' ist).
Moderiert von Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Do 25.02.10 10:27
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Gammatester
      
Beiträge: 328
Erhaltene Danke: 101
|
Verfasst: Do 25.02.10 14:44
Xentar hat folgendes geschrieben : | Gammatester hat folgendes geschrieben : | Xentar hat folgendes geschrieben : | Der Except Block wurde vorher auch abgearbeitet.. |
Bei Floatingpoint-Exceptions wäre ich vorsichtig mit solchen Behauptungen, wenn ich das nicht selbst gesehen habe. Manche FPU-Exeptions werden, erst beim nächsten FPU-Befehl ausgelöst, und das kann uU meilenweit außerhalb des try except sein. |
Ist mir bisher nicht (bewusst) untergekommen.
Über ein Beispiel würde ich mich freuen. |
Ein Beispiel, zwar nicht inhaltlich besonders interessant aber reproduzierbar für Delphi 5-7, Win98 und/oder XP:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Math;
type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
{$ifdef VER130} const Nan = 0/0; {$endif}
procedure TForm1.Button2Click(Sender: TObject); begin Button2.Caption := FloatToStr(random); end;
procedure TForm1.Button1Click(Sender: TObject); var x: extended; begin x := Nan; try if x<>x then Button1.Caption := 'x<>x'; except Button1.Caption := 'Except'; end; end;
end. |
Die Applikation ist ein Form mit 2 Buttons. Drückt man Button1 einmal, scheint sich nichts zu ändern, drückt man dann Button2 gibts eine "Invalid Floating point exception". Drückt man Button1 zweimal ändert sich Button1.caption zu 'Except'. Allgemein (aber nicht immer): Drückt man Button1 ein ungerade Zahl, dann Button2 gibts die Exception, bei gerader Anzahl nicht und Button2.caption zeigt eine neue Zufallszahl.
|
|
trm
      
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: Do 25.02.10 17:35
Hallo tempuss13,
wenn Du wirklich eine exeptionfreie Alternative suchst, rate ich Dir (weil ich das Problem kenne), den String, der zu überprüfen ist, Char für Char durchgehst und das Zeichen auf eine ziffer testest. Somit brauchst Du noch nicht einmal einen Try..Except - Block
Wer ASM gut kann, der könnte ja mal ein ASM-Beispiel mit Registern (?) posten. Würde mich auch interessieren.
Hier die NORMALE Vorgehensweise, welche in der IDE eine Schutzverletzung erzeugt, wenn es sich nicht um eine reine Zahlenfolge im String handelt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| function Test_Integer(Dummy: string): Boolean; begin
Result := False; if Length(Dummy) < 1 then Exit; try StrToInt(Dummy); except Exit; end; Result:=True;
end; |
Hier die Version, welche Char für Char prüft und bei INTEGER-Werten 100% keine Exeption auslöst:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| function TForm1.Test_Integer2(Dummy: string): Boolean; var x: Integer; begin
Result := False; if Length(Dummy) < 1 then Exit;
for x := 1 to Length(Dummy) do if not (ORD(Dummy[x]) in [48..57]) then Exit;
Result := True;
end; |
Gruß
~Mathias
Edit: Syntaxfehler bei for x := 1 to Length(Dummy) do (war for x:=0 vorher)
Zuletzt bearbeitet von trm am Do 25.02.10 19:14, insgesamt 1-mal bearbeitet
|
|
SvenAbeln
      
Beiträge: 334
Erhaltene Danke: 3
|
Verfasst: Do 25.02.10 18:00
|
|