AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Wie eigenen Record definieren und verwenden?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie eigenen Record definieren und verwenden?

Ein Thema von TonyMontana · begonnen am 15. Jan 2008 · letzter Beitrag vom 16. Jan 2008
Antwort Antwort
Seite 2 von 2     12   
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#11

Re: Wie eigenen Record definieren und verwenden?

  Alt 15. Jan 2008, 22:05
Delphi-Quellcode:
type
  TMyRec = class(TObject)
  private
    FValue: Integer;
    FText: String;
    FStringList: TStringList;
    function getList(i: Integer): string;
    procedure SetList(i: Integer; const Value: string);
  public
    property Value: Integer read FValue write FValue;
    property Text: string read FText write FText;
    property SringList[i: Integer]: string read getList write SetList;
    constructor Create;
    destructor Destroy;
end;





constructor TMyRec.Create;
begin
  inherited;
  FStringList := TStringList.Create;
end;

destructor TMyRec.Destroy;
begin
  FreeAndNil(FStringList);
  inherited;
end;


function TMyRec.getList(i: Integer): string;
begin
  if I < FStringList.Count then
    Result := FStringList[i] else
    Result := '';
end;

procedure TMyRec.SetList(i: Integer; const Value: string);
begin
  if i < FStringList.Count then
    FStringList[i] := Value else
    FStringList.Add(Value);
end;
beim integer macht das der compiler für dich.
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.106 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
TonyMontana
(Gast)

n/a Beiträge
 
#13

Re: Wie eigenen Record definieren und verwenden?

  Alt 16. Jan 2008, 01:06
@dominikkv: Danke für die Mühe! So funktioniert es jetzt ohne Zugriffsverletzungen oder ähnliches

@Christian Seehase: Aha, so langsam wird mir das alles etwas klarer, danke für die gute Erklärung. Da du es angesprochen hast, wie speichere ich einen Record bzw. ein Objekt in eine Datei? Dazu müsste ich ja wissen, wie viel Speicher für das Objekt reserviert worden ist. Und SizeOf liefert ja dann nur die Größe des Pointers selbst, also 4 Bytes...
Muss man dann den Pointer auf die Klasseninstanz irgendwie dereferenzieren um dann mit SizeOf die Größe zu ermitteln? Sonst habe ich nichts brauchbares in der Delphi Hilfe dazu gefunden, ich weiß aber auch nicht genau wonach ich suchen sollte.
Jedenfalls wäre es nicht unpraktisch, wenn ich Objekte einfach speichern und wieder laden könnte.

Bis hierhin schonmal DANKE!

  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.889 Beiträge
 
Delphi 12 Athens
 
#14

Re: Wie eigenen Record definieren und verwenden?

  Alt 16. Jan 2008, 07:35
@TonyMonatna:
Du must ja keine Typisierte Datei nehmen und Dateistreams sin dein Thema um das ch mich später kümmern würde.
Speicher es doch einfach in eine Text Datei.
Delphi-Quellcode:
Procedure Save;
var f:textFile;
Begin
  AssignFile(f,c:\'bla.cfg');
  Rewrite(f); // oder Append

  WriteLN(f,Myrec.text);
   // &c.

  CloseFile(f);
end;
zudem können alle Objekte die von mit der Klasse TPersistent Verwand sind sich selbst in eine Datei speichern und von dort laden.

Lies dir dazu einfach mal die Funktionen durch:
TStringlist.savetofile
TStringlist.loadfromFile
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
TonyMontana
(Gast)

n/a Beiträge
 
#15

Re: Wie eigenen Record definieren und verwenden?

  Alt 16. Jan 2008, 10:54
@QuickAndDirty: Danke für deinen Vorschlag. Aber mich würde es dennoch mal interessieren, wie ich herausfinden kann, wie viel Speicher ein Objekt belegt und wie ich das ganze dann in einem Rutsch speichern kann, die Klasse kann ja mal sehr viele Felder enthalten und dann ist das manuelle speichern irgendwann sehr umständlich.
Sind Streams dafür geeignet? Ich habe mir auch kurz ein tutorial angesehen zum Thema typisierte Dateien und speichern, dort steht allerdings dabei, dass man nur ShortStrings verwenden kann und zB Integer, damit die Länge eines Datensatzes klar ist. Muss ich dann die Länge eines Dynamischen Objekts selbst berechnen um es speichern zu können?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.545 Beiträge
 
Delphi 11 Alexandria
 
#16

Re: Wie eigenen Record definieren und verwenden?

  Alt 16. Jan 2008, 11:03
Zitat von TonyMontana:
Muss ich dann die Länge eines Dynamischen Objekts selbst berechnen um es speichern zu können?
In einer typisierten Datei ist jedes Element genau gleich groß, also wirst Du so nicht weiter kommen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
TonyMontana
(Gast)

n/a Beiträge
 
#17

Re: Wie eigenen Record definieren und verwenden?

  Alt 16. Jan 2008, 11:16
Zitat von DeddyH:
In einer typisierten Datei ist jedes Element genau gleich groß, also wirst Du so nicht weiter kommen.
Ja, das ist schon klar. Aber ich möchte ja auch wissen, wie ich ein Objekt speichern kann, von dem ich zur Entwicklungszeit die Größe noch nicht weiß. Es muss doch möglich sein, herauszufinden, wie viel speicher ein Objekt aktuell belegt oder nicht?
Wie gesagt, SizeOf funktioniert laut Christian Seehase nicht, da man dann die Größe des Pointers auf die Klasseninstanz erhält ...
Und die ist nun mal 4 Bytes unabhängig davon, wie viel Speicher von dem Objekt belegt wird.
  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 22:17 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