AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Problem mit Zugriffsverletzungen bei einer TStringList
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Zugriffsverletzungen bei einer TStringList

Ein Thema von guitar1 · begonnen am 21. Nov 2006 · letzter Beitrag vom 21. Nov 2006
Antwort Antwort
Seite 1 von 2  1 2      
guitar1

Registriert seit: 9. Sep 2006
65 Beiträge
 
Turbo Delphi für Win32
 
#1

Problem mit Zugriffsverletzungen bei einer TStringList

  Alt 21. Nov 2006, 16:04
hi,

ich bin gerade dabei ein kleines Konfigurationsprogramm zu schreiben. Mein Problem besteht jetzt darin, dass ich den namen von zb. CPUs in einer StingList speichern will, es soll in dem Programm dann auch möglich sein noch weiter CPUs hinzu zu fügen(auch wärend der laufzeit).


Delphi-Quellcode:
cpuliste1[ 1]:= tstringlist.Create;

  try
    cpuliste1[ 1].Free;

  finally

    cpuliste1[ 1].SaveToFile(ExtractFilePath(ParamStr(0))+'/cpu/name.txt'); // das Verzeichnis /cpu lege ich vorher noch mit createdir an

      end;
das ist der Teil des Codes, in dem ich die Listen anlege (ist ein Button, um neue listen anzulegen).

Delphi-Quellcode:
  cpuliste1[ 1].LoadFromFile(ExtractFilePath(ParamStr(0))+'/cpu/name.txt');

      try

        cpuliste1[ 1].Add(cpu[list_item_cpu].name);

      finally

        cpuliste1[ 1].SaveToFile(ExtractFilePath(ParamStr(0))+'/cpu/name.txt');

      end;
das ist der Teil des Codes in dem eine neue CPUs zur liste hinzugefügt wird.

Ich hoffe ihr könnt mir helfen, schon mal danke im Voraus. Und noch eine kleine Bitte zum Schluss: Bitte einfach erklären^^, ich programiere erst seit August 06.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Problem mit Zugriffsverletzungen bei einer TStringList

  Alt 21. Nov 2006, 16:07
Delphi-Quellcode:
cpuliste1[ 1]:= tstringlist.Create;

  try
    cpuliste1[ 1].Free;

  finally

    cpuliste1[ 1].SaveToFile(ExtractFilePath(ParamStr(0))+'/cpu/name.txt'); // das Verzeichnis /cpu lege ich vorher noch mit createdir an

      end;
Hallo,

du gibst Deine Stringlist frei, und danach schreibst Du den Inhalt in eine Datei.
Anders herum würde ein Schuh daraus.

cpuliste ist das ein Array of TStringList?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
guitar1

Registriert seit: 9. Sep 2006
65 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Problem mit Zugriffsverletzungen bei einer TStringList

  Alt 21. Nov 2006, 18:12
@ Klaus : Ja, cpulist ist ein Array of TStingList, da ich nicht nur den namen sondern auch den Hersteller, etc speichern möchte. Zu dem Schuh^^, ich hab wohl richtig verstanden das ich die Datei erst speichern, dann freigeben soll. Das hat das Problem allerdings nur teilweise gelöst, ich kann jetzt 2 neue CPUs zur liste hinzufügen, da nach kommt wieder die Zugriffsverletzung und nach einem erneuten Start des Programs kann ich auch nicht auf die Listen zugreifen, da kommt dann ebenfalls ne Zugriffsverletzung.

Kann es vllt. daran liegen, das ich das gesamte Array [1..11] aufeinmal erstelle und speichere. Also so im Stil cpuliste[1].free; cpuliste[2].free; cpuliste[3].free; etc. ?
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#4

Re: Problem mit Zugriffsverletzungen bei einer TStringList

  Alt 21. Nov 2006, 18:21
erstelle die Instanzen einfach im form.OnCreate
Delphi-Quellcode:
for i:=1 to 11 do
begin
  cpuliste[i].create;
  //laden vielleicht???
  cpuliste[i].LoadFromFile(...);
end;
zwischendrin bearbeiten und im form.destroy einfach freigeben.

Delphi-Quellcode:
for i:=1 to 11 do
begin
  cpuliste[i].savetoFile(...);
  cpuliste[i].free;
end;
auch wenn mir das mit den Stringlisten überhaupt nicht gefällt...warum kein array of record etc?

Gruß Frank
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Problem mit Zugriffsverletzungen bei einer TStringList

  Alt 21. Nov 2006, 18:26
Es wird wohl zu Zugriffsverletzungen kommen, wenn Du eine
cpuliste[x] freigibst die noch nicht erstellt (created) wurde.

So ganz verstehe ich Deinen Programmablauf noch nicht.

Du hast also mehrere Stringliste.
Pro Stringlist wird ein bestimmtes Attribut aufgenommen (z.B. cpuName).

Also hast Du pro Stringliste immer die gleiche Anzahl an Einträgen.

Bevor Du die etwas in die Stringlisten einließt müßen diese auch erstellt werden.

Was für Meldungen bekommst Du denn genau?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
guitar1

Registriert seit: 9. Sep 2006
65 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Problem mit Zugriffsverletzungen bei einer TStringList

  Alt 21. Nov 2006, 20:37
@ Frank: also die Idee hört sich ja ganz gut an, aber wenn ich bei jedem start (onCreate) die listen neu erstelle sind auch die einträge weg und die sollten eigentlich auch beim nächsten programmstart noch da sein. Und wenn ich das cpuliste[x].create weglasse, dann kommen die Zugriffsverletzungen schon beim Start und dann auch später beim schließen.

@Klaus: Also der Programm ablauf: das Programm soll beim Starten noch keine Listen haben (nur beim ersten Start oder nachdem der Benutzer die Listen gelöscht hat(das geht durch einen kleinen Eintrag im Mainmenü)). Dann, soll der Benutzer, ebenfalls durchs Mainmenu eine neue "Datenbank" anlegen (hier will ich die Listen per .create erstellen). Um nun ein Produkt zu dieser "Datenbank" hinzuzufügen(eine CPU, Mainboard, etc.) gibt es im Mainmenu wiederum eine Schaltfläche um in eine Art "Produkteditor" zukommen, dort kann der Benutzer dann den Namen, Hersteller, Preis, etc. eintragen, diese Einträge will ich dann in den Listen speichern und wenn der Benutzer dann im Hauptfenster ist soll er sich mit den selbst eingetragenen Produkten einen PC zusammenstellen Können und dort, im "Hauptfenster" sollen die Listen dann in eine Combobox geladen werden, damit man sich eine CPU, etc. aussuchen kann.

und die Meldng lautet:
Zitat:
Zugriffsverletzung bei Adresse 0046E6C in Modul'PCKonig.exe'. Lesen von Adresse 00000000
Und das ganze ist eine Aufgabe für den Informatik-Kurs.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Problem mit Zugriffsverletzungen bei einer TStringList

  Alt 21. Nov 2006, 20:47
Wenn Du die Listen mit create erstellst sind sie leer, das ist klar.
Aber Du lädst doch die Einträge aus Deiner Datei in die Liste.

Wenn Du die Listen alle beim Programmstart erstellst und zwischendurch nicht wieder schließst
sollte es auch beim Beenden des Programms keine Zugriffsverletzungen geben.

Im Programmablauf kannst Du dann immer noch etwas zu den Stringlisten hinzufügen oder entfernen.
Die Stringlist leeren würde ich auch nicht mit free machen, sondern da sollte es so etwas wie
TStringlist.clear geben.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#8

Re: Problem mit Zugriffsverletzungen bei einer TStringList

  Alt 21. Nov 2006, 20:47
Zitat von guitar1:
@ Frank: also die Idee hört sich ja ganz gut an, aber wenn ich bei jedem start (onCreate) die listen neu erstelle sind auch die einträge weg und die sollten eigentlich auch beim nächsten programmstart noch da sein. Und wenn ich das cpuliste[x].create weglasse, dann kommen die Zugriffsverletzungen schon beim Start und dann auch später beim schließen.
bi jedem zugriff auf das (nicht erstellte) Objekt halt...

deshalb speichern beim Beenden und laden beim Starten
sind es denn immer 11 stringlisten oder ist die Anzahl dynamisch?
ggf. muss beim Hinzufügen das array um 1 inkrementiert werden (setLength(array,length(array)+1) + array[high(array)]:=TStringlist.create bzw. beim löschen dekrementiert werden und die entsprechende Stringlist freigegeben werden (ggf. Datei löschen).

Zitat von guitar1:
und die Meldng lautet:
Zitat:
Zugriffsverletzung bei Adresse 0046E6C in Modul'PCKonig.exe'. Lesen von Adresse 00000000
nil-pointer du versuchst auf ein objekt zuzugreifen, welches noch nicht erstellt wurde bzw. dessen zeigervariable=nil ist.

HTH Frank
  Mit Zitat antworten Zitat
guitar1

Registriert seit: 9. Sep 2006
65 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Problem mit Zugriffsverletzungen bei einer TStringList

  Alt 21. Nov 2006, 21:26
Also das will einfach nicht gehen, ich stell jetzt mal nenn teil vom code rein (das ist jetzt das für die Mainboards(das geht auch nich ... genau wie alle anderen kompnenten die nenn pc so braucht)):

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var i : integer;
begin

  createdir(ExtractFilePath(ParamStr(0))+'/mb');

  for I := 1 to 11 do begin
    Mainboardliste1[i].Create;
  end;

   mainboardliste1[ 1].LoadFromFile(ExtractFilePath(ParamStr(0))+'/mb/herst.txt');
...
   mainboardliste1[11].LoadFromFile(ExtractFilePath(ParamStr(0))+'/mb/preis.txt');

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
        mainboardliste1[ 1].SaveToFile(ExtractFilePath(ParamStr(0))+'/mb/herst.txt');
...
        mainboardliste1[11].SaveToFile(ExtractFilePath(ParamStr(0))+'/mb/preis.txt');
end;
das ist jetzt die Stelle an der per oncreate bzw on destroy die listen geladen bzw gespeichter werden und es kommen immer noch die gleichen Zugriffsverletzungen beim starten und schließen. Ich hab jetzt sogar mal per hand die dateien im ordner /mb erstellt aber selbst dann kommt ne zugriffsvetletzung?!

schon wieder was vergessen^^
@ Frank: die Listen sind immer die gleichen, beim Mainboard 11, beim CPU 4, jenachdem, wie viele Attribute eine Art von Produkten halt hat. (beim CPU sinds zb Hersteller, Name, Sockel und Preis)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#10

Re: Problem mit Zugriffsverletzungen bei einer TStringList

  Alt 21. Nov 2006, 21:28
Zitat von _frank_:
erstelle die Instanzen einfach im form.OnCreate
Delphi-Quellcode:
for i:=1 to 11 do
begin
  cpuliste[i].create;
  //laden vielleicht???
  cpuliste[i].LoadFromFile(...);
end;
Oh, Spezial-Delphi oder warum sehen deine Constructoren so komisch aus? Ich würde lieber folgendes empfehlen:

  cpuliste[i] := TStringList.Create; /EDIT: Und schwupps, schon wurde es richtig (falsch) abgeschrieben...

Zitat von guitar1:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var i : integer;
begin

  createdir(ExtractFilePath(ParamStr(0))+'/mb');

  for I := 1 to 11 do begin
    Mainboardliste1[i].Create;
  end;

   mainboardliste1[ 1].LoadFromFile(ExtractFilePath(ParamStr(0))+'/mb/herst.txt');
...
   mainboardliste1[11].LoadFromFile(ExtractFilePath(ParamStr(0))+'/mb/preis.txt');

end;
Lieber so:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var i : integer;
begin

  createdir(ExtractFilePath(ParamStr(0))+'/mb');

  for I := 1 to 11 do
    Mainboardliste1[i] := TStringList.Create;

   mainboardliste1[ 1].LoadFromFile(ExtractFilePath(ParamStr(0))+'/mb/herst.txt');
...
   mainboardliste1[11].LoadFromFile(ExtractFilePath(ParamStr(0))+'/mb/preis.txt');

end;
  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 22:43 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