AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Tutorial zur DP-Collection
Tutorial durchsuchen
Ansicht
Themen-Optionen

Tutorial zur DP-Collection

Ein Tutorial von alcaeus · begonnen am 23. Aug 2005 · letzter Beitrag vom 14. Sep 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von alcaeus
alcaeus
Registriert seit: 11. Aug 2003
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]
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
 
Benutzerbild von Khabarakh
Khabarakh
 
#2
  Alt 25. Aug 2005, 17:58
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.
Sebastian
  Mit Zitat antworten Zitat
Robert_G
 
#3
  Alt 25. Aug 2005, 18:42
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.
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...
  Mit Zitat antworten Zitat
Olli
 
#4
  Alt 25. Aug 2005, 18:49
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 ...
  Mit Zitat antworten Zitat
Robert_G
 
#5
  Alt 25. Aug 2005, 18:51
Zitat von Olli:
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 ...
So'n bissel...
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus
 
#6
  Alt 1. Sep 2005, 11:30
So, ich habe eine kurze Beschreibung eingefuegt und die entsprechenden Posts entfernt, da sie jetzt "sinnlos" sind.


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


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


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

Gibt es sonst noch Vorschlaege zum Tutorial?

Greetz
alcaeus
Andreas B.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh
 
#7
  Alt 1. Sep 2005, 13:12
Zitat von alcaeus:
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
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 .
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 !
Aber solange man nur gleiche Klassentypen kopieren will, ist es wohl ziemlich egal, welche Methode man überschreibt . bei AssignTo kann man sich aber sicher sein, dass der Parameter ungleich nil ist.
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von Weazy
Weazy

 
Delphi 2007 Enterprise
 
#8
  Alt 20. Mär 2006, 20:38
Gibt es eine möglichkeit die (binären) Dateien zu Komprimieren?
Philippe Wechsler
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus
 
#9
  Alt 21. Mär 2006, 07:29
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
Andreas B.
  Mit Zitat antworten Zitat
Benutzerbild von Weazy
Weazy

 
Delphi 2007 Enterprise
 
#10
  Alt 21. Mär 2006, 22:49
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 fbutton:=tbutton.Create(self); natürlich nicht möglich ist. Ich weiss nicht mal ob ich auf dem richtigen Weg bin ...

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!
Philippe Wechsler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:47 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