![]() |
Tutorial zur DP-Collection
Hallo ihr,
einige von euch wussten bereits davon, jetzt hab ich es endlich geschafft, das Tutorial ueber die DPCollection fertigzustellen. Darin geht es um die generelle Verwendung der DPCollection, sowie um die Verwendung der Collection-Templates, die allerdings ein bisschen "aufgebohrt" wurden ;) Die DP-Collection ist eine Unit zum einfachen Speichern von Daten, vor allem komplexeren Strukturen. Ungleich wie bei typed files kann ich auch "normale" Windows-Strings sowie ganze Objekte (Hauptsache von TPersistent abgeleitet) abspeichern, und das mit wenigen Zeilen Quellcode. Weitere Infos gibts im ![]() Das Tutorial ist in Deutsch und Englisch verfuegbar (ca. 40 kB, ZIP): ![]() ![]() Mein Dank geht an Jens Schumann und Maximov fuer die DPCollection und die Basis-Template-Klasse, Robert_G fuer seine erweiterte Version der Templates sowie jfheins fuer die Ueberzetzung Englisch-Deutsch. Ich hoffe es hilft euch, fuer Anregungen/Fragen ist natuerlich immer Platz ;) Greetz alcaeus [edit=Phoenix]Links aktualisiert. Mfg, Phoenix[/edit] |
Re: Tutorial zur DP-Collection
Hat nichts mit der DP-Collection zu tun, aber sollte man nicht besser AssignTo statt Assign überschreiben? Ist mit Free/Destroy vergleichbar, Assign/Free prüft den Pointer auf nil, dann wird das vom Programmierer überschriebene AssignTo/Destroy aufgerufen.
|
Re: Tutorial zur DP-Collection
Zitat:
Er denkt zwar daran Assign zu überschreiben, aber nicht die Sub collections beim Zuweisen durch den Setter zu kopieren. Das muss man übrigens auch gar nicht, read reicht doch als Zugriff für die sub collection vollkommen aus. Und das Assign auf den Items, braucht man wirklich nur, wenn man den Inhalt kopieren will. Das hast du in dem Tutorial an keiner Stelle gebraucht, ich bezweifle, dass man es überhaupt sehr oft braucht. So siehts für noobs halt ein wenig zu geeky aus, mit all den overrides, inherited, whatsoever... Nicht übel nehmen, das war nur mein Eindruck. Ich bezweifle nämlich, dass die ehrenwerte Garde der Nicht-OOP'ler das in seiner Gänze verstehen wird... ;) |
Re: Tutorial zur DP-Collection
Zitat:
|
Re: Tutorial zur DP-Collection
Zitat:
|
Re: Tutorial zur DP-Collection
So, ich habe eine kurze Beschreibung eingefuegt und die entsprechenden Posts entfernt, da sie jetzt "sinnlos" sind.
Zitat:
Zitat:
Zitat:
Zitat:
Gibt es sonst noch Vorschlaege zum Tutorial? Greetz alcaeus |
Re: Tutorial zur DP-Collection
Zitat:
Delphi-Quellcode:
Ich bin davon ausgegangen, dass das Ganze wie mit Free/Destroy funktioniert: Assign wird vom Programmierer nicht überschrieben, sondern bleibt immer gleich. Es testet den Pointer auf nil und ruft dann AssignTo auf, das vom Programmierer überschrieben und mit Anweisungen zum Kopieren der neuen Felder ergänzt wurde.
procedure TPersistent.Assign(Source: TPersistent);
begin if Source <> nil then Source.AssignTo(Self) else AssignError(nil); end; Gerade habe ich es mir noch einmal genauer angesehen und festgestellt, dass es etwas komplizierter ist :mrgreen: . Angenommen, wir wollen eine neue Klasse schreiben, diese Klasse soll die Daten einer anderen vorhandenen Klasse kopieren können und umgekehrt, obwohl beide Klassen als nächste gemeinsame Basisklasse erst TPersistent gemein haben. Für den einen Weg reicht es, Assign der neuen Klasse zu überschreiben und die Daten zu kopieren. Der andere Weg wird komplizierter, schließlich müssten wir Assign der vorhandenen Klasse überschreiben, diese wollen wir jedoch nicht ändern. Hier nimmt uns aber Delphi die Arbeit ab. Eine Instanz unserer neuen Klasse werde also der anderen als Parameter von Assign übergeben. Nun werden alle Assigns der ganzen Hierarchie bis zu TPersistent aufgerufen, da nirgendwo das Verhalten für das Kopieren unserer Klasse definiert ist. Logisch, wir haben die Klasse ja gerade erst geschrieben. Da die alte Klasse die neue Klasse nicht kopieren kann, ruft TPersistent.Assign nun AssignTo der neuen Klasse auf, damit diese sich in die alte Klasse kopiert. IMO einfach genial :thumb: ! Aber solange man nur gleiche Klassentypen kopieren will, ist es wohl ziemlich egal, welche Methode man überschreibt :wink: . bei AssignTo kann man sich aber sicher sein, dass der Parameter ungleich nil ist. |
Re: Tutorial zur DP-Collection
Gibt es eine möglichkeit die (binären) Dateien zu Komprimieren?
|
Re: Tutorial zur DP-Collection
Mit dem
![]() Greetz alcaeus |
Re: Tutorial zur DP-Collection
Ich versuche gerade alle properties einer VCL mit der dbcollection zu speichern und wieder zu laden. Dazu habe ich mal folgende Test unit geschrieben:
Delphi-Quellcode:
Das Problem ist nur das
unit Unit2;
interface uses dpCollection,StdCtrls; type TSimpleCollectionItem = class(TCollectionItem) private fCaption: String; fbutton:tbutton; public procedure Assign(Source: TPersistent); override; procedure assignbutton(const value:tbutton); published constructor Create(Collection : TCollection); override; destructor Destroy; override; property Caption: String read fCaption write fcaption; property button: tbutton read fbutton write assignbutton; end; implementation uses Unit1; constructor TSimpleCollectionItem.Create(Collection: TCollection); begin inherited Create(Collection); fbutton:=tbutton.Create(self); end; destructor TSimpleCollectionItem.destroy; begin fbutton.free; end; procedure TSimpleCollectionItem.assignbutton(const value:tbutton); begin fbutton.Assign(value); end; procedure TSimpleCollectionItem.Assign(Source: TPersistent); begin if Source is TSimpleCollectionItem then begin fCaption := TSimpleCollectionItem(Source).Caption; fbutton:=tSimpleCollectionItem(source).button; end else inherited Assign(Source); end; end.
Delphi-Quellcode:
natürlich nicht möglich ist. Ich weiss nicht mal ob ich auf dem richtigen Weg bin :oops: ...
fbutton:=tbutton.Create(self);
Mein Ziel ist es, eine unbestimmte Anzahl von VCL in eine Datei zu speichern und wieder zu laden (Level Editor). Ich hoffe ihr könnt mir helfen, Danke schon mal im Voraus! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 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 by Thomas Breitkreuz