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
 
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.123 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
 


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:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz