AGB  ·  Datenschutz  ·  Impressum  







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

Frage zu .free bei Klassen

Ein Thema von Wuaegner · begonnen am 20. Jul 2005 · letzter Beitrag vom 20. Jul 2005
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#11

Re: Frage zu .free bei Klassen

  Alt 20. Jul 2005, 19:13
Zitat von Wuaegner:
Verwende jetzt FreeAndNil() aber der Fehler kommt immernoch. Es muss also daran liegen
Zitat:
ein nicht instanziiertes Objekt?
Ich erzeuge die Listen mit liste:= TStringList.Create; , füge mit Add() neue Items hinzu und lösche wieder welche usw. , muss ich noch etwas beachten?
Naja, wenn eine AV kommt, wird wohl zwangsläufig irgendwo nach der Freigabe des Objekts noch auf das Objekt zugegriffen. Eventuell hilft Debuggen, um die Stelle zu finden
  Mit Zitat antworten Zitat
Benutzerbild von Wuaegner
Wuaegner

Registriert seit: 8. Feb 2004
406 Beiträge
 
Delphi 6 Enterprise
 
#12

Re: Frage zu .free bei Klassen

  Alt 20. Jul 2005, 19:32
Delphi-Quellcode:
 type
  TStringManager = class
  private
   FNummernListe : TStringlist;
   FOrteListe: TStringList;
   FDatumsListe: TStringList;
   FLaengenListe: TStringList;
   FKostenListe: TStringList;
   FStringList: TStringList;
   FCopyList: TStringList;
   FEinzelListe: TStringList;
   procedure ClearToErsteZeile;
   procedure ClearGarbage;
   procedure FillFEinzelListe;
   procedure SplitString(s:string);
   procedure StrToListen;
   function Kosten(nr: string):real;
   function LoadFile(FileName:string): boolean;
   function IsValid(s: string):boolean;

  public
   constructor Create;
   destructor Destroy; override;

  end;


var
  Form1: TForm1;
  StrMg: TStringManager;
  

implementation

{$R *.dfm}

{ TStringManager }

procedure TStringManager.ClearGarbage;
var i: integer;
    s: string;
    anzahl: integer;
begin
  ClearToErsteZeile; // Unwichtiges davor wird gelöscht

 

 for i:= FStringList.Count-1 downto 0 do
 begin

  if (pos('*',FStringList.Strings[i])=0) then

  FStringList.Delete(i);


 end;

     .
     .
     .

end;


constructor TStringManager.Create;
begin
  FNummernListe:= TStringList.Create;
   FEinzelListe:= TStringList.Create;
   FDatumsListe:= TStringList.Create;
   FOrteListe:= TStringList.Create;
   FLaengenListe:= TStringList.Create;
   FKostenListe:= TStringList.Create;
   FCopyList:= TStringList.Create;
   FStringList:= TStringList.Create;
end;

destructor TStringManager.Destroy;
begin
   FreeAndNil(FNummernListe);
   FreeAndNil(FEinzelListe); [b]// <= HIER KOMMT EINE AV
   FreeAndNil(FDatumsListe);
   FreeAndNil(FOrteListe);
   FreeAndNil(FLaengenListe);
   FreeAndNil(FKostenListe);
   FreeAndNil(FCopyList);
   FreeAndNil(FStringList); [b]// UND HIER ( auskommentiert läuft es)
  inherited;
end;

procedure TStringManager.FillFEinzelListe;
var i, k: Integer;
begin

   FEinzelListe:= FNummernListe;
    For i := FEinzelListe.Count - 2 downto 0 do
      For k := FEinzelListe.Count - 1 downto i + 1 do
        If FEinzelListe.Strings[i] = FEinzelListe.Strings[k] Then
          FEinzelListe.Delete(k);


end;



function TStringManager.IsValid(s: string): boolean;
begin
 result:= false;
 if s[3]='.then result:= true;
end;




procedure TForm1.FormCreate(Sender: TObject);
begin
 StrMg:= TStringManager.Create;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  StrMg.Destroy;
end;

procedure TForm1.Button1Click(Sender: TObject);
var h,i: integer;
begin

 for h:= 1 to 9 do
 begin
  if StrMg.LoadFile('telekom_'+IntToStr(h)+'.txt') then
   begin
    StrMg.ClearGarbage;
    for i:= 0 to StrMg.FStringList.Count-1 do
     begin
      StrMg.FCopyList.Add(StrMg.FStringList.Strings[i]);
     end;
    StrMg.FStringList.Clear;
   end;
  end;

    StrMg.FStringList:= StrMg.FCopyList;
    StrMg.StrToListen;
    StrMg.FillFEinzelListe;
    LBNummern.Items:= StrMg.FEinzelListe;
end;

end.
Wuaegner
Gruß Flo
Unternehmensberatung
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#13

Re: Frage zu .free bei Klassen

  Alt 20. Jul 2005, 19:36
Destroy ruft man nicht direkt auf sondern benutzt Free - oder in diesem Fall noch besser FreeAndNil
Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FreeAndNil(StrMg);
end;
Obs daran liegt weiß ich jetzt allerdings nicht.

[Nachtrag]

FreeAndNil macht übrigens genau das hier:
Delphi-Quellcode:
procedure FreeAndNil(var Obj);
var
  Temp: TObject;
begin
  Temp := TObject(Obj);
  Pointer(Obj) := nil;
  Temp.Free;
end;
Volker
  Mit Zitat antworten Zitat
Benutzerbild von Wuaegner
Wuaegner

Registriert seit: 8. Feb 2004
406 Beiträge
 
Delphi 6 Enterprise
 
#14

Re: Frage zu .free bei Klassen

  Alt 20. Jul 2005, 19:37
ok aber daran liegts nicht.
Wuaegner
Gruß Flo
Unternehmensberatung
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#15

Re: Frage zu .free bei Klassen

  Alt 20. Jul 2005, 19:39
bei sowas
StrMg.FStringList:= StrMg.FCopyList; ist das ganze kein Wunder. damit verwirfst du den InstanzPointer von StrMg.FStringlist und weiß einfach eine andere Instanz zu. Da wird nix kopiert außer der zeiger auf die Liste.
Desweiteren ist der Privatebereich dafür da das andere Objecte nicht auf die dinge Zugreifen, in deinem Fall greifst du aber von deinem TForm-Object auf den Privatebereich von deinem Manager zu, dann kannst du das mit dem Private auch lassen

Wennd u Button1 mehrmals klickst, kommt dann eignetlich ein Fehler?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#16

Re: Frage zu .free bei Klassen

  Alt 20. Jul 2005, 19:45
Stimmt ... habe ich auch übersehen.
Was du tun willst ist wahrscheinlich
StrMg.FStringList.Assign(StrMg.FCopyList);
Volker
  Mit Zitat antworten Zitat
Benutzerbild von Wuaegner
Wuaegner

Registriert seit: 8. Feb 2004
406 Beiträge
 
Delphi 6 Enterprise
 
#17

Re: Frage zu .free bei Klassen

  Alt 20. Jul 2005, 19:48
Zitat:
Wennd u Button1 mehrmals klickst, kommt dann eignetlich ein Fehler?
Nein dann kommt kein Fehler.
Zitat:
StrMg.FStringList.Assign(StrMg.FCopyList);
Trotzdem kommt immernoch die AV.
Wuaegner
Gruß Flo
Unternehmensberatung
  Mit Zitat antworten Zitat
Benutzerbild von BlackJack
BlackJack

Registriert seit: 2. Jul 2005
Ort: Coesfeld
246 Beiträge
 
Delphi 2005 Personal
 
#18

Re: Frage zu .free bei Klassen

  Alt 20. Jul 2005, 19:55
FreeAndNil(FEinzelListe); [b]// <= HIER KOMMT EINE AV da du die liste richtig erstellst und auch wieder richtig freigibst, kann der fehelr nur entstehen, weil du zwischendurch FEinzelListe freigibst oder überschreibst (wie SirThornberry beretis erklärt hat). da du jetzt die fehlerursache kennst, ist ein wenig eigeninitiative gefragt, also geh durch den gesatmen source nud schau nach wo du FEinzelListe überschreibst oder fregibst.
See my shadow changing, stretching up and over me.
Soften this old armor. Hoping I can clear the way
By stepping through my shadow, coming out the other side.
Step into the shadow. Forty six and two are just ahead of me.
  Mit Zitat antworten Zitat
Benutzerbild von Wuaegner
Wuaegner

Registriert seit: 8. Feb 2004
406 Beiträge
 
Delphi 6 Enterprise
 
#19

Re: Frage zu .free bei Klassen

  Alt 20. Jul 2005, 19:58
JAWOHL!
Habe noch einmal im Code kein .Assign benutzt , daran lag's.
Danke an alle Helfenden!
Wuaegner
Gruß Flo
Unternehmensberatung
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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:04 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