![]() |
Eigenen Typ in Klasse
Hi all
Ich möchte in einer eigenen Klasse einen Record-Typ in einem Dynamischen Array speichern, nun sollte aber der Record-Typ auch von aussen sichtbar sein. Der User der Klasse soll eine neue Variable des Record-Typs deklarieren können und diese dann an eine Methode der Klasse übergeben. z.B. so:
Delphi-Quellcode:
Leider habe ich keine Ahnung wie ich das in meiner Klasse implementieren muss.
var Foo: TRecord;
Klasse.Add(foo); grz zer00 |
Re: Eigenen Typ in Klasse
Deine add proc könnte so aussehen:
Delphi-Quellcode:
(aus dem kopf)
procedure tetc.add(foo: Tdeinrecord);
begin setlength(derarray, length(derarray)+1) derarray[length(derarray)]:= foo; end; |
Re: Eigenen Typ in Klasse
So vielleicht:
Delphi-Quellcode:
Quellcode ungetestet. Nur so runtergetippt. Auch die Speicherverwaltung der Records(new, dispose) fehlt noch. Sollte aber so ne Idee von dem geben, wie das aussehen könnte. BTW: Warum willst du eigentlich n Record nehmen? Warum nicht auch ne Klasse. Dann könntest du dir die Speicherverwaltung nämlich schenken(TObjectList, ggf. + Template).
TRecord = record
Data: string; Data2: Integer; end; TTest = class(TObject) private FData: TList; public constructor Create; destructor Detroy; override; property: Data: TList read FData write FData; procedure Add(Data: TRecord); end; constructor TTest.Create; begin inherited Create; FList := TList.Create; end; destructor TTest.Destroy; begin FList.Free; inherited Destroy; end; procedure TTest.Add(Data: TRecord); begin FData.Add(@Data); end; mfg Christian |
Re: Eigenen Typ in Klasse
mal ne Frage, ist es nicht "sicherer", alle Daten eines Records exakt zu übertragen, also
Delphi-Quellcode:
anstatt zu sagen:
procedure add( foo: trec );
begin self.arrayoftrec[..].t1 := foo.t1; self.arrayoftrec.t2 := foo.t2; end;
Delphi-Quellcode:
??
...
self.arrayoftrec[...] := foo; ... |
Re: Eigenen Typ in Klasse
Zitat:
mfg Christian |
Re: Eigenen Typ in Klasse
Moin arbu man,
wobei man aus Performance Gründen nicht gerade immer um 1 erhöhen sollte. Erst einmal auf die zu erwartende Grösse setzen, und beim Hinzufügen prüfen, ob noch Platz ist, dann ggf. um einen bestimmten Wert erhöhen. Beim Vergrössern mittels SetLength wird jedesmal ein neues Array angelegt, und der Inhalt des alten dort hineinkopiert. |
Re: Eigenen Typ in Klasse
Auf jeden Fall sollte man nur die gültigen Elemente des Arrays benutzen:
Delphi-Quellcode:
Gruß Hawkeye
procedure tetc.add(foo: Tdeinrecord);
begin setlength(derarray, length(derarray)+1) derarray[High(derarray)]:= foo; // <-- High() statt Length() end; |
Re: Eigenen Typ in Klasse
Zitat:
noch viel besser ist es, hier einfach gar kein Array zu verwenden. Ein Array ist nun mal eine recht statische Struktur und
Delphi-Quellcode:
ist nicht wirklich empfehlenswert (kostet unnötig Zeit und wird vom Speichermanager nicht unbedingt optimal gelöst). Viel besser ist es, wenn du einfach eine TList verwendest, die ist genau dafür gedacht. An sich kannst du deine Records viel schöner als Pointer auf den Record übergeben (ist schneller) und diesen Pointer kannst du dann in deiner TList speichern. Wenn du lesend auf das Array zugreifst, dann kannst du hier ganz einfach eine Methode anlegen, die die TList in ein Array umwandelt. Schreibend kannst du auch Wahlfrei auf die TList zugreifen.
setLength(Array, length(Array) + 1);
Gruß Der Unwissende |
Re: Eigenen Typ in Klasse
Zitat:
mfg Christian |
Re: Eigenen Typ in Klasse
Danke für die vielen Antworten!
Sehe ich das richtig, dass ich mein Problem am besten mit einer Verketteten Liste löse. Da ich aber noch nie viel mit Pointern gearbeitet habe werde ich sicher noch ein paar Fragen an euch haben. Bitte habt ein bisschen Geduld. ;) grz zer00 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:55 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