AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi TStringList und Add-/InsertObject (Verständnisprobleme)
Thema durchsuchen
Ansicht
Themen-Optionen

TStringList und Add-/InsertObject (Verständnisprobleme)

Ein Thema von Karsten · begonnen am 5. Sep 2003 · letzter Beitrag vom 8. Sep 2003
Antwort Antwort
Seite 2 von 2     12   
Karsten

Registriert seit: 5. Sep 2003
56 Beiträge
 
Delphi 6 Personal
 
#11

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

  Alt 7. Sep 2003, 23:05
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]
  Mit Zitat antworten Zitat
aogwaba

Registriert seit: 21. Aug 2003
16 Beiträge
 
#12

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

  Alt 8. Sep 2003, 05:17
Sorry, hatte vergessen die Instanz zu erzeugen, ist editiert.
Objectreferenzen sind Zeiger, in der Liste befinden sich deshalb auch nur
Zeiger.

cu
waba
  Mit Zitat antworten Zitat
Karsten

Registriert seit: 5. Sep 2003
56 Beiträge
 
Delphi 6 Personal
 
#13

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

  Alt 8. Sep 2003, 09:29
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
  Mit Zitat antworten Zitat
Touchdown

Registriert seit: 17. Feb 2003
227 Beiträge
 
#14

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

  Alt 8. Sep 2003, 10:44
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.
function getallfornothing: TGoldesel;
begin
result := TGoldesel.create;
end;
  Mit Zitat antworten Zitat
aogwaba

Registriert seit: 21. Aug 2003
16 Beiträge
 
#15

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

  Alt 8. Sep 2003, 19:13
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
  Mit Zitat antworten Zitat
Karsten

Registriert seit: 5. Sep 2003
56 Beiträge
 
Delphi 6 Personal
 
#16

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

  Alt 8. Sep 2003, 21:37
Es funktioniert !!!

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 . 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 ,

Karsten
  Mit Zitat antworten Zitat
aogwaba

Registriert seit: 21. Aug 2003
16 Beiträge
 
#17

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

  Alt 8. Sep 2003, 21:50
Mit Absicht war das nicht...

cu
waba
  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 13:52 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