![]() |
File Access: EAccessViolation
Scheint, zu viele meiner Hirnzellen sind abgestorben...
Wo liegt der Fehler? Ich bekomme eine EAccessViolation-Fehlermeldung beim Dateilesen.
Delphi-Quellcode:
for Runde:=0 to FileListBoxReports.Items.Count-1 do
begin NameOfFile:=ReportDirectory+FileListBoxReports.Items[Runde]; if Pos('Crystalline Carbonide',NameOfFile)>0 then AssignFile(CrystallineCarbonideFile,NameOfFile); if Pos('Fermionic Condensates',NameOfFile)>0 then AssignFile(FermionicCondensatesFile,NameOfFile); if Pos('Fernite Carbide',NameOfFile)>0 then AssignFile(FerniteCarbideFile,NameOfFile); if Pos('Ferrogel',NameOfFile)>0 then AssignFile(FerrogelFile,NameOfFile); if Pos('Fullerides',NameOfFile)>0 then AssignFile(FulleridesFile,NameOfFile); if Pos('Hypersynaptic Fibers',NameOfFile)>0 then AssignFile(HypersynapticFibersFile,NameOfFile); if Pos('Nanotransistors',NameOfFile)>0 then AssignFile(NanotransistorsFile,NameOfFile); if Pos('Phenolic Composites',NameOfFile)>0 then AssignFile(PhenolicCompositesFile,NameOfFile); if Pos('Sylramic Fibers',NameOfFile)>0 then AssignFile(SylramicFibersFile,NameOfFile); if Pos('Titanium Carbide',NameOfFile)>0 then AssignFile(TitaniumCarbideFile,NameOfFile); if Pos('Tungsten Carbide',NameOfFile)>0 then AssignFile(TungstenCarbideFile,NameOfFile); // Reaction Basics if Pos('Caesarium Cadmide',NameOfFile)>0 then AssignFile(CaesariumCadmideFile,NameOfFile); if Pos('Carbon Polymers',NameOfFile)>0 then AssignFile(CarbonPolymersFile,NameOfFile); if Pos('Ceramic Powder',NameOfFile)>0 then AssignFile(CeramicPowderFile,NameOfFile); if Pos('Crystallite Alloy',NameOfFile)>0 then AssignFile(CrystalliteAlloyFile,NameOfFile); if Pos('Dysporite',NameOfFile)>0 then AssignFile(DysporiteFile,NameOfFile); if Pos('Fernite Alloy',NameOfFile)>0 then AssignFile(FerniteAlloyFile,NameOfFile); if Pos('Ferrofluid',NameOfFile)>0 then AssignFile(FerrofluidFile,NameOfFile); if Pos('Fluxed Condensates',NameOfFile)>0 then AssignFile(FluxedCondensatesFile,NameOfFile); if Pos('Hexite',NameOfFile)>0 then AssignFile(HexiteFile,NameOfFile); if Pos('Hyperflurite',NameOfFile)>0 then AssignFile(HyperfluriteFile,NameOfFile); if Pos('Neo Mercurite',NameOfFile)>0 then AssignFile(NeoMercuriteFile,NameOfFile); if Pos('Platinum Technite',NameOfFile)>0 then AssignFile(PlatinumTechniteFile,NameOfFile); if Pos('Prometium',NameOfFile)>0 then AssignFile(PrometiumFile,NameOfFile); if Pos('Rolled Tungsten Alloy',NameOfFile)>0 then AssignFile(RolledTungstenAlloyFile,NameOfFile); if Pos('Silicon Diborite',NameOfFile)>0 then AssignFile(SiliconDiboriteFile,NameOfFile); if Pos('Solerium',NameOfFile)>0 then AssignFile(SoleriumFile,NameOfFile); if Pos('Sulfuric Acid',NameOfFile)>0 then AssignFile(SulfuricAcidFile,NameOfFile); if Pos('Titanium Chromide',NameOfFile)>0 then AssignFile(TitaniumChromideFile,NameOfFile); if Pos('Vanadium Hafnite',NameOfFile)>0 then AssignFile(VanadiumHafniteFile,NameOfFile); end; WerteAlt[0]:='0'; if (CheckBoxCrCaR.Checked=True and CheckBoxCrCaR.Enabled) then begin Reset(CrystallineCarbonideFile); Readln(CrystallineCarbonideFile,Zeile); repeat Readln(CrystallineCarbonideFile,Zeile); if Pos('True',Zeile)>0 then begin WerteNeu:=Explode(',',Zeile,0); if StrToFloat(WerteNeu[0])>StrToFloat(WerteAlt[0]) then begin if WerteNeu[11]='30000142' then WerteAlt:=WerteNeu; end; end; until EOF(CrystallineCarbonideFile); CloseFile(CrystallineCarbonideFile); VerkaufsPreis01:=StrToFloat(WerteAlt[0]); label1.Caption:=floattostr(VerkaufsPreis01); end; |
Re: File Access: EAccessViolation
In welcher Zeile? Laß das Programm mal durch den Debugger laufen.
|
Re: File Access: EAccessViolation
Ein Debugger sagt mehr als tausend Worte :warn:
Neben folgenden Problemen, wie -Dateien haben weniger als 2 Zeilen -NameOfFile falsch zusammengesetzt (da kann u.U ein "\" fehlen) -die Datei existiert nicht einmal geht auch noch: - Pos('Crystalline Carbonide',NameOfFile)=0 und (CheckBoxCrCaR.Checked=True and CheckBoxCrCaR.Enabled)=TRUE Der Fehler kann auch hier sein: WerteNeu[11]='30000142' oder hier: WerteNeu[0] Da wissen wir wohl zu wenig. Anmerkung: Reciht es nicht, wenn du nur eine Variable für textfile hast und nur den Namen unterschiedlich zuweist? |
Re: File Access: EAccessViolation
Erstmal das: At address 004044DC...
Aber ich will Euch die gewünschten Debugger-Informationen geben. Wie benutze ich den Debugger? Oder ich biete an, alle Dateien in einem ZIP-Archiv bereitzustellen. Wäre das okay? |
Re: File Access: EAccessViolation
Zitat:
|
Re: File Access: EAccessViolation
Zitat:
Und dann drückst du [F5] --> es erscheint ein roter Streifen (Breakpoint genannt). Den kannst du später mit [F5] genauso wieder ausschalten (Für Breakpoints setzen und löschen gibts noch mehr Möglichkeiten, u.a. bedingte Breakpoints) Du machst den einfachen Breakpoint, damit hält dein Programm automatisch an der Stelle an. Dann gibts folgende Tasten: [F9] Programm normal weiter ausführen (bzw. bis zum nächsten Breakpoint) [F8] eine Zeile ausführen und wieder anhalten [F7] eine Zeile und evtl. in UnterProgramm/Prozedur/Funktion springen [F4] Bis zum Cursor den Code ausführen [F5] weitere Breakpints setzen, löschen und ganz wichtig [Strg]+[F5]: Da kannst du den Inhalt von Variablen dir ansehen (und mit [strg]+[F7] auch ändern) |
Re: File Access: EAccessViolation
Liste der Anhänge anzeigen (Anzahl: 2)
MKinzler und vor allem Sirius:
Danke für Eure Antworten! Breakpoints: getan, aber das Program endet noch immer an der letzten Zeile des Progreammes (die nun blau hinterlegt ist), und gibt mir dort den Fehler aus... Ich werde mal alles packen, und Euch als ZIP geben. Die eine ZIP-Datei beinhaltet das Programm, die andere auszuwertende Logs. Das Programm updatet sich mittels TTimer jede Sekunde einmal und prüft, ob relevante Logs (Marktdaten) vorhanden sind. Dann soll es die Dateien auslesen und (irgendwann) die Kosten für die Reaktionsprodukte errechnen. Gelöste Probleme: - Mehrere Dateiversionen eines Produktes existieren - Dateinamen variable (durch integriertes Datum) Zu tun: - Absturz des Programmes verhindern - Sortieren der Werte in den Marktdateien - Werte errechnen |
Re: File Access: EAccessViolation
So, ich hab mal kurz drübergeschaut. Aber aufgrund fehlender Zeit konnte ich nicht viel machen.
1. "Application.Terminate": das ist wie aus dem fahrenden Auto springen. Einfach das Hautpformular schließen ist schöner (so mit anhalten, Motor aus, aussteigen und abschließen) --> Application.terminate durch einfaches "close" ersetzen. so und jetzt zu deiner Funktion 2.1. Der Fehler tritt bei WerteAlt[0]='0' auf. WerteAlt ist ein TStringDynArray (also array of string), also ein dynamisches Array. Schau dir an, wie dynamische arrays funktionieren (mit: setlength, finalize, copy). Fürs erste reicht es davor ein "setlength(WerteAlt,1);" zu setzen. 2.2. Dann ist er bei mir rausgeflogen bei "strtofloat(Werteneu[0])". Das lag daran, dass er bei mir als Dezimaltrennzeichen ein "," erwartet hat und nur einen "." finden konnte (also mit dem Punkt nix anzufangen wusste). Hier kann man mit TFormatsettings was machen. 2.3. Das nächste Problem liegt hier WerteAlt:=WerteNeu funktioniert nicht so, wie du es willst. Das sind beides dynamische arrays, also in erster Instanz nur Zeiger. Du kopierst also nur die Adresse aber nicht den Inhalt (ist wie, als würdest du deinem Kunpel alle deine Möbel schenken wollen, stattdessen ziehst du bei ihm ein). Mach mal so: "WerteAlt:=copy(WerteNeu)" Soviel zu den offensichtlichen Dingen Jetzt willst du noch Werte sortieren. Dann mach die mal mit TStringList vertraut (inkl Loadfromfile). Was du mit Werte errechnen meinst, weis ich nicht. Noch etwas: Es wäre nicht schlecht wenn du die Funktion aus dem Timer in einen eigenen Thread legen könntest (such mal nach TThread). Mehr will ich nicht meckern :angel: Nur bei manchen Sachen hab ich mir gedacht, dass man die PRogrammierweise nochmal näher durchleuchten sollte. Mir fehlt aber die Zeit. |
Re: File Access: EAccessViolation
Nein, das ist kein Meckern, sondern Hilfe der besten Art! Ich danke Dir dafür ungemein! Ich werde jetzt erstmal Deine Hinweise auswerten und anwenden...
|
Re: File Access: EAccessViolation
deleted - wie kann ich diesen Posting löschen (nur diesen, nicht die vorherigen)?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:42 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 by Thomas Breitkreuz