Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 5. Sep 2003, 23:39
Moin Karsten,

Du versuchst ein Objekt vom Typ TDatenliste zu speichern, also inklusive aller Methoden, also nicht nur die Daten.
Das heisst, Du müsstest zum Speichern die Daten alleine bereitstellen.
SizeOf(TDatenListe) gibt übrigens vier zurück, da TDatenListe ein Objekt ist, und somit die Grösse die eines Pointers ist.

Warum TDaten bei Dir ein Objekt ist, und kein Record bzw. packed record, kann ich im Moment nicht nachvollziehen.
Dann könntest Du eine Variable vom Typ TDaten Schreiben, mit SizeOf(TDaten). Dass könnte dann grundsätzlich funktionieren, wobei der Typ String auch wieder ein Problem darstellt, da strings dynamische Arrays, und somit auch wieder Pointer sind. Die von Dir genannte Struktur wäre also, als packed record, 12 Byte gross.
Strings müsstest Du dann also entweder als ShortStrings einbauen (mit Längenangabe, aber nur maximal 255 Stellen), oder mittels einer Routine schreiben, die den Inhalt ausliest, und die Längen berücksichtigt.

Das Schreiben könnte z.B. so aussehen:
(hier nur die Änderungen, create usw. fehlt)

Delphi-Quellcode:
type
  TDaten = packed record
    dwLen1 : DWORD;
    sValue : string;
    //...
  end;

var
  tdWork : TDaten;

begin
  // erst einmal die Länge merken
  tdWork.dwLen1 := length(tdWork.sValue);
  // Vier Byte schreiben, da ein DWORD 4 Byte gross ist
  DatenStream.Write(tdWork.dwLen1,4);
  // Nur den String schreiben, wenn er etwas enthält
  if tdWork.dwLen1 > 0 then begin
    // Den String ab der ersten Stelle schreiben
    // Ohne [1] funktioniert es nicht, da dieser Parameter nicht typisiert ist
    DatenStream.Write(tdWork.sValue[1],tdWork.dwLen1);
  end;
end;
Die Längen solltest Du auf jeden Fall mit speichern (müssen allerdings nicht in TDaten enthalten sein), damit Du auch bei leeren Strings weisst was zu tun ist.
Wichtig: Beim Auslesen muss der auszulesende String vor dem Auslesen schon auf die richtige Länge bebracht werden, z.B. mit SetLength.
Was übrigens noch fehlt, ist der Resourcenschutzblock try/finally. Damit müsste sichergestellt werden, dass das Dateihandle auch wieder freigegeben wird.

Beispiel:

Delphi-Quellcode:
  // Resource belegen
  DatenStream := TFileStream.Create(....);
  try
  // Mach was mit DatenStream
  finally
    // Resource freigeben
    FreeAndNil(DatenStream);
  end;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat