Autor Beitrag
Klaudius
Hält's aus hier
Beiträge: 8

Win XP
D7
BeitragVerfasst: So 17.07.05 12:50 
Hallo,

Ein Text File wird in einen String geschrieben und soll dann an eine Auswerte-Procedure übergeben werden.
Bei größeren Strings bekomme ich zur Laufzeit an der im Code gekennzeichneten Stelle einen EAccessViolation Error.

ausblenden volle Höhe Delphi-Quelltext
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:
procedure TForm1.LoadClick(Sender: TObject);
var F_Data: string;
begin
  if OpenDialog1.Execute then
    F_Data := FileToString(ExtractFileName(Opendialog1.FileName));
  Auswerten(F_Data); //<--- Hier kommt die Fehlermeldung
end;
//*********** Daten Auswerten **************************************************

procedure TForm1.Auswerten(Empfang: string);
begin
  for i := 1 to Length(Empfang) do
  begin
//hier wird der String nach relevanten Daten untersucht
  end;
end;
//*********** TextFile in String schreiben *************************************

function TForm1.FileToString(const AFilename: string; StartPos: Integer = 0;
  EndPos: Integer = 0): string;
var
  FileStream: TFileStream;
  wlCount: Integer;
begin
  if FileExists(AFilename) then
  begin
    if StartPos < 0 then StartPos := 0;
    FileStream := TFileStream.Create(AFilename, fmOpenRead or fmShareDenyWrite);
    try
      if (EndPos <= StartPos) or (EndPos > FileStream.Size) then
        EndPos := FileStream.Size;
      wlCount := EndPos - StartPos;
      if FileStream.Size > StartPos then
      begin
        SetLength(Result, wlCount);
        FileStream.Seek(StartPos, soFromBeginning);
        FileStream.Read(Result[1], wlCount);
      end;
    finally
      FileStream.Free;
    end;
  end
  else
    Result := '';
end;


Die Hilfe sagt dazu:
EAccessViolation wird ausgelöst, wenn eine Anwendung
- einen nil- (Delphi) bzw. NULL- (C++) Zeiger dereferenziert.
- in den Speicher schreibt, der für ausführbaren Code reserviert ist,
- versucht, auf eine Speicheradresse zuzugreifen, für die der Anwendung
kein virtueller Speicher zugewiesen wurde.

Leider hilft mir das nicht wirklich weiter ! :?

Kann mir jemand einen Tip geben.
Warum tritt der Fehler auf ?
Und wie kann ich ihn vermeiden ?
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: So 17.07.05 13:01 
ausblenden Delphi-Quelltext
1:
2:
3:
  if OpenDialog1.Execute then  
    F_Data := FileToString(ExtractFileName(Opendialog1.FileName));  
  Auswerten(F_Data); //<--- Hier kommt die Fehlermeldung


da fehlt ein begin und end. Wenn der user auf abrechen im Dialogfeld drückt, soll bestimmt nicht auswerten aufgerufen werden.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  if OpenDialog1.Execute then  
    begin
      F_Data := FileToString(ExtractFileName(Opendialog1.FileName));  
      Auswerten(F_Data); 
    end;

Außerdem "extractfilename", warum?

Das mit dem filestrem ist auch zu aufwendig, der Fehler liegt wahrscheinlich auch dort. mit einem einladen in eine stringlist bist du besser beraten.

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Klaudius Threadstarter
Hält's aus hier
Beiträge: 8

Win XP
D7
BeitragVerfasst: So 17.07.05 13:24 
Zitat:
da fehlt ein begin und end. Wenn der user auf abrechen im Dialogfeld drückt, soll bestimmt nicht auswerten aufgerufen werden.


Sorry, der Code wurde nur Auszugsweise aus der Anwendung kopiert.

Zitat:
Das mit dem filestrem ist auch zu aufwendig, der Fehler liegt wahrscheinlich auch dort. mit einem einladen in eine stringlist bist du besser beraten.


'Stringlist' sagt mir ehrlich gesagt nichts.
Der Hintergrund ist, die Procedure Auswerten soll flexibel sein. Es sollen auch Daten
von anderen Quellen verarbeitet werden. ( im Moment auch Serielle Schnittstelle )

Mal eine dumme Frage, ist ein String auf eine bestimmte Anzahl von Zeichen begrenzt ?
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: So 17.07.05 13:28 
was sind es denn für Daten, die du einliest? Beispiele und Hinweise zu stringlist gibts genug im forum und in der OH, gugg dir loadfromfile und die Text-Eigenschaft an.

strings gibt es als shortstrings (Var s:string[150]), diese sind auf 256 Zeichen begrenzt, ansistrings (Vas s:string) sind auf 2GB begrenzt.

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Klaudius Threadstarter
Hält's aus hier
Beiträge: 8

Win XP
D7
BeitragVerfasst: So 17.07.05 13:41 
Danke Frank,

Zitat:
Beispiele und Hinweise zu stringlist gibts genug im forum und in der OH, gugg dir loadfromfile und die Text-Eigenschaft an.


Habe gerade einiges darüber gefunden. :lol: