Exception-Klasse RunError(2)

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
KrokodileDandy
Beiträge: 4
Registriert: Mo 24. Mär 2014, 19:46

Exception-Klasse RunError(2)

Beitrag von KrokodileDandy »

Hallo,
ich hab mich jetzt doch mal im Forum registriert, weil ich bei dieser Frage einfach nicht weiterkomme und auch keinen Lösungsansatz gefunden habe, bis auf den obigen Betreff zu googlen und dabei nichts zu finden :( Falls ich vielleicht zuviel Quelltext poste oder das im falschen Forum tut mir das jetzt schon leid, ich hab leider nicht soviel Forumerfahrung....

In meinem Programm-Ordner befinden sich die sechs Textdateien depVAR.txt; dgVAR.txt; searchEP.txt; searchG.txt; KMKrokoQual1EP.txt und KMKrokoQual1G.txt. Die dep und dg -Dateien dienen dazu zwei Variablen zwischen zwei Units zu übergeben, die search-Dateien speichern die Namen aller anderen Dateien die von einer Unit des gleichen Programms erstellt wurden, damit ich sie später wieder aufrufen kann. Die KMKro...-Dateien sind zwei ebendsolche erstellten Dateien in denen mehrere single-Variablen untereinander gespeichert sind.

In der Unit mit der ich das Problem habe sollen die vorher erstellten Dateien mit den Werten ausgelesen werden und aus diesen der Durchschnitt in einer Listbox auf der gleichen Position wie der Name der Datei in der anderen Listbox abgebildet werden. Die Abbildung der Namen in einem Array habe ich hinbekommen, möchte allerdings in ein zweites array an die gleiche Position die Durchschnittswerte setzen. Das Problem ist, dass ich bei meinem jetzigen Stand des Programmes, beim kompilieren die Error-Meldung "Das Projekt 'EPGRechner hat Exception-Klasse >>RunError(2)<< ausgelöst." und verweist auf Zeile 83 mit dem Befehl "Reset(WertDatei);". Hoffe ihr könnt mir helfen und sagen woran es liegt. Auch über verbesserungsvorschläge freu ich mich natürlich :D

Hier der Quellcode der betroffenen Unit:

Code: Alles auswählen

unit d3eprcompare;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls;
 
type
 
  { TForm3 }
 
  TForm3 = class(TForm)
    ButtonCompare: TButton;
    ListBoxCompareWCaption: TListBox;
    ListBoxCompareCaption: TListBox;
    RadioButtonEP: TRadioButton;
    RadioButtonG: TRadioButton;
    procedure ButtonCompareClick(Sender: TObject);
    procedure ButtonSearchClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure RadioButtonEPClick(Sender: TObject);
    procedure RadioButtonGClick(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
    var
       gelesen, twert, dateiN, tgesamt, test: string;
       schleife, wdh: integer;
       wert, gesamt: single;
       dateienListe: array of string;
       werteListe: array of string;
  end;
 
var
  Form3: TForm3;
 
implementation
 
{$R *.lfm}
 
{ TForm3 }
var TextDatei, WertDatei: TextFile;
 
procedure TForm3.ButtonSearchClick(Sender: TObject);
begin
 
end;
 
procedure TForm3.ButtonCompareClick(Sender: TObject);
begin
  //Abbilde Button
 
end;
 
procedure TForm3.FormCreate(Sender: TObject);
begin
  //prüft automatisch auf EP Dateien
AssignFile(TextDatei, 'searchEP.txt');
Reset(TextDatei);
readLn(TextDatei, test);
CloseFile(TextDatei);
if test<>''then begin
  RadioButtonG.Checked:=false;
  ListBoxCompareCaption.Clear;
  gelesen:='KMKrokoQual1EP';
  schleife:=0;
  wdh:=0;
  AssignFile(TextDatei, 'searchEP.txt');
  Reset(TextDatei);
  repeat
    readLn(Textdatei, gelesen);
    ListBoxCompareCaption.Items.Add(gelesen);
    setLength(dateienListe, Length(dateienListe)+1);
    dateienListe[High(dateienListe)]:= gelesen;
  until EOF(TextDatei);
  CloseFile(TextDatei);
  repeat
    AssignFile(WertDatei, gelesen+'.txt');
    Reset(WertDatei);
    repeat
      readLn(WertDatei, twert);
      wert:=StrToFloat(twert);
      gesamt:=gesamt+wert;
      wdh:=wdh+1;
    until EOF(WertDatei);
    CloseFile(WertDatei);
    gesamt:=gesamt/wdh;
    tgesamt:=FloatToStr(gesamt);
    ListBoxCompareWCaption.Items.Add(tgesamt);
    schleife:=schleife+1;
  until schleife=Length(dateienListe);
end;
end;
 
procedure TForm3.RadioButtonEPClick(Sender: TObject);
begin
  //EP Box Auswahl
  RadioButtonG.Checked:=false;
  ListBoxCompareCaption.Clear;
  AssignFile(TextDatei, 'searchEP.txt');
  Reset(TextDatei);
  repeat
    readLn(Textdatei, gelesen);
    ListBoxCompareCaption.Items.Add(gelesen);
  until EOF(TextDatei);
  CloseFile(TextDatei);
end;
 
procedure TForm3.RadioButtonGClick(Sender: TObject);
begin
  //Gold Box Auswahl
  RadioButtonEP.Checked:=false;
  ListBoxCompareCaption.Clear;
  AssignFile(TextDatei, 'searchG.txt');
  Reset(TextDatei);
  repeat
    readLn(TextDatei, gelesen);
    ListBoxCompareCaption.Items.Add(gelesen);
  until EOF(TextDatei);
  CloseFile(TextDatei);
end;
 
end.
 

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Exception-Klasse RunError(2)

Beitrag von theo »

RunError 2 bedeutet "Datei nicht gefunden"

http://www.freepascal.org/docs-html/user/userap4.html

KrokodileDandy
Beiträge: 4
Registriert: Mo 24. Mär 2014, 19:46

Re: Exception-Klasse RunError(2)

Beitrag von KrokodileDandy »

Ok dann hab ich anscheinend doch nicht ausreichend gesucht....

Die Datei wird ja eigentlich mit AssignFile aufgerufen und in meinem quelltext aus dem Namen und der Endung .txt der Pfad zur Datei zusammengefügt. Könnte es dann sein, dass ich den Dateinamen nicht mit "VARIABLE+'.txt' " zusammensetzen kann? Ich benötige jedoch eine Möglichkeit, um die Dateien flexibel aufrufen zu können und da fällt mir nur die Lösung über einen string ein oder ist das auch anders möglich?

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Exception-Klasse RunError(2)

Beitrag von Michl »

KrokodileDandy hat geschrieben:Könnte es dann sein, dass ich den Dateinamen nicht mit "VARIABLE+'.txt' " zusammensetzen kann?
Doch, das ist möglich!

Schreib Dir doch den Namen der zu öffnenden Datei in einen String (inkl. Pfad) und überprüfe bei dem Fehler (mittels Breakpoint) den Inhalt des Strings und ob die Variable wirklich so auf dem Medium/auf der Festplatte vorhanden ist (inkl. Leerzeichen/Directoryseparator etc.).

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Exception-Klasse RunError(2)

Beitrag von m.fuchs »

KrokodileDandy hat geschrieben:[...]Die dep und dg -Dateien dienen dazu zwei Variablen zwischen zwei Units zu übergeben, [...]

Verstehe ich das richtig? Du hast bespielsweise eine Variable X in Unit1. Deren Inhalt soll jetzt in Unit3. Und dafür speicherst du den Inhalt in einer Datei und lässt ihn dann von Unit3 wieder auslesen?
Zuletzt geändert von m.fuchs am Do 17. Apr 2014, 11:11, insgesamt 1-mal geändert.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

KrokodileDandy
Beiträge: 4
Registriert: Mo 24. Mär 2014, 19:46

Re: Exception-Klasse RunError(2)

Beitrag von KrokodileDandy »

m.fuchs hat geschrieben:Verstehe ich das richtig? Du hast bespielsweise eine Variable X in Unit1. Deren Inhalt soll etzt in Unit3. Und dafür speicherst du den Inhalt in einer Datei und lässt ihn dann von Unit3 wieder auslesen?


Ja so mache ich das :D Wahrscheinlich ist das ziemlich umständlich, aber das ist mein erstes Programm in Pascal und dazu noch das erste Programm überhaupt mit mehreren Units und Dateien. Davor habe ich nur das "Schuljava" gelernt.

Michl hat geschrieben: [...]überprüfe bei dem Fehler (mittels Breakpoint) den Inhalt des Strings und ob die Variable wirklich so auf dem Medium/auf der Festplatte vorhanden ist (inkl. Leerzeichen/Directoryseparator etc.).


Ok das werde ich versuchen, klingt auf den ersten Blick *-* irgendwie so ähnlich wie die Try...Catch Anweisung.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Exception-Klasse RunError(2)

Beitrag von wp_xyz »

Wahrscheinlich ist das ziemlich umständlich

Absolut, gewöhn dir solche Konstruktionen nicht an, davon kommst du nie mehr wieder weg!

Wenn deine Unit3 einen Wert X zur Verfügung stellt, deklariere ihn ihm "interface"-Teil der Unit. Damit kann jede andere Unit, die Unit3 verwendet, auf X zugreifen:

Code: Alles auswählen

 
unit Unit3;
interface
 
procedure BerechneXinUnit3;
 
var
  X: Integer;
 
implementation
 
procedure BerechneXInUnit3;
begin
  X := 1;
end;
 
end.
 
-------------------
 
unit Unit1;
 
interface
 
//uses  Unit3;  // könnte auch hier stehen, besser aber im Implementation-Teil, weil in diesem Beispiel im Interface-Teil keine Deklaration aus Unit3 benötigt wird.
 
procedure VerwendeXAusUnit3;
 
implementation
 
uses   // siehe Kommentar oben
  Unit3;
 
procedue VerwendeXAusUnit3;
begin
  BerechneXInUnit3;
  ShowMessage('X in Unit3 hat den Wert ' + IntToStr(X));
end;
 
end;
 

KrokodileDandy
Beiträge: 4
Registriert: Mo 24. Mär 2014, 19:46

Re: Exception-Klasse RunError(2)

Beitrag von KrokodileDandy »

Also ich habe jetzt die Unit mit dem vorherigem Error gelöscht und eine neue erstellt. Der Error ist erstmal verschwunden, also ist das Ursprungsthema abgehakt :D . Auch die depVAR.txt und dgVAR.txt sind jetzt weg und die Variablen werden jetzt über die interface-deklaration übertragen. Jetzt frage ich mich ob ich die searchEP.txt und searchG.txt -Dateien auch weglassen könnte und anstatt die Namen der Dateien in diese Dateien zu speichern, einfach alle Text-Dateien im Ordner zu erkennen und auszugeben. Auch wie ich Dateien in lokale Unterodner speichern kann würde mich interessieren. Zu beiden Themen habe ich bereits bei Google gesucht aber nicht viel schlüssiges(für meinen Wissensstand) gefunden. Vielleicht könnte mir jmd. erklären wie er denn sucht bzw. was er anders macht als ich. Und: gibt es eine interne Lazarusforum Such-Funktion?

Danke schon mal im voraus für eure Antworten :D

Antworten