Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi zugriffsverletzung bei TStrings (https://www.delphipraxis.net/22236-zugriffsverletzung-bei-tstrings.html)

glkgereon 14. Mai 2004 19:05


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:
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;
wie amn sieht hab ich schon so einiges probiert, und es wieder auskommentiert, da es nit funzte... :gruebel:

Bernhard Geyer 14. Mai 2004 19:12

Re: zugriffsverletzung bei TStrings
 
Du solltest die Stringlist auch anlegen:

Code:
data := TStringList.Create;

Robert_G 14. Mai 2004 19:12

Re: zugriffsverletzung bei TStrings
 
Wie erzeugt man eine Instanz einer Klasse????
Delphi-Quellcode:
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;
Nebenbei, es war auch keinerlei Ressourcenschutzblock vorhanden ;)
Nachtrag: irgendwie bockt mein Source formatter :gruebel:

glkgereon 14. Mai 2004 19:29

Re: zugriffsverletzung bei TStrings
 
aber wenn ich am anfang sage data.create gibts nem fehler

und data:=stringlist.create versteh ich nicht :gruebel:

Bernhard Geyer 14. Mai 2004 19:37

Re: zugriffsverletzung bei TStrings
 
Ein Konstruktor wird immer in der Art:
Code:
<Objekt> := <Klassenname>.<Konstruktor>
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.

In anderen Sprachen ist das Ähnlich:
Code:
<Objekt-Zeiger> = new <Klassenname>

glkgereon 14. Mai 2004 19:40

Re: zugriffsverletzung bei TStrings
 
aber ich hab die variable doch oben deklariert :gruebel:
da peil ich jetzt nit so ganz...

Bernhard Geyer 14. Mai 2004 19:48

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:
CMyObjekt* pPointerAufMyObjekt;
CMyObjekt RichtigesObjekt;
bei der Zeigerversion mußt Du nocht mittels
Code:
 pPointerAufMyObjekt := new CMyObjekt
eine Instanz anlegen.

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.

glkgereon 14. Mai 2004 19:50

Re: zugriffsverletzung bei TStrings
 
aber, wenn man den global deklariert, dann funzt es :gruebel:

hab ich ausprobiert, bzw es funzt auf jeden fall

Robert_G 14. Mai 2004 19:54

Re: zugriffsverletzung bei TStrings
 
nur der Construcor kann eine INstanz einer Klasse erzeugen!
Delphi-Quellcode:
  lData := TStringList.Create;
Das bedeutet: Der Constructor von TStringList erzeugt eine Instanz, die wird an die Refferenz "lData" übergeben.
Nun kannst du mit lData arbeiten.

Bernhard Geyer 14. Mai 2004 19:54

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 00:00 Uhr.
Seite 1 von 2  1 2      

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