Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

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

Re: Wie eigenen Record definieren und verwenden?

  Alt 15. Jan 2008, 23:08
Moin Tony,

nicht jedes Feld in einem Objekt ist ein Zeiger, sondern jede Variable, die vom Typ einer, beliebigen, Klasse ist, ist ein Zeiger.

Beispielsweise hast Du in vielen Programmen ein Formular.
Als Standard wäre das Form1, vom Typ TForm1, wobei Form1 die Adresse der Instanz von TForm1 enthält, nachdem das Formular erzeugt wurde. Form1 ist also ein Zeiger, der "nur" auf die Instanz der Klasse TForm1 verweist.
Mit Hilfe von SizeOf kannst Du Dir anzeigen lassen, wieviel Platz eine Variable belegt. Bei Form1 wäre das Ergebnis 4, da ein Zeiger bei einem 32-Bit Compiler eben 4 Byte gross ist. Es spielt dabei also keine Rolle, wieviele Komponenten, Felder oder sonstige Daten das Formular enthält. Das meinte ich mit der Compilermagic. Man kann Form1 direkt verwenden, ohne sich darum kümmern zu müssen, dass es sich eigentlich um einen Zeiger handel. Der Compiler "weiss" bei einer Variablen, die eine Klasse als Typ hat, dass es sich um einen Zeiger handelt, und man muss sich nicht darum kümmern, wenn man, z.B., auf Felder zugreifen will. (Stichwort: Dereferenzieren, Symbol: ^)

Bei einem String handelt es sich zwar nicht um ein Objekt, aber eine Stringvariable liefert bei SizeOf auch immer 4 zurück, da es sich auch hier um einen Zeiger handelt, nur übernimmt hier die interne Speicherverwaltung das Reservieren und Freigeben des erforderlichen Speichers (die ShortStrings lasse ich hier einmal aussen vor).
Wenn man die Adresse, die eine Stringvariable enthält als Nullpunkt ansieht, "weiss" die Speicherverwaltung, dass sich an der Adresse minus 4 die Länge, und an der Adresse -8 ein Referenzzähler für den String befindet, und an der Adresse selber der eigentliche Inhalt des Strings beginnt.
Die Speicherverwaltung sorgt auch dafür, dass ein solcher String immer mit #00 beendet wird.
So ist es also kein Problem mittels eines einfach Typcasts aus einem String ein PChar zu machen, und diesen so, z.B., direkt in einer API-Funktion zu verwenden, die ja mit den delphitypischen Strings nichts anfangen können.
Da ein String eigentlich auch nur ein Zeiger ist, kann man also auch einen Record, der einen String enthält auch nicht so einfach in einer Datei speichern, sondern muss sich dafür etwas einfallen lassen.

Zeiger braucht man eigentlich immer dann, wenn die Datenmenge, die sich dahinter verbirgt, nicht festliegt.
(es mag zwar auch Klassen geben, bei denen sich die Grösse nicht verändert, da dies in der Masse der Fälle aber nicht der Fall ist, lohnt es sich nicht für diese einen Sonderfall zu generieren.)
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