![]() |
Accessing a Record Structure Programatically
I habe eine declaration einer record structure, etwa so:
Delphi-Quellcode:
TRec = record
Datum: TDateTime; Art: Char; Info: string; end; MyRecord : TRec; Ich kann MyRecord.Datum oder MyRecord.info ansprechen, aber ich möchte die record structure at runtime auslesen. Etwa so wie man bei TTable mit FieldList und Fields Info auslesen kann. Wie kann ich Ähnliches mit einer Record Structure tun, um die Anzahl der Felder, ihre Typen und Namen at runtime zu ermitteln? |
Re: Accessing a Record Structure Programatically
Ich habe ehrlich gesagt keine Ahnung, aber mein erster Ansatzpunkt wäre RTTI.
|
Re: Accessing a Record Structure Programatically
Zitat:
Verhält sich genau gleich wie TTable, nur dass alle Daten im Speicher sind. Bei Bedarf auch komprimiert. Es entsteht natürlich ein gewisser Overhead, andererseits gibt es aber auch viele Vorteile. |
Re: Accessing a Record Structure Programatically
Vorab :
Zitat:
|
Re: Accessing a Record Structure Programatically
Die beste Antwort war von Luckie. Danke!
Daraufhin habe ich die Delphi unit Typinfo genau durchgesehen - aber leider geht es damit auch nicht. Es gibt offensichtlich keine Möglichkeit. Googlen brachte einen Eintrag von ![]() Die sind recht teuer! Hab's doch mal mit einem Probeaccount versucht: Die versprochene Lösung war: "Es gibt keine Möglichkeit". Das riecht stark nach Abzokke - da bleib ich doch besser bei diesem Forum. Hintergrund meiner Frage war: Ich habe mehrere Arrays of Trec. Die sortiere ich mit QuickSort auf verschiedene Felder des TRec. Faul, wie ich nun mal bin, wollte ich mir das Kodieren von speziellen QuickSort Routinen ersparen und eine generische Routine für das Sortieren von Arrays mit Records erstellen, die die Felder der Records selber ermittelt, also Sortieren auf Feld1 oder n-tes Feld ermöglicht. Nun habe ich einen Kompromiss gebastelt: Eine QuickSort Routine für Arrays of TRec, der ich per Parameter den Feldnamen übergeben muss. Zu Hansa: "Das ist schon krass. Soll ich auf englisch antworten, oder was ?" Wir sprechen in der EDV doch alle nur noch gebrochen Deutsch. Auf englisch war der Titel kurz und verständlich. Statt "Accessing a Record Structure Programatically" hätte ich auch deutsch folgendes schreiben können: "Zurückgreifen auf einen Satzaufbau während das Programm läuft", wäre das besser? |
Re: Accessing a Record Structure Programatically
Zitat:
Und zu deinem Beispiel: "Ich möchte dynamisch, zur Laufzeit, auf die einzelnen Strukturelemente zugreifen." Und da das dein eigentliches Problem nicht eindeutig beschreibt, würde ich dann noch hinzufügen: "..., wobei ich die Elemente nicht kenne sondern zuvor ermitteln möchte (ähnlich/mit RTTI)." Also ich habe mir keinen abgebrochen, den Satz habe ich so hingeschrieben und er ist bis auf Fachbegriffe deutsch. |
Re: Accessing a Record Structure Programatically
Wie wärs denn mit einem Listen-Objekt ? In TObjectList kann man die Record-Struktur reinpacken und das Ding kennt die Methode Sort. Es müsste also nur eine Vergleichsroutine gebastelt werden. Ganz von alleine geht aber auch das nicht ! Ich würde mal nicht überall die Foren nach fertiger Lösung abgrasen, sondern mal F1 drücken und genau lesen. Also OOP lernen und auch Deutsch. :mrgreen: Denn das hier kann man so nicht hinnehmen :
Zitat:
|
Re: Accessing a Record Structure Programatically
Hallo Pluto,
Zitat:
Zu deinem Thema: Ein Feld im Record ist intern durch Offset und Typ beschrieben. Das sind die Informationen die du einer generischen Routine übergeben musst, aber wenn du da nicht fremdbestimmt bist, dann löst du das vielleicht doch besser mit Klassen und RTTI. Grüße vom marabu |
Re: Accessing a Record Structure Programatically
Zitat:
|
Re: Accessing a Record Structure Programatically
Dank an Marabu für die Antwort
An Hansa Also erstmal: Entschuldigung für den englischen Titel. Eigentlich ist es ja erfreulich, wenn man hier großen Wert auf gutes Deutsch legt, da unsere Sprache ja immer mehr mit Anglizisten verhunzt wird (Beispiel: Relaxen statt Erholen) Warum ich kein Listobjekt nehme: 1. Es handelt sich um eine Erweiterung eines bestehenden Programmes, da müsste ich an vielen Stellen die bestehenden Arrays durch Listobjekte ersetzen. 2. Auch bei TListCompare benötige ich die Record Definitionen, das Problem bleibt also gleich 3. Die vorhandene Methode Sort ist allerdings ein kleiner Vorteil Es ist nicht schwer, ein QuickSort für ein array zu schreiben. Ich habe die Vergleichsfunktion meiner QuickSort Routine mit überladenen Funktionen realisiert, somit brauche ich nur den Feldnamen des Records als Parameter übergeben, den Typ des Recordfeldes (char, integer, TDateTime) erkennt die Routine selber. Noch ein Hinweis: Nicht jeder, der hier eine Frage stellt, ist ein Anfänger. Bemerkungen wie "also OOP lernen" sollte man mit Vorsicht verwenden! War hier unpassend, zumal die Frage sich auf Records bezog. Ein Record ist ein Typ aber kein Objekt. Den hat schon Prof. Wirth 1972 definiert, als noch niemand an Objekte dachte. Grüße Pluto |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:37 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-2025 by Thomas Breitkreuz