![]() |
zugriffsverletzung bei TStrings
hi
ich hab ne procedure geschrieben immer beim ersten mal, wenn ich auf einen (lokalen) TStrings zugreife, gibts einen zugriffsfehler warum?
Delphi-Quellcode:
wie amn sieht hab ich schon so einiges probiert, und es wieder auskommentiert, da es nit funzte... :gruebel:
procedure TForm_Main.faecher_bereitschaft_save(Sender: TObject);
var i, z:integer; data:TStrings; Begin //data.Create; //data.Clear; //data.LoadFromFile('dummy.dat'); for i:=1 to 100 do Begin data.Add(inttostr(bereitschaft[i])); end; data.SaveToFile('bereitschaft.dat'); data.Clear; for i:=1 to 100 do Begin For z:=1 to 10 do Begin data.Add(inttostr(faecher[i, z])); End; End; data.SaveToFile('faecher.dat'); //data.Destroy; End; |
Re: zugriffsverletzung bei TStrings
Du solltest die Stringlist auch anlegen:
Code:
data := TStringList.Create;
|
Re: zugriffsverletzung bei TStrings
Wie erzeugt man eine Instanz einer Klasse????
Delphi-Quellcode:
Nebenbei, es war auch keinerlei Ressourcenschutzblock vorhanden ;)
var
i, z: Integer; // lData: TStrings; begin with TStringList.Create do try LoadFromFile('dummy.dat'); for i := 1 to 100 do Add(IntToStr(Bereitschaft[i])); SaveToFile('Bereitschaft.dat'); Clear; for i := 1 to 100 do for z := 1 to 10 do Add(IntToStr(Faecher[i, z])); SaveToFile('faecher.dat'); finally Free; end; end; Nachtrag: irgendwie bockt mein Source formatter :gruebel: |
Re: zugriffsverletzung bei TStrings
aber wenn ich am anfang sage data.create gibts nem fehler
und data:=stringlist.create versteh ich nicht :gruebel: |
Re: zugriffsverletzung bei TStrings
Ein Konstruktor wird immer in der Art:
Code:
aufgerufen. Nur der Konstruktur einer Klasse (ist auch eine sog. Klassenfunktion) weiß wie eine Klasse erstellt wird (nötiger Speicher, ...) und liefert einen Zeiger auf das erstellte Objekt zurück.
<Objekt> := <Klassenname>.<Konstruktor>
In anderen Sprachen ist das Ähnlich:
Code:
<Objekt-Zeiger> = new <Klassenname>
|
Re: zugriffsverletzung bei TStrings
aber ich hab die variable doch oben deklariert :gruebel:
da peil ich jetzt nit so ganz... |
Re: zugriffsverletzung bei TStrings
Du hast mit der Variablen-Deklarartion nur den Speicher für einen Zeiger reserviert (alles was in Delphi von TObject abgeleitet ist, für das wird in der Deklaration nur ein Zeiger angelegt).
Bei C++ hättest Du die Möglichkeit deine Variable als Zeiger oder als Objektinstanz anzulegen (hoffentlich halbwegs richtig benahmst)
Code:
bei der Zeigerversion mußt Du nocht mittels
CMyObjekt* pPointerAufMyObjekt;
CMyObjekt RichtigesObjekt;
Code:
eine Instanz anlegen.
pPointerAufMyObjekt := new CMyObjekt
Unter Delphi gibt es nur noch die Version mittels Zeiger. Ab statt dann mit dem Zeigeroperator arbeiten zu müssen (pPointerAufMyObjekt->MyFunction) gibt es nur noch den Punkt. D.h. die Konfusion ob jetzt Zeiger oder Punkt nötig ist fällt weg. |
Re: zugriffsverletzung bei TStrings
aber, wenn man den global deklariert, dann funzt es :gruebel:
hab ich ausprobiert, bzw es funzt auf jeden fall |
Re: zugriffsverletzung bei TStrings
nur der Construcor kann eine INstanz einer Klasse erzeugen!
Delphi-Quellcode:
Das bedeutet: Der Constructor von TStringList erzeugt eine Instanz, die wird an die Refferenz "lData" übergeben.
lData := TStringList.Create;
Nun kannst du mit lData arbeiten. |
Re: zugriffsverletzung bei TStrings
Es funktioniert dort auch nicht - es kracht zufälligerweise halt nicht, da du auf einen Speicherbereich zugreifst der zwar in deinem (von Windows) zugewiesenen Speicherbereich liegt, jedoch es nicht stört wenn etwas dort hingeschrieben wird. Bei einer lokalen Variable werden diese anders Abgelegt (es müßte auf dem Stack sein) und dort hat ein nicht zugewiesener Zeiger schneller eine sichtbare Fehlfunktion.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:28 Uhr. |
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-2025 by Thomas Breitkreuz