Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStringList und Add-/InsertObject (Verständnisprobleme) (https://www.delphipraxis.net/8488-tstringlist-und-add-insertobject-verstaendnisprobleme.html)

Karsten 7. Sep 2003 23:05

Re: TStringList und Add-/InsertObject (Verständnisprobleme)
 
Danke, das ist soweit genau das was ich wollte. Vor allem leicht wartbar wenn es bei mir dann auch funktioniert.

Frage:
In 'TDatenContainer.ReadFromStream' und 'TDatenContainer.WriteToStream' benutzt Du 'MyDaten:TDaten' machst aber kein 'Create', funktioniert das auch so ?

Diese Frage entstand durch folgendes Problem:

1.
Ein Datensatz wurde bereits vorher gespeichert.

2.
TempDaten wurde in die WatchList aufgenomen und die procedure 'LadenClick' (siehe unten) aufgerufen.

3.
Nachdem TempDaten angelegt wurde 'TempDaten:=TDaten.Create('', 0)', wird der erste Datensatz (0) ausgelesen.

Problem:
Nach ausführen von 'getItemAt(0)' ist TempDaten anscheinend nicht mehr vorhanden (Inaccessible value). Das führt natürlich zu einem Fehler wenn ich die Daten verarbeiten will.

Delphi-Quellcode:
procedure TMainForm.LadenClick(Sender: TObject);
var
  FileName: String;
  TempDaten: TDaten;
begin
  FileName := InputBox('Laden', 'File Name:', '<datei>');
  if FileExists(FileName) then
  begin
    DatenListe := TDatenContainer.Create(FileName);
    DatenListe.ReadFromFile;
    TempDaten := TDaten.Create('', 0);
    TempDaten := DatenListe.getItemAt(0);
    if TempDaten = nil then
    begin
      exit;
    end;
    Label1.Caption := TempDaten.mytext;
    Label2.Caption := IntToStr(TempDaten.myinteger);
    TempDaten.Free;
  end;
end;
Hat das alles wieder etwas mit 'Pointern' zu tun ?

Gruß,
Karsten

[edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit]

aogwaba 8. Sep 2003 05:17

Re: TStringList und Add-/InsertObject (Verständnisprobleme)
 
Sorry, hatte vergessen die Instanz zu erzeugen, ist editiert.
Objectreferenzen sind Zeiger, in der Liste befinden sich deshalb auch nur
Zeiger.

cu
waba

Karsten 8. Sep 2003 09:29

Re: TStringList und Add-/InsertObject (Verständnisprobleme)
 
O.k., jetzt goenne einem Neuling im Bereich OOP noch ein/zwei Fragen.
Wenn MyList nur Pointer enthaelt muss also fuer jeden neuen Datensatz (MyDaten) eine neue Instanz erzeugt werden und der Pointer auf diese Instanz wird in MyList abgelegt.
Die in 'ReadFromStream' erzeugten Inztanzen von MyDaten bleiben somit erhalten.
Wie ist das dann wenn ich einen Datensatz entfernen will ? Im Prinziep muesste ich mir ja erst den Pointer aus MyList auslesen, die damit adressierte Instanz von MyDaten freigeben und dann den Pointer aus MyList entfernen, oder ?
Das gleiche gilt natuerlich auch fuer den Fall dass ich die gelesene / geschriebene Datei wieder schliesse bzw. die DatenListe vom Typ TDatenContainer, richtig ?

Aber wie ist das zu erklaeren dass TempDaten nach getItemAt anscheinend nicht mehr existent ist obwohl diese Instanz vorher angelegt wurde (Inaccessible value) ?

Ich denke dass hier noch ein generelles Verstaendnisproblem meinerseits besteht. Mit dem Aufruf readItemAt lese ich doch einen Pointer auf die gewuensche Instanz aus und die Zeile 'TempDaten := DatenListe.getItemAt(0);' sollte mir doch einen Pointer auf die erste Daten Instanz zurueck liefern oder liege ich hier total daneben ?

Wobei ist das ueberhaupt so sinnvoll was ich da mache ? Eine Instanz zu erzeugen, dieser einen neuen pointer zuweisen und sie am Ende wieder freigeben. Vor allem stellt sich hier die Frage was freigegeben wird.

Ich habe bisher alles verstanden was Du geschrieben hast, nur bei meinen Sachen kommen immer groesserer Zweifel auf.

Gruss,
Karsten

Touchdown 8. Sep 2003 10:44

Re: TStringList und Add-/InsertObject (Verständnisprobleme)
 
Delphi-Quellcode:

TempDaten := DatenListe.getItemAt(0);
try
  ...
finally
  TempDaten; // macht beide free
end;
TempDaten und DatenListe.getItemAt(0) zeigen auf den selben Speicherbereich, machst du auf einen von beiden ein free, zeigen beide Pointer auf einen ungültigen Speicherbereich.

aogwaba 8. Sep 2003 19:13

Re: TStringList und Add-/InsertObject (Verständnisprobleme)
 
Zitat:

Wie ist das dann wenn ich einen Datensatz entfernen will ? Im Prinziep muesste ich mir ja erst den Pointer aus MyList auslesen, die damit adressierte Instanz von MyDaten freigeben und dann den Pointer aus MyList entfernen, oder ?
genau, guck dir mal in der OH TList.remove an, da ist auch ein anschauliches Beispiel dabei.
Zitat:

Aber wie ist das zu erklaeren dass TempDaten nach getItemAt anscheinend nicht mehr existent ist obwohl diese Instanz vorher angelegt wurde (Inaccessible value) ?
Immer noch? Sollte aber nicht mehr vorkommen (fehlender Konstructor).
Zitat:

Ich denke dass hier noch ein generelles Verstaendnisproblem meinerseits besteht. Mit dem Aufruf readItemAt lese ich doch einen Pointer auf die gewuensche Instanz aus und die Zeile 'TempDaten := DatenListe.getItemAt(0);' sollte mir doch einen Pointer auf die erste Daten Instanz zurueck liefern oder liege ich hier total daneben ?
Du liegst völlig richtig, getItemAt(0) gibt den Zeiger (besser die Referenz) zurück.
Zitat:

Wobei ist das ueberhaupt so sinnvoll was ich da mache ? Eine Instanz zu erzeugen, dieser einen neuen pointer zuweisen und sie am Ende wieder freigeben. Vor allem stellt sich hier die Frage was freigegeben wird.
Versteh ich nicht, wie meinst du dass?
Zitat:

Ich habe bisher alles verstanden was Du geschrieben hast, nur bei meinen Sachen kommen immer groesserer Zweifel auf.
?
cu
waba

Karsten 8. Sep 2003 21:37

Re: TStringList und Add-/InsertObject (Verständnisprobleme)
 
Es funktioniert :hello: !!!

Mein erstes Problem war das ich vor dem Auslesen der Daten erst einmal eine Instanz von TDaten erzeugt habe (TempDaten ... Create), was so schwachsinnig war wie der Farbe beim Trocknen zuzusehen. Die Instanz von TDaten war ja bereits vorhanden und ich musste lediglich nur noch den Pointer über getItemAt lesen.

Dann hatte ich noch ein weiteres Problem mit einem Fehler beim Schreiben bzw. Lesen der Daten in bzw. aus der Datei.

aStream.read(mytext[1],sizeof(mytext));
aStream.write(mytext[1],sizeof(mytext));

Wie ich hier gelernt habe gibt SizeOf(<String>) die Länge des Pointers zurück weil 'String' auch nur ein Pointer ist.

Christian Seehase:
...wobei der Typ String auch wieder ein Problem darstellt, da strings dynamische Arrays, und somit auch wieder Pointer sind.

Ich denke das Du 'aogwaba' die Fehler absichtlich eingebaut hast um den Lerneffekt zu testen :angle2: . Der war auf jeden Fall sehr hoch.

Ein großes DANKE an alle die, die mir bei meinen ersten Schritten in die OOP Welt geholfen haben. Ich denke daß ich jetzt in der Lage bin fehlende Komponenten eigenständig zu erstellen.

Weiterhin frohes Programmieren :coder: ,

Karsten

aogwaba 8. Sep 2003 21:50

Re: TStringList und Add-/InsertObject (Verständnisprobleme)
 
Mit Absicht war das nicht... :wink:

cu
waba


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:54 Uhr.
Seite 2 von 2     12   

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