Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 15, 2025 19:14

Foren-Übersicht » Sonstiges » Community-Projekte
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 427 Beiträge ]  Gehe zu Seite Vorherige  1 ... 10, 11, 12, 13, 14, 15, 16 ... 29  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 09, 2006 01:27 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo Lossy,
das mit der Y-Koordinate mache ich schon immer automatisch. Hab mich an den Koordinatenursprung unten links gewöhnt, ist so schön anschaulich. Dadurch muss ich aber auch immer die Textur flippen, wenn ich Deine glBitmap benutze.
Ich denke mal, wir sollten das System nehmen, das alle kennen. Und das läuft also vermutlich auf den Koordinatenursprung oben links hinaus. Seufz!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 09, 2006 01:31 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo,
Ich stehe gerade wieder vor einem prinzipiellen Problem. Ich habe jetzt den ganzen Thread noch mal durchgeackert, um die Infos zusammenzustellen. Dabei bin ich auf Taks Schnittstelle nach außen gestoßen. Er realisiert die Eingabe/Ausgabe der Felder eines GUI-Elements mit Hilfe von Published Properties. Dabei werden Feldinhalte des Objekts gelesen/geschrieben, das Ganze dient zur Unterstützung des XML-Streaming und der Skriptsprache und hört sich sehr praktisch an.

Folgende Info habe ich dazu aus der Delphi-Hilfe (Stichwort published):

Zitat:
published-Eigenschaften sind auf bestimmte Datentypen beschränkt. Ordinal-, String-, Klassen-, Schnittstellen- Variant- und Methodenzeigertypen können mit dieser Sichtbarkeit deklariert werden. Bei Mengentypen ist dies nur möglich, wenn die Ober- und Untergrenze des Basistyps einen Ordinalwert zwischen 0 und 31 hat. (Die Menge muss also in ein Byte, Wort oder Doppelwort passen.) Auch alle Real-Typen außer Real48 können als published deklariert werden. Für Eigenschaften von Array-Typen ist published dagegen nicht zulässig (im Gegensatz zu den weiter unten beschriebenen Array-Eigenschaften).

Einige Eigenschaften, die als published deklariert werden können, werden vom Streaming-System nicht voll unterstützt. Dazu gehören die Eigenschaften von record-Typen, die Array-Eigenschaften aller als published deklarierbaren Typen und die Eigenschaften von Aufzählungstypen, die anonyme Werte enthalten. Wenn Sie eine derartige Eigenschaft als published deklarieren, wird sie im Objektinspektor nicht korrekt angezeigt, und ihr Wert geht beim Schreiben des Streams auf die Festplatte verloren.


In meinem Hinterkopf geistern dabei die ganze Zeit die Begriffe Left,Top,Width,Height herum.
Was hat das damit zu tun? Nun, ich frage mich ernsthaft, ob wir mit den vier Werten auskommen oder ob wir uns damit nicht eine Beschränkung auferlegen, die uns später noch leid tun wird (Lossy Ex hat mir einen Floh ins Ohr gesetzt, und der sticht jetzt). Wenn man aber kompliziertere Datentypen (z.B. eine Liste von Punkten) verwendet, kommt man mit diesen Published Properties in Schwierigkeiten. Klartext: die Methode, wie Tak sie anwendet, ist dann nicht mehr möglich. Ich denke dabei an Spiele, die kompliziertere Fenster haben und mit dem vorliegenden System auch auskommen müssen, siehe das letzte Projekt von Sascha Willems.

Daher noch mal die Frage: wird man mit Left,Top,Width,Height (bzw. mit vier Integer-Werten) auskommen?

Es ist damit folgendes möglich:
· einfache Linien
· Vierecke (grundsätzlich sind mit Left,Top,Right,Bottom sowohl rechtwinkelige als auch schiefwinkelige Vierecke möglich)
· Regelmäßige Vielecke, die im Viereck eingeschrieben sind
· Ellipsen/Kreise, die im Viereck eingeschrieben sind
· vielleicht noch was, was ich übersehen hab

Was nicht möglich ist: unregelmäßige Polygone darzustellen, denn das bräuchte eine Punkteliste, gar nicht zu reden von einer Texturkoordinatenliste.
Ihr könnt jetzt natürlich sagen: schmeißen wir eine Textur drauf und gut ist. Aber ist das wirklich so?
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 09, 2006 02:50 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Dein gedankengang geht in eine Richtung die ist beängstigent.^^
UV Koordinaten haben nichts mit den Published Properties zu tun.
UV Koordinaten haben garnichts mit der GUI zu tun, sondern mit dem Wrapper für Zeichenfunktionen.

Ich sollte das mal ein bischen prezisieren und auflösen.
Als Published Properties werden alle Methoden und Variablen angegeben die nach aussen erreichbar sein müssen.
Der fehlende Support von Arrays hab ich über Funktionen gelöst und das schreiben auf Listen hab ich über ein Property mit dem Typ und als write funktion kommt dann eine Funktion die dann die Liste um 1 erweitert.
Das es ausreicht zeigt ja die XD_GUI und deren Script und XML anbindung(für Theme und Formulare).
Ausserdem denke mal an VCL ;) die Delphi IDE verwendet auch die RTTI daten und die Properties werden auch verwendet um die Einstellungen für die VCL zu machen. In diese Richtung braucht man keine Panik schieben.

Allerdings sollte ich noch folgendes zu sagen. Durch das verschieben nach Published, fallen größere Daten an und diese werden in der größe der Binary zu Buche schlagen. Was bedeutet, mit jedem Widgettyp kommen ein paar Bytes mehr dazu.
Die ersparnisse im Code, für die Loader der Formular und Theme Datein wird das aber sehr stark ausgleichen.

Mein XML Theme Loader ist knapp 200Zeilen groß und mein XML Formular Loader ist knapp 240Zeilen lang, wobei er nach hier vorgeschlagender realisierung noch 20-30 Zeilen verlieren würde. Beide sind völlig unabhängig von änderungen im Widget umfang oder von den Widget selber.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 09, 2006 02:56 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Beliebige Formen kann man einfach realisieren.
1) Die Komponenten zeichnet eben nicht das ganze Rechteck, dass ihr zu steht voll.
2) Für Maus-Ereignisse benötigt man noch eine zusätzliche Methode function HitTest(p:TPoint):Boolean mit der geprüft werden kann, ob der Punkt zur Komponente gehört. Die Standard Implementation prüft nur auf Rechteck, kann aber überschrieben werden.

Beim Abspeichern der Komponenten ist man mit einer externen Klasse besser dran, weil man so von verschiedenen Quellen laden bzw. Erweiterungen/Änderungen im Format vornehmen kann. Dann ist die GUI nicht so stark an ein Format, in diesem Fall XML, gebunden.

Warum wird eigentlich nicht TComponent als Grundlage benutzt? (steht das schon auf den Seiten vorher?) Das bietet schon eine Verwaltung untergeordneter Objekte und kann auf Streams gespeichert werden. Für Properties die nicht als published deklariert werden können gibt es die Methode DefineProperties in der Klasse TPersistent, von der alle(?) Objekte mit published properties in der VCL abgeleitet sind. Dann müßte man nur noch den TReader/TWriter anpassen, dass er keine Delphi *.dfm sondern xml ausgibt bzw liest.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 09, 2006 10:36 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Tak schrieb:
Zitat:
Dein gedankengang geht in eine Richtung die ist beängstigent.^^
UV Koordinaten haben nichts mit den Published Properties zu tun.
UV Koordinaten haben garnichts mit der GUI zu tun, sondern mit dem Wrapper für Zeichenfunktionen.


Es war reichlich spät gestern. Vielleicht war ich deswegen vernagelt. Ich schiele dabei auf den Theme Manager: angenommen, ich will ein kompliziertes Fenster bauen. Und ich möchte eine Textur dazu verwenden. Da könnte ich doch auf die Idee kommen, Punkt- und Texturkoordinaten laden zu wollen. Und dazu brauche ich diese Published Properties, sonst funktioniert das Laden nicht, richtig? Aber Punkt und Texturkoordinaten muss man in Arrays oder Listen haben. Und diese werden von den Published Properties nicht unterstützt, ergo kann ich sie auch nicht laden und daher haben sie in meinem Konzept auch keinen Platz. Ich habe nur sinniert, ob das nicht vielleicht ein Fehler ist.

Zitat:
Der fehlende Support von Arrays hab ich über Funktionen gelöst und das schreiben auf Listen hab ich über ein Property mit dem Typ und als write funktion kommt dann eine Funktion die dann die Liste um 1 erweitert.

Aber das kann man zum Laden/Speichern nicht benutzen, oder?

Allerdings finde ich auch, das Deine Art zu Laden und zu Speichern höchst praktisch ist, keine Frage.

Tak schrieb:
Zitat:
Ausserdem denke mal an VCL die Delphi IDE verwendet auch die RTTI daten und die Properties werden auch verwendet um die Einstellungen für die VCL zu machen. In diese Richtung braucht man keine Panik schieben.

Die VCL hat aber nicht den Ergeiz, auch Spiele bedienen zu wollen. Wenn man die VCL-Fensterchen verwendet, schauts ein bisschen nach Buchhaltung aus.

Tak schrieb:
Zitat:
Allerdings sollte ich noch folgendes zu sagen. Durch das verschieben nach Published, fallen größere Daten an und diese werden in der größe der Binary zu Buche schlagen. Was bedeutet, mit jedem Widgettyp kommen ein paar Bytes mehr dazu.
Die ersparnisse im Code, für die Loader der Formular und Theme Datein wird das aber sehr stark ausgleichen.

Da stimme ich Dir zu.

Lars schrieb:
Zitat:
Beliebige Formen kann man einfach realisieren.
1) Die Komponenten zeichnet eben nicht das ganze Rechteck, dass ihr zu steht voll.
2) Für Maus-Ereignisse benötigt man noch eine zusätzliche Methode function HitTest(p:TPoint):Boolean mit der geprüft werden kann, ob der Punkt zur Komponente gehört. Die Standard Implementation prüft nur auf Rechteck, kann aber überschrieben werden.


Du bist mir echt unheimlich. Du präsentierst mir die Lösung in drei Sätzen, und ich brauche eine ganze Seite, um meine Frage zu formulieren.

Das heißt: Wenn jemand ein kompliziertes 2D-Objekt haben möchte, findet er ein Rechteck vor, und muss mit diesem auskommen. Man bietet ihm sozusagen bloß ein viereckiges Plätzchen, mit dem er tun kann, was er will. Allfällige Punkt-/Texturkoordinaten muss er per Programm generieren, händisch oder automatisch, z.B. mit trigonometrischen Funktionen (Sinus/Cosinus etc.). Eigentlich könnte er für seine Punkt/Texturkoordinaten einen eigenen Loader einbauen (Ich sage jetzt nicht, dass das sinnvoll ist, sondern nur: es ist möglich). Und er sollte seine Maus-Hit-Methode anpassen. Ich kann jetzt z.B. auf diese Art ein Fenster in Form eines O erzeugen und dafür sorgen, dass MausHit nur "Ja" sagt, wenn auch wirklich nur das O angeklickt wurde, nicht der ganze rechteckige Bereich. Wenn ich dann noch eine teilweise transparente Textur verwende, kann ich durch das O in der Mitte durchsehen. Ich glaube, ich habe das TGUIItem bisher zu "statisch" gesehen (ich war wirklich "vernagelt"). Das ist es ja gar nicht! In Wirklichkeit kann man damit tun was man will. Man könnte ein abgeleitetes Element zu einem ausgefeilten Programm ausbauen.

Und ich kann Taks Lademethode verwenden. :D

Lars schrieb:
Zitat:
Beim Abspeichern der Komponenten ist man mit einer externen Klasse besser dran, weil man so von verschiedenen Quellen laden bzw. Erweiterungen/Änderungen im Format vornehmen kann. Dann ist die GUI nicht so stark an ein Format, in diesem Fall XML, gebunden.

Seh ich auch so.

Lars schrieb:
Zitat:
Warum wird eigentlich nicht TComponent als Grundlage benutzt? (steht das schon auf den Seiten vorher?) Das bietet schon eine Verwaltung untergeordneter Objekte und kann auf Streams gespeichert werden. Für Properties die nicht als published deklariert werden können gibt es die Methode DefineProperties in der Klasse TPersistent, von der alle(?) Objekte mit published properties in der VCL abgeleitet sind. Dann müßte man nur noch den TReader/TWriter anpassen, dass er keine Delphi *.dfm sondern xml ausgibt bzw liest.

Ich habe ein paar Seiten vorher das TComponent für unsere Zwecke evaluiert. Und dabei kam raus: es hat zuviele Funktionen, die wir gar nicht brauchen. Aber ich müsste das jetzt eigentlich nochmal tun, weil das ein Aspekt ist, den ich damals gar nicht berücksichtigt habe.
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 09, 2006 11:35 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
LarsMiddendorf hat geschrieben:
Beim Abspeichern der Komponenten ist man mit einer externen Klasse besser dran, weil man so von verschiedenen Quellen laden bzw. Erweiterungen/Änderungen im Format vornehmen kann. Dann ist die GUI nicht so stark an ein Format, in diesem Fall XML, gebunden.


Ich habe ja auch ein paar seiten vorher angeprangert, das Formularloader intern eine Struktur sein soll und von externem Code dann gefüttert wird. Da ging es darum, dass jemand Binäre XML files haben wollte.

LarsMiddendorf hat geschrieben:
Warum wird eigentlich nicht TComponent als Grundlage benutzt? (steht das schon auf den Seiten vorher?) Das bietet schon eine Verwaltung untergeordneter Objekte und kann auf Streams gespeichert werden. Für Properties die nicht als published deklariert werden können gibt es die Methode DefineProperties in der Klasse TPersistent, von der alle(?) Objekte mit published properties in der VCL abgeleitet sind. Dann müßte man nur noch den TReader/TWriter anpassen, dass er keine Delphi *.dfm sondern xml ausgibt bzw liest.


Da müsste mal in richtung FreePascal geforscht werden, ob es das auch so implementiert hat und ob das Interface von Delphi immer gleich geblieben ist.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 09, 2006 12:21 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Tak schrieb:
Zitat:
Da müsste mal in richtung FreePascal geforscht werden, ob es das auch so implementiert hat und ob das Interface von Delphi immer gleich geblieben ist.


Ich kann das übernehmen für folgende Versionen: Delphi Version 5 und 7 und Free Pascal Version 2.0.2. Bei Delphi-Versionen, die höher sind als Delphi 7 muss ich passen. Dauert ein bisschen.
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 09, 2006 14:50 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
http://www.freepascal.org/docs-html/rtl/classes/tcomponent.html wer mal mit der Delphi Hilfe vergleichen will.
Ich hab kein Delphi auf mein neuen Rechner und kann dies nicht überprüfen.

edit:
http://www.freepascal.org/docs-html/rtl/classes/twriter.html
http://www.freepascal.org/docs-html/rtl/classes/treader.html

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 09, 2006 16:52 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo Tak,
ich setze mich grade hin und fange damit an, konnte bisher nicht. I0n0s hat mir mal einen Film namens "Flutsch und weg empfohlen, aber das funktioniert bei mir nicht, weil die Natur die Beine von Ehefrauen kürzer gemacht hat damit sie nicht entkommen können. Hungrige Familienmitglieder sind gefährlich.
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 09, 2006 18:47 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Ich dachte mir, das Beste wäre, die beiden Source Codes direkt zu vergleichen.

In der Beilage findet ihr:
--- ein Textfile mit dem Interface-Teil des TComponent von FPC Version 2.0.4 (Download-Datum: 4.11.2006)
--- ein Textfile mit dem Interface-Teil des TComponent von Delphi7 (ist eine veraltete Delpi-Version)

Fazit: sie sehen verflixt gleich aus.

Ohne jetzt genauere Untersuchungen angestellt zu haben, scheint die Verwendung von TComponent in Free Pascal gut möglich zu sein. Was ich aber unbedingt vermeiden will: zu großen Overhead mitzuschleppen, den wir gar nicht brauchen. Das bedeutet, dass ich TComponent wirklich durchackern und mir im Einzelnen anschauen muss, was können wir verwenden und was nicht. Und das braucht bestimmt ein paar Tage, wenn es fundiert sein soll.

Was wollt Ihr, dass ich tue?

Traude


Dateianhänge:
FPC_DELPHI_TComponent.zip [2.72 KiB]
243-mal heruntergeladen
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 09, 2006 19:19 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Ich bins nochmal.

Ich habe das eigentlich schonmal gepostet, aber vielleicht mit anderen Schwerpunkten:

Das sagt die Delphi-Hilfe zu TComponent:

Zitat:
Komponenten sind persistente Objekte, die über das folgende Verhalten verfügen:

IDE-Integration. Sie können in einer Palette der IDE angezeigt und in einem Formular-Designer bearbeitet werden.

Das brauchen wir eigentlich nicht (Free Pascal hat keine IDE, Taks RTTI-Objekt müsste das Gleiche machen).

Zitat:
Eigentümerschaft: Sie können als Eigentümer andere Komponenten verwalten. Wenn die Komponente A der Eigentümer der Komponente B ist, dann ist A für die Freigabe von B verantwortlich, wenn A freigegeben wird.

Das macht das TGUIItem ohnehin schon.

Zitat:
Streaming und Filing. Erweiterungen der von TPersistent geerbten Persistenzfunktionen.

Delphi-Hilfe zu TPersistent: siehe ganz unten. Ich kam zum Schluss, dass die Streaming-Funktion von TPersistent, die xfm oder dfm Dateien schreibt, nicht brauchbar ist für unsere Zwecke. Und Tak HAT eine brauchbare Funktion bereits fertig.

Zitat:
COM-Unterstützung. Komponenten können mit den Experten der Windows-Produkte in ActiveX-Steuerelemente oder in andere COM-Objekte konvertiert werden. Komponenten können als Container für COM-Objekte dienen.

Das wollen wir nicht: nicht plattformunabhängig.


Die Delphi-Hilfe zu TPersistent:
Zitat:
TPersistent kapselt das fundamentale Verhalten, das allen Objekten gemeinsam ist, die anderen Objekten zugewiesen werden können und die Eigenschaftswerte in eine Formulardatei (.xfm- oder .dfm-Datei) schreiben bzw. daraus lesen können. Hierzu führt die Klasse TPersistent Methoden ein, die für folgende Zwecke überschrieben werden können:

Die Prozedur definieren, mit der nicht als published deklarierte Daten in einen Stream geschrieben bzw. daraus gelesen werden können.
Verfahren bereitstellen, mit denen Eigenschaftswerte gesetzt werden können.
Verfahren bereitstellen, mit denen der Inhalt eines Objekts einem anderen zugewiesen werden kann.

Das können wir nicht brauchen. Unsere Vorgabe ist XML/Binary


Ich komme also hier - weil ich diesmal ins TPersistent hineingeschaut habe - , umso mehr zu dem Schluss, dass uns TComponent nicht helfen wird. Das war für mich der Grund, TComponent gar nicht näher anzuschauen. Meine Empfehlung ist daher, nicht TComponent zu verwenden, sondern Taks Methode in Betracht zu ziehen.
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 09, 2006 19:23 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich glaubr nicht, dass dies notwendig ist.
Es reicht, wenn der Funktionsumfang sich ähnelt.
Die Frage ist wie sieht es nun in der Praxis aus, also wie würde man nun Daten in die Klasse lesen und wie kann ein anderer Code Daten von der Klasse erhalten.

Was müsste die GUI und TComponent können ?
Der GUI Manager müsste über eine Funktion, die eine ID(eindeutiger name des Widgets) erhält, die Komponente zurück geben und dann die Daten der Komponente per name(string) zugreifbar machen(lesen und schreiben).
Des weiteren müsste man eine Klasse mit einem Namen registrieren können und dann Instanzen davon erstellen lassen können.
Wenn dieses gegeben ist, dann kann man Scriptsprachen und Formularloader damit realisieren.

Das registrieren einer Klasse mit einem Namen und die erstellung von Instanzen ist kein Problem und hat nichts mit Tcomponent zu tun. Genau so ist das finden eines Widgets, anhand einer ID, auch nicht TComponent abhängig sondern alles vom GUI Manager.

Was bleibt also übrig ?
Genau das lesen und schreiben von Variablen und das aufrufen von methoden, von der Klasse.

Wenn ich das richtig verstanden habe, kann TReader und TWriter die VMT daten einer Klasse auswerten oder liege ich da falsch ?
Weil meine TXD_RTTI Variante ja nur ein speziellen Teil der VMT Daten auswerten kann und wir mit den 3 Klassen schon ein bugfreies und schon in der RTL vorhandenen Sache zu tun hätten.

Edit:
Mein TXD_RTTI ist nach der über mir aufgeführten Funktionalität eigentlich eine abgespeckte TComponent.
Denn ich nutzte ebenfalls TPersistant, um an die RTTI daten der Klasse zu kommen.
Wer sich mal TXD_RTTI genauer angucken will, kann hier http://www.linuxprofessionals.org/xdream/wiki/index.php/XD_RTTI was zu finden.

Edit2:
Ich hab mir nun TComponent und TWriter und TReader angeguckt und muss sagen, dass es sich stark ähnelt mit dem was ich gemacht habe aber meine Variante ist wesentlich einfacher zu nutzen und übersichtlicher.
Wir würden mit TComponent verdammt viel Metacode erstellen müssen um unser Ziel zu erreichen.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 09, 2006 20:03 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Das steht in der Delphi Hilfe über TWriter:
Zitat:
TWriter wird intern vom Komponenten-Streaming-System verwendet, um Informationen zu einer Komponente (z.B. Komponenteneigenschaften, die als public deklariert sind, oder benutzerdefinierte Eigenschaftsdaten) in einen Stream zu schreiben. TWriter führt das Schreiben von Komponentendaten in einen Stream durch. Der Writer ist statt des Stream-Objekts für das Schreiben von Komponentendaten in einen Stream zuständig. Dazu werden Methoden für die folgenden Operationen bereitgestellt:

Schreiben unterschiedlicher Elemente in den verbundenen Stream.
Schreiben von Eigenschaftsdeltas, die geerbte Formulare und Eigenschaften mit Standardwerten in den Stream stellen.
Schreiben von verschachtelten Gruppen von Elementen oder Kollektionen in den Stream.

Andere Methoden und Eigenschaften von TWriter werden für die Zusammenarbeit mit Stream- und Komponentenobjekten verwendet.


Hier lassen sie sich nicht detailliert darüber aus, was er wirklich macht. Aber nach einem kurzen Blick in die Unit Classes würde ich sagen: er schreibt wohl alles, was gebraucht wird, um eine Klasse wiederherzustellen (Klassenhierarchie/KlassenID/Klassenname/Klassenstruktur/Inhalt der Felder) in den Stream, ein TReader liest die Daten aus dem Stream und stellt sie wieder her. Sollte meiner Meinung nach so funktionieren. Sicher wird er wohl Infos aus der VMT brauchen, aber er braucht auch noch mehr.

@edit: Er müsste auch die Objekthierarchie in den Stream schreiben, TGUIItem wird höchstwahrscheinlich nicht nur Descendants der ersten, sondern auch der zweiten und dritten Generation haben.

@edit2: Ich sehr mir Deine TXD_RTTI an, aber erst morgen. Heut ist immerhin Samstag abend. Ein Bier wartet auf mich.
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 10, 2006 16:15 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo,
@ Tak: Ich habe mir Dein TXD_RTTI angesehen. Im Prinzip stellst Du mit diesem Ding Informationen über ein Objekt bereit: die Variablen und die Methoden, beschreibst die Methoden und ihre Parameter, knapp und übersichtlich.

Ich wollte nun eigentlich zum Vergleich wissen, wie Delphi das macht. Ich habe mir zunächst nochmal TPersistent angesehen, das stellt Lade- und Speicher-Infos zur Verfügung. Irgendwie muss das Ding ja an seine Informationen kommen. Die Delphi Hilfe gibt zum TPersistent nicht allzuviel her. Sie spuckt erst unter dem Stichwort "Classinfo" Informationen aus:

Zitat:
ClassInfo stellt den Zugriff auf die RTTI-Tabelle für einen bestimmten Objekttyp bereit.

Hinweis: Das Format der RTTI-Tabelle wird geändert. In Anwendungen sollten die anderen, von TObject bereitgestellten RTTI-Methoden verwendet werden; diese Methoden ermöglichen einen einfachen, konsistenten Zugriff auf RTTI-Daten.
Hinweis: Manche Klassen stellen keine Laufzeit-Typinformationen (RTTI) bereit. Bei diesen Klassen gibt ClassInfo nil (Delphi) bzw. NULL (C++) zurück. Alle von TPersistent abgeleiteten Klassen liefern RTTI.

Der Delphi-Compiler stellt standardmäßig keine RTTI bereit. Die meisten in Delphi implementierten Klassen, die RTTI bereitstellen müssen, sind von TPersistent abgeleitet. Wenn für eine Delphi-Klasse RTTI zwar erforderlich ist, aber die volle Funktionalität von TPersistent nicht benötigt wird, compilieren Sie den Quelltext mit der Option $M.
Der C++ Compiler stellt standardmäßig RTTI bereit. Diese Funktion kann in den Projektoptionen deaktiviert und selektiv mit dem Schlüsselwort __rtti wieder aktiviert werden.


Und wirklich befindet sich in der Unit Classes folgender Code:

Zitat:
{$M+}

TPersistent = class(TObject)
private
procedure AssignError(Source: TPersistent);
protected
procedure AssignTo(Dest: TPersistent); virtual;
procedure DefineProperties(Filer: TFiler); virtual;
function GetOwner: TPersistent; dynamic;
public
destructor Destroy; override;
procedure Assign(Source: TPersistent); virtual;
function GetNamePath: string; dynamic;
end;

{$M-}


Zu Compilerdirektiven wird immer auf die Delphi-Hilfe verwiesen. Dort bin ich nicht fündig geworden, erst im HTML-Hilfe-File zu Free Pascal, Programmer's Manual, Compiler Drectives:
Zitat:
1.1.40 $M or $TYPEINFO : Generate type info
For classes that are compiled in the {$M+} or {$TYPEINFO ON} state, the compiler will generate Run-Time Type Information (RTTI). All descendent objects of an object that was compiled in the {$M+} state will get RTTI information too, as well as any published classes. By default, no Run-Time Type Information is generated. The TPersistent object that is present in the FCL (Free Component Library) is generated in the {$M+} state. The generation of RTTI allows programmers to stream objects, and to access published properties of objects, without knowing the actual class of the object.
The run-time type information is accessible through the TypInfo unit, which is part of the Free Pascal Run-Time Library.
Remark: The streaming system implemented by Free Pascal requires that all streamable components be descendent from TPersistent.


Zitat:
Übersetzung: Für Klassen, die mit der Compilerdirektive {$M+} oder {$TYPEINFO ON} kompiliert werden, erzeugt der Compiler Laufzeit-Typinformation(RTTI). Alle abgeleiteten Objekte dieses Objekts erhalten ebenfalls Laufzeitinformation und auch alle Published Klassen. Per default wird keine Laufzeit-Typinformation generiert. Das TPersistent -Objekt in der FCL (Free Component Library) wird mit {$M+} kompiliert. Die Erzeugung von RTTI erlaubt dem Programmierer, Objekte zu streamen und Zugang zu den published Properties dieser Objekte zu haben, ohne zu wissen, was die aktuelle Klasse des Objekts ist.

Auf die Laufzeit-Typinformation kann mit den Prozeduren aus der Unit TypInfo zugegriffen werden, die ein Teil der Free Pascal-Laufzeitbibliothek ist.
Anmerkung: Das Streaming System, das Free Pascal implementiert, erfordert, dass alle streamingfähigen Komponenten von TPersistent abgeleitet sind.


Anmerkung von mir: Delphi machts genauso: die Unit TypInfo ist in Delphi in \DelphiVerzeichnis\Program\Source\Rtl\Common zu finden. Die Prozeduren in der Unit TypInfo sind reichlich verschachtelt und kompliziert.

Das heißt: wenn man seine Objekte von TPersistent ableitet, wird dazu Klasseninformation bereitgestellt (man kann natülich auch sein eigenes Objekt mit $M+ kompilieren). Daher kennen auch alle TComponents, die von TPersistent abgeleitet sind, ihre Klasseninformationen bestens, im Unterschied zu gewöhnlichen TObjects. Das ist ein Aspekt von TComponent, der mir bisher nicht bewusst war. Was sagt Ihr dazu?

@Tak: Du machst es ja auch über TPersistent. Also musst Du Deine Infos aus der gleichen Quelle haben.

Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 10, 2006 17:33 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Wo ich die infos her habe, steht auch im Link den ich oben gepostet habe.
Ich hab im X-Dream Wiki die Kompo erklärt und am anfang ist ein Link, zu einem Artikel, der erklärt wie die Klasseninfos gespeichert werden und wie man darauf zugreifen kann.
Hier ist nochmal der Link http://www.linuxprofessionals.org/xdream/wiki/index.php/RTTI aber der Artikel ist nicht fertig und deswegen steht am ende nichts zu der API von TypeInfo.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 427 Beiträge ]  Gehe zu Seite Vorherige  1 ... 10, 11, 12, 13, 14, 15, 16 ... 29  Nächste
Foren-Übersicht » Sonstiges » Community-Projekte


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 15 Queries | GZIP : On ]