AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Globale Konstanten zur Laufzeit ermitteln

Globale Konstanten zur Laufzeit ermitteln

Ein Thema von ZOD · begonnen am 23. Apr 2014 · letzter Beitrag vom 23. Apr 2014
Antwort Antwort
ZOD

Registriert seit: 6. Mai 2009
81 Beiträge
 
#1

Globale Konstanten zur Laufzeit ermitteln

  Alt 23. Apr 2014, 08:22
Guten Morgen!


Frage:
Gibt es eine Möglichkeit, zur LAUFZEIT Konstantenbezeichner und deren Werte zu ermitteln?
Ich verwende Delphi 7 für dieses Projekt.

Hintergrund:
ich habe eine Unit, in der globale Konstanten zur Programmsteuerung deklariert werden.
Die Konstantenbezeichner haben ein festes Präfix im Namen.

Natürlich kann ich die dort definierten Konstanten manuell in eine Liste eintragen und
bei Bedarf zur Laufzeit die zugehörigen Werte anzeigen lassen.

Ich würde dies jedoch gerne mittels Programmcode erledigen, also zur Laufzeit
im Speicher nach möglichen Konstanten suchen und deren Werte ausgeben.
Hat jemand eine Idee dazu?
Danke für Tipps.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.607 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Globale Konstanten zur Laufzeit ermitteln

  Alt 23. Apr 2014, 08:27
Nein.

Aucn nicht mit der neuen RTTI.

Grund: Namen/Positionen von Konstanten(Variablen sind irrelevant und werden nicht mit einkompilert.
Außerdem werden viele Konstanten direkt vor Ort eingebaut, also da wo sie überall verwendet werden. Es gibt also nichtmal eine Stelle wo man Konstanten suchen könnte.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (23. Apr 2014 um 08:29 Uhr)
  Mit Zitat antworten Zitat
ZOD

Registriert seit: 6. Mai 2009
81 Beiträge
 
#3

AW: Globale Konstanten zur Laufzeit ermitteln

  Alt 23. Apr 2014, 08:44
Ok, danke - habe ich schon so befürchtet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.607 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Globale Konstanten zur Laufzeit ermitteln

  Alt 23. Apr 2014, 08:50
Du könntest maximal das als published Variablen Felder in eine Klasse legen. Dort kommt selbst die alte RTTI ran.

Siehe die Variablen mit den Namen der Komponenten auf der Form, welche vom DFM-Loader mit dem Instanz-Zeiger gefüllt werden.
Oder siehe TReader/TWriter, welche dieser Published-Felder auslesen/befüllen können.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
829 Beiträge
 
#5

AW: Globale Konstanten zur Laufzeit ermitteln

  Alt 23. Apr 2014, 08:56
Wenn man Aufzählungstypen als benannte Konstanten einsetzt, sieht ist das mit(MyTypeConst.mtcInfo) oder ohne(mtcInfo) "NameSpace" gut lesbar, typsicher und man kann per GetEnumName(TypeInfo(EnumType),interger(EnumValue) ) zur Laufzeit immer den benannten Wert zurückbekommen.

Ist zwar etwas mehr Aufwand wie ein simples "const XXXX", erfüllt aber so die Frage-/Aufgabenstellung


Delphi-Quellcode:
  MyTypeConst = (
    mtcNotSet = $00,
    mtcDummy = $01,
    mtcInfo = $02,
    mtcData = $03
    );


function MyTypeConstToStr(const iMyTypeConst : Integer) : String; overload;
begin
  result := GetEnumName(TypeInfo(MyTypeConst) , iMyTypeConst);
end;

function MyTypeConstToStr(const aMyTypeConst : MyTypeConst) : String; overload;
begin
  result := GetEnumName(TypeInfo(MyTypeConst) , integer(aMyTypeConst));
end;
- mit GetEnumValue( funktioniert es andersrum... man bekommt den Wert zum "Namen"
- wenn nur der Type bekannt, gibt es "alle" möglichen Namen per von 0 hochzählender Schleife bis Fehler mit GetEnumName(

Geändert von mensch72 (23. Apr 2014 um 09:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.677 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Globale Konstanten zur Laufzeit ermitteln

  Alt 23. Apr 2014, 08:57
Du könntest maximal das als published Variablen Felder in eine Klasse legen. Dort kommt selbst die alte RTTI ran.
Dann sind es aber keine Konstanten mehr und für bestimmte Zwecke (z.B. statische Array-Grenzen, statische Berechnung anderer Konstanten) unbrauchbar. Der Trick ist also nur bedingt einsetzbar.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.607 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Globale Konstanten zur Laufzeit ermitteln

  Alt 23. Apr 2014, 09:11
Nja, es ist ein Weg, einen Speicherort mir einem Namen zu identifizieren.
PS: Typisierte Konstanten sind in Delphi oftmals eh nur schreibgeschützte Variablen. (ich hatte mal ausversehn den globalen Leerstring '' zerschossen und wenn jetzt irgendwo jemand via PChar auf einen leeren String zugriff, dan gab der meinen neuen Wert raus. )

Über die neue RTTI, könnte man das (standardmäßig) auch mit Private-Feldern machen.



@mensch72: Bei Enums ohne "Wertangaben" (type TMyEnum = (a, b, c); ) funktiniert das.
Aber hast du es mal bei Enums mit auch nur einer einzigen Wertangabe, oder mehreren probiert? ((type TMyEnum = (a, b=123, c); ) / (type TMyEnum = (a=2, b=4, c=8); ))
Und das geht natürlich nur für Werte von 0 bis 255 und wenn keine der "Konstanten" den selben Wert haben.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (23. Apr 2014 um 09:14 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#8

AW: Globale Konstanten zur Laufzeit ermitteln

  Alt 23. Apr 2014, 09:27
Generell gesehen ist das imho einfach keine gute Idee, denn es ist unflexibel bzw. abhängig von einer bestimmten Nomenklatur ('Prefix im Namen') und eine implizite Funktionalität. Der Programmierer erwartet das doch nicht, das eine Variable mit einem bestimmten Namen in einem Dialog angezeigt wird.

Viel besser ist es, eine Klasse zu schreiben, bei der man seine Konstanten (Wert+ Namen) registriert. In einem Dialog (oder Ausdruck) kann das dann sehr einfach angezeigt werden, denn die Klasse definiert einen Iterator oder gleich eine Key-Value-Liste.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 06:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf