Autor Beitrag
D. Annies
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Fr 14.08.09 08:55 
Hi, Delpher,

wer kann mir mal - jenseits von einem Tuto - die Komponenten Datasource / Datasource1 und Dataset / Dataset1 erklären? - Insbesondere, wann ich sie auf dem Formular brauche und wann nicht.

Ich weiß, das z.B. ein DBGrid die Zuweisung braucht:
DBGrid1.Datasource.Dataset := Tabelle1;

Aber damit habe ich ja nicht die obigen Komponenten explizit angesprochen.

Danke für Praktikerantworten,
Detlef

_________________
ut vires desint, tamen est laudanda voluntas
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Fr 14.08.09 11:09 
Eine TDataSource dient als Bindeglied zwischen den datensensitiven Komponenten und einem DataSet

_________________
Markus Kinzler.
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1336
Erhaltene Danke: 119

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Fr 14.08.09 11:11 
Ein DataSet ist, wie die Delphi Hilfe es einem auch bereitwillig verrät, eine Schnittstelle zu einer tabellarischen Datenmenge. Also ist DataSet die Basisklasse jeder Tabelle oder Query.
Eine DataSource hingegen wird als Verteiler verwendet um die Daten in visuellen Komponenten darzustellen und ein DataSet als MasterSource einer Tabelle bereitstellen zu können. Wobei ein und dieselbe DataSource gleichzeitig für eine vis. Komponente als auch als MasterSource verwendet werden kann.

Willst du mit den Daten einer Tabelle arbeiten ohne sie visuell darzustellen brauchst du die DataSource nicht.
Die Reihenfolge in der eine visuelle Komponente Zugriff auf die Daten einer Tabelle nimmt ist immer:
  • Vis. Komponente -> (hat) DataSource -> (hat) DataSet

Ich frage mich aber erhlich warum du hier lieber auf eine Antwort wartest anstatt einfach in der Delphi Hilfe zu lesen. Was anderes als das was da drinne steht können wir dir auch nicht sagen.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Fr 14.08.09 11:33 
Hi, Stefan und Markus,
nun, es ist nicht so, dass ich zu faul bin, in der OH oder in Tuto's nachzusehen, aber folgendes ist für mich ein Unterschied:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
DBgrid1.datasource.dataset := aTable1;   // 1

//oder

Dataset1 := aTable1;                     // 2
Datasource1.Dataset := Dataset1;
DBGrid1.Datasource := Datasource1;


Im obigen Codeteil (1) habe ich doch nur zwei Variable: aTable1 und DBGrid1.
Im unteren Codeteil (2) habe ich vier Variable: aTable1, Dataset1, Datasource1 und DBGrid1.

Deshalb frage ich nach.
Oder denke ich zu kompliziert?
Detlef

_________________
ut vires desint, tamen est laudanda voluntas
Robert.Wachtel
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: Fr 14.08.09 12:59 
Wenn Du berücksichtigt, dass in Deinem ersten Beispiel Datasource eine Property des DBGrids darstellt und Dataset wiederum eine Property der Datasource, sind beide Beispiel nahezu identisch.

Ansonsten müsstest Du Dich noch einmal mit den Grundzügen der Objektorientierung auseinandersetzen.
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Fr 14.08.09 13:05 
Ok, und danke erstmal, Robert
Detlef :?

_________________
ut vires desint, tamen est laudanda voluntas
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 14.08.09 22:00 
Die "vollständige" Verbindung ist ungefähr so:
(Vis. Komponente -> TDataLink) -> TDataSource -> TDataSet

Wobei mehrere DataSources einem DataSet zugewiesen werden können, und mehrere DataLinks einem DataSouce.

Diese indirekten Zuweisungen und Zwischenstufen bringen Vor- und Nachteile. Der eigentliche Grund ist, so sehe ich es zumindest, programmatischer Natur. In anderen Sprachen kann ich ein DataSet durchaus auch direkt mit einem datensensitiven Control verbinden.

Innerhalb von VCL wird ein TDataLink verwendet, um datensensitive Controls bereitstellen zu können. Stark vereinfacht ausgedrückt ist der Unterschied zwischen Edit und DBEdit eine TDataLink Instanz (und die Steuerung und Kommunikation damit). Eines der Gründe, wieso es die Zwischenstufen wohl braucht ist, dass Delphi pro Event nur ein Event-Handler erlaubt. Das ganze ähnelt etwas einem Publish/Subscribe. Wird ein TDataLink mit einem TDataSource verbunden, so registriert sich das TDataLink beim TDataSource und kriegt so alle nötigen Events mit. Dasselbe gilt zwischen TDataSet und TDataSource.

TDataSource pflegt nun eine Liste von verbundenen TDataLinks und reicht DataEvents an alle TDataLinks weiter, die sie selbst von TDataSet kriegt. Genauso pflegt TDataSet eine Liste von TDataSources.

Als Beispiel instanziert sich TDBEdit intern ein TFieldDataLink, und kann so exklusiv über die relevanten Events verfügen, ohne direkt Events bei TDataSource oder TDataSet überschreiben zu müssen. (TFieldDataLink macht natürlich noch ein bisschen mehr als nur Events anzubieten, es ist auch an ein bestimmtes Feld gebunden, etc.)

[OT]Leider bieten die Klassen um TDataSet am Schluss dann doch zu wenig, um komplexe datengebundene Controls damit effizient implementieren zu können. Beispielsweise ist (ironischerweise) das ganze nicht unbedingt geeignet, um damit ein komplexes Grid zu betreiben (obwohl TDataSet ja eben gerade für tabellarische Daten konzipiert ist). Für ein TDBGrid reicht es gerade noch. Sieht man sich jedoch die Sources zu DevExpress Grid an, so merkt man, dass die erstens eine interne Kopie des TDataSets halten müssen und bei jeder Änderung des aktiven Records über das gesamte TDataSet iteriert werden muss, um die relevante Änderung herausfiltern zu können. Und zwar deswegen, weil das Framework bei den Events, die durch TDataSource durchsickern nicht fein genug unterschieden wird, was jetzt ganz genau passiert ist. Andere komplexe Grids umgehen das Problem, in dem sie prinzipiell nur einen "Offlinemodus" bereitstellen, d.h. eigentlich nicht mehr Datengebunden sind. [/OT]
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Sa 15.08.09 08:24 
Hi, Delfiphan,
das ist ja sehr interessant!

Nun, mir ging auch so etwas im Kopf herum, ob ich auf die Komponenten Datasource1 und Dataset1 (z.B.) verzichten kann, oder ob sie existieren müssen - sonst würde es ja reichen, wenn eine Tabelle(nvariable) existiert.

Ich wollte genau auch so eine theoretische Erklärung haben und nicht etwas von der Art "probier's doch einfach aus", weil ich eigentlich im Vorwege wissen will, ob etwas geht oder nicht (und warum).

Danke dir,
Detlef

_________________
ut vires desint, tamen est laudanda voluntas
Robert.Wachtel
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: Sa 15.08.09 11:19 
user profile iconD. Annies hat folgendes geschrieben Zum zitierten Posting springen:
[...] Nun, mir ging auch so etwas im Kopf herum, ob ich auf die Komponenten Datasource1 und Dataset1 (z.B.) verzichten kann, oder ob sie existieren müssen - sonst würde es ja reichen, wenn eine Tabelle(nvariable) existiert. [...]

Bitte beherzige meinen Rat und beschäftige Dich nochmal mit den Grundlagen der objektorientierten Programmierung.
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Sa 15.08.09 18:12 
jo, mach ich.

_________________
ut vires desint, tamen est laudanda voluntas