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 File Access: EAccessViolation (https://www.delphipraxis.net/84054-file-access-eaccessviolation.html)

Hirnsausen 10. Jan 2007 18:39


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;

mkinzler 10. Jan 2007 19:14

Re: File Access: EAccessViolation
 
In welcher Zeile? Laß das Programm mal durch den Debugger laufen.

sirius 10. Jan 2007 19:31

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?

Hirnsausen 10. Jan 2007 21:31

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?

mkinzler 10. Jan 2007 21:35

Re: File Access: EAccessViolation
 
Zitat:

Aber ich will Euch die gewünschten Debugger-Informationen geben. Wie benutze ich den Debugger?
Starte die Anwendung in der IDE

sirius 11. Jan 2007 08:08

Re: File Access: EAccessViolation
 
Zitat:

Zitat von Hirnsausen
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?

Du gehst auf die erste Zeile (oder noch vorher), ab der du einen Fehler vermutest (der zum Abbruch des Programms führt). Am besten halt auf die erste Zeile des geposteten Codes.
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)

Hirnsausen 11. Jan 2007 10:45

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

sirius 11. Jan 2007 11:44

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.

Hirnsausen 11. Jan 2007 11:57

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...

Hirnsausen 11. Jan 2007 20:49

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.
Seite 1 von 2  1 2      

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