AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

D2009 Exception

Ein Thema von EWeiss · begonnen am 29. Apr 2011 · letzter Beitrag vom 2. Mai 2011
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

D2009 Exception

  Alt 29. Apr 2011, 19:18
Mir ist kein anderen threadnamen eingefallen.

Meine Funktion welche ich hier schonmal gepostet habe verursacht in D2009 beim 2 Aufruf ein
Exception Exception in "blaaa, blaa" aufgetreten.

Delphi-Quellcode:
procedure TSkinConfig.AppendToLinkedList(nReading: Integer; sBuffer: string);
begin

  New(FPBuffer);

  if nReading = 0 then
  Begin
    New(FToPBuffer);
    LineStart := FToPBuffer;
  end;

  FPBuffer^.Nr := nReading;
  FPBuffer^.Str := sBuffer;
  LineStart^.Max := nReading;
  FToPBuffer^.Ptr := FPBuffer;
  FToPBuffer := FPBuffer;

end;

procedure TSkinConfig.FBuffin(FileName: string);
var
  sBuffer: string;

begin

  if not FExist(FileName) then
    Exit;
  try
    try
      Assignfile(ParseFile, FileName);
      reset(ParseFile);

      while not eof(ParseFile) do
      begin
        ReadLN(ParseFile, sBuffer);
        AppendToLinkedList(nReading, sBuffer);
        inc(nReading);
      end;
    except
      raise Exception.Create(SysErrorMessage(GetLastError));
    end;
  finally
    nReading := 0;
    CloseFile(ParseFile);
  end;

end;
und zwar wenn das zweitemal
New(FPBuffer);
aufgerufen wird.
Beim Awendungsfenster tritt das problem nicht auf nur beim
Modal erstellten Window.

In D2006 gibt es keine probleme diesbezüglich.
Mit Exception Exception kann ich nichts anfangen keine Nummer nix wird zurückgegeben.

gruss Emil
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#2

AW: D2009 Exception

  Alt 29. Apr 2011, 19:33
GIbst du den speicher auch irgendwo frei? und mit Dispose? Außerdem würde ich das AssignFile über das try-finally setzen, da im Fehlerfall versucht wird eine Datei, die nicht geoffnet ist zu schließen.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: D2009 Exception

  Alt 29. Apr 2011, 19:43
GIbst du den speicher auch irgendwo frei? und mit Dispose? Außerdem würde ich das AssignFile über das try-finally setzen, da im Fehlerfall versucht wird eine Datei, die nicht geoffnet ist zu schließen.
Im Fehlerfall springt er in except nicht in finally.

Nach dem erstellung des HauptFenster werden die Resourcen wieder freigegeben.
Delphi-Quellcode:
  // Resourcen Freigeben
  FPBuffer := nil;
  Result := True;
sowie das TextFile
CloseFile(ParseFile);
gruss

Geändert von EWeiss (30. Apr 2011 um 17:40 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: D2009 Exception

  Alt 29. Apr 2011, 19:45
Zitat:
Im Fehlerfall springt er in except nicht in finally.
In finally, sollte er auf jeden Fall verzweigen
Markus Kinzler
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: D2009 Exception

  Alt 29. Apr 2011, 20:02
Zitat:
Im Fehlerfall springt er in except nicht in finally.
In finally, sollte er auf jeden Fall verzweigen
Habe es jetzt so umgelegt das er hineinspringt.
Und das AssignFile über try (finally gesetzt)

Ändert aber nichts an meinem problem.

Reicht ein
FPBuffer := nil;
nicht aus? Nachdem das Hauptfenster erstellt wurde?
Warum dann noch ein Dispose?

gruss
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#6

AW: D2009 Exception

  Alt 29. Apr 2011, 20:56
Es gibt leider keinen Garbage Collector in Delphi:
Man muss den Speicher, den man allokiert (mit new) wieder Freigeben(mit Dispose). Das nilen des Pointers reicht da nicht aus, da der Wert dahinter immer noch existiert.

Normalerweise ist sowas "nur" ein Speicherleck und sollte keine Exception werfen, aber wer weiss.
Vielleicht liegt der Fehler wo ganz anders
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: D2009 Exception

  Alt 29. Apr 2011, 20:59
Es gibt leider keinen Garbage Collector in Delphi:
Man muss den Speicher, den man allokiert (mit new) wieder Freigeben(mit Dispose). Das nilen des Pointers reicht da nicht aus, da der Wert dahinter immer noch existiert.

Normalerweise ist sowas "nur" ein Speicherleck und sollte keine Exception werfen, aber wer weiss.
Vielleicht liegt der Fehler wo ganz anders
Also wenn ich den Buffer mit dispose freigebe dann kracht es direkt.
Warum auch immer, bekomme dann nicht mal die HauptAnwendung(Fenster geladen)

Delphi-Quellcode:
      while not eof(ParseFile) do
      begin
        ReadLN(ParseFile, sBuffer);
        AppendToLinkedList(nReading, sBuffer);
        inc(nReading);
        Dispose(FPBuffer);
      end;
wie gesagt das problem habe ich nur mit D2009

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: D2009 Exception

  Alt 30. Apr 2011, 16:14
Jetzt sagt mir doch mal bitte was ist mein Problem
Das ein und die gleiche Funktion in D2006 funktioniert und in D2009 probleme verursacht.

Habe alle relevanten Code Teile gepostet.

gruss
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#9

AW: D2009 Exception

  Alt 30. Apr 2011, 16:33
Könntest du den Code vielleicht etwas erklären?
Und vielleicht den kompletten Exception-Text posten (Strg-C auf das Exception-Fenster)

Das Dispose muss man dann aufführen wenn man das den Record nicht mehr braucht.
Wird das FPBuffer an der Stelle nicht mehr gebraucht? Wenn ja, warum ist es dann ein Feld des Objektes und keine Varaible in der Procedure?

Sorry, aber ich bin nicht den ganzen Tag im Forum.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: D2009 Exception

  Alt 30. Apr 2011, 16:59
Zitat:
Sorry, aber ich bin nicht den ganzen Tag im Forum
Deshalb ein Extra Danke schön das du dich mit meinem Problem beschäftigst.

Zitat:
Das Dispose muss man dann aufführen wenn man das den Record nicht mehr braucht.
Habe es geändert.
Delphi-Quellcode:
  // Resourcen Freigeben
  Dispose(FPBuffer);
  FPBuffer := nil;
  Result := True;
Zitat:
Könntest du den Code vielleicht etwas erklären?
Schau bitte das Bild 3 an wie sich der Record bzw.. der buffer gefüllt wird.

Delphi-Quellcode:
  PParseFile = ^TParseFile;
  TParseFile = record
    Nr :Integer;
    Str : string;
    Ptr : PParseFile;
    Max : Integer;
  end;
Delphi-Quellcode:
  TSkinConfig = class
  private
    ParseFile : TextFile;
    LineStart : PParseFile;
    FPBuffer : PParseFile;
    FToPBuffer : PParseFile;
ParseFile.. erklärt sich von selbst (die TextDatei halt)
LineStart.. hier wird der Maximale Counter (Zeilen in der Textdatei festgehalten)
da sich beim einlesen der nächsten Zeile der letzte FPBuffer leert benötige ich LineStart als Platzhalter für den letzten (aller) Counter.

FPBuffer.. wird initialisiert indem ich den Pointer auf LineStart setze
FToPBuffer.. enthält die Pointer der Records von PParseFile abhängig vom Counter LineStart 0 to max Zeilen.
LineStart erhält dann den kompletten Record von FToPBuffer in dem alle Daten von FPBuffer enthalten sind.
Siehe!
FToPBuffer := FPBuffer;
Hoffe meine Erklärung ist ausreichend.

Danke.

gruss Emil

Geändert von EWeiss (30. Apr 2011 um 22:29 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz