Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi Tutorial zur DP-Collection (https://www.delphipraxis.net/52105-tutorial-zur-dp-collection.html)

alcaeus 23. Aug 2005 22:16


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 DPCollection-Vorstellungsthread.

Das Tutorial ist in Deutsch und Englisch verfuegbar (ca. 40 kB, ZIP):
Deutsche Version
Englische Version

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]

Khabarakh 25. Aug 2005 17:58

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.

Robert_G 25. Aug 2005 18:42

Re: Tutorial zur DP-Collection
 
Zitat:

Zitat von Khabarakh
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.

Jupp, schlimmer ist aber, dass er überall Assign überschreibt und es wohl nicht ein einziges Mal benutzt. :mrgreen:
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... ;)

Olli 25. Aug 2005 18:49

Re: Tutorial zur DP-Collection
 
Zitat:

Zitat von Robert_G
Ich bezweifle nämlich, dass die ehrenwerte Garde der Nicht-OOP'ler das in seiner Gänze verstehen wird... ;)

ROFL ... wenn du mir jetzt noch erzählst, daß man mit Delphi OOP ... :duck:

Robert_G 25. Aug 2005 18:51

Re: Tutorial zur DP-Collection
 
Zitat:

Zitat von Olli
Zitat:

Zitat von Robert_G
Ich bezweifle nämlich, dass die ehrenwerte Garde der Nicht-OOP'ler das in seiner Gänze verstehen wird... ;)

ROFL ... wenn du mir jetzt noch erzählst, daß man mit Delphi OOP ... :duck:

So'n bissel... :mrgreen:

alcaeus 1. Sep 2005 11:30

Re: Tutorial zur DP-Collection
 
So, ich habe eine kurze Beschreibung eingefuegt und die entsprechenden Posts entfernt, da sie jetzt "sinnlos" sind.


Zitat:

Zitat von Khabarakh
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.

Koenntest du mir das evtl. nochmal genauer erklaeren? Auch in den Vorstellungsthreads der DP-Collection wird Assign ueberschrieben, ich wusste bis jetzt ja nichtmal dass es AssignTo gibt :oops:


Zitat:

Zitat von Robert_G
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.

Also als ich das probiert habe, hat das Kopieren der Collection funktioniert, ich muss die Demos aber noch "veroeffentlichungsreif" machen :stupid:


Zitat:

Zitat von Robert_G
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...

Man braucht es nicht oft, ich habe es der Vollstaendigkeit halber eingefuegt. Das Kopieren einer ganzen Collection habe ich nur deshalb eingefuegt, weil ich es einmal gebraucht habe. Aber du hast recht, es ist nicht der meistverwendeste Teil der Collections ;)


Zitat:

Zitat von Robert_G
Ich bezweifle nämlich, dass die ehrenwerte Garde der Nicht-OOP'ler das in seiner Gänze verstehen wird... ;)

Das soll auch nicht der Sinn und Zweck sein, dafuer gibt es OOP-Anfaengertutorials. Das Tutorial ist nicht wirklich fuer OOP-Einsteiger gedacht. :zwinker:

Gibt es sonst noch Vorschlaege zum Tutorial?

Greetz
alcaeus

Khabarakh 1. Sep 2005 13:12

Re: Tutorial zur DP-Collection
 
Zitat:

Zitat von alcaeus
Zitat:

Zitat von Khabarakh
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.

Koenntest du mir das evtl. nochmal genauer erklaeren? Auch in den Vorstellungsthreads der DP-Collection wird Assign ueberschrieben, ich wusste bis jetzt ja nichtmal dass es AssignTo gibt :oops:

Als ich mich zu Beginn der Ferien mit Komponentenentwicklung auseinandergesetzt habe, hab ich diese Zeile in den Delphi-Sourcen gesehen:
Delphi-Quellcode:
procedure TPersistent.Assign(Source: TPersistent);
begin
  if Source <> nil then Source.AssignTo(Self) else AssignError(nil);
end;
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.

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.

Weazy 20. Mär 2006 20:38

Re: Tutorial zur DP-Collection
 
Gibt es eine möglichkeit die (binären) Dateien zu Komprimieren?

alcaeus 21. Mär 2006 07:29

Re: Tutorial zur DP-Collection
 
Mit dem Hier im Forum suchenRC4-Streamdekorierer kannst du sie verschluesseln, also schaetze ich mal dass man sie auch komprimieren kann. Wie das weiss ich jetzt auch nicht.

Greetz
alcaeus

Weazy 21. Mär 2006 22:49

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:
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.
Das Problem ist nur das
Delphi-Quellcode:
fbutton:=tbutton.Create(self);
natürlich nicht möglich ist. Ich weiss nicht mal ob ich auf dem richtigen Weg bin :oops: ...

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 01:06 Uhr.
Seite 1 von 2  1 2      

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