Re: Auswertung Symbolische Konstante [Erledigt]

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
vorti
UDF-Programmierer
UDF-Programmierer
Beiträge: 61
Registriert: Mo, 25. Sep 2017 12:21

Re: Auswertung Symbolische Konstante [Erledigt]

Beitrag von vorti »

Hallo alle zusammen,

ich hoffe ihr könnt mir mit meinen kleinen Problem helfen.
Ich möchte die Schriftfarbe bestimmter Statics per Combobox auswählen lassen, diese werden in der DB gespeichert.
Die Farben, die in der Combobox zur Auswahl stehen, werden mit #define definiert. Leider werden diese zum Zeitpunkt des oStatic:create() nicht erkannt.
Weiß jemand warum?

Vielen Dank.
Zuletzt geändert von vorti am Mo, 03. Dez 2018 15:47, insgesamt 1-mal geändert.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Auswertung Symbolische Konstante

Beitrag von brandelh »

Meinst du den TEXT oder den numerischen Wert ?
Etwas code wäre hilfreich.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Auswertung Symbolische Konstante

Beitrag von Tom »

XbpCombobox bzw. die Listbox darin kann nur Text anzeigen, aber die definierten Farben sind vermutlich numerisch (nämlich Rückgabewerte von GraMakeRGBColor(), definierte Farbkonstanten von Xbase++ oder ähnliche). Die kannst Du einer Listbox nicht als Auswahl mitgeben (und auch nicht als voreingestellten Wert). Du musst ein Array mit den passenden Texten erzeugen. Aus denen wird dann ein Text gewählt, und für die Verwendung der Farbe müsstest Du dann wieder den passenden numerischen Wert aus der Liste der numerischen Farbwerte heraussuchen.

Code: Alles auswählen

LOCAL aFarbenNum := {GRA_CLR_GREEN,GRA_CLR_RED,GRA_CLR_BLUE}, nNumFarbeStandard := aFarbenNum[1]
LOCAL aFarbenChar := {'Grün','Rot','Blau'}, cCharFarbeStandard := aFarbenChar[1]

* und jetzt in der List-/Combobox cCharFarbeStandard via aFarbenChar auswählen, danach dann im numerischen Array matchen.
Noch einfacher - und zugleich viel schöner - ist es aber, wenn man fertige Colorpicker verwendet. Such einfach mal nach so etwas im Forum.
Herzlich,
Tom
vorti
UDF-Programmierer
UDF-Programmierer
Beiträge: 61
Registriert: Mo, 25. Sep 2017 12:21

Re: Auswertung Symbolische Konstante

Beitrag von vorti »

Colorpicker will ich an der Stelle nicht, da die Farben eine Bedeutung haben.
Hier mal der grobe Aufbau( einzelnes Bsp. )

Code: Alles auswählen

#define ROT           GRA_CLR_RED

cFarbe  := upper( alltrim( FIELD->FARBE ) )
aPresPar := { { XBP_PP_FGCLR,  &( cFarbe ) } }
Ich hab es auch mit setColorFG() probiert, funktioniert auch nicht. Kann man das mit dem &-Operator überhaubt machen, laut Debugger stimmt der Wert zu Laufzeit.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Auswertung Symbolische Konstante

Beitrag von Tom »

Steht in Field->Farbe möglicherweise der Text "GRA_CLR_RED" oder so? Das wird nicht funktionieren. Das ist eine Konstante. Um die zur Laufzeit aufzulösen, müsstest Du auf die GRA.CH zugreifen und jede Menge Krempel machen. Sinnvoller wäre es, ihren Wert zu speichern.
Herzlich,
Tom
vorti
UDF-Programmierer
UDF-Programmierer
Beiträge: 61
Registriert: Mo, 25. Sep 2017 12:21

Re: Auswertung Symbolische Konstante

Beitrag von vorti »

Nein, in FIELD->FARBE steht in meinem Bsp. "Rot" ( aus der Combobox ). Der Fehler den ich bekomme ist das ROT ein unbekannte Variable ist, wenn ich allerdings ROT statt &( cFarbe ) in die aPresPar schreibe funktioniert es.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Auswertung Symbolische Konstante

Beitrag von Tom »

Das ist das gleiche. "ROT" ist eine Konstante, die auf eine Konstante (GRA_CLR_RED) verweist. Und die wiederum repräsentiert schlicht die Zahl 2, die in Xbase++ für das Standardrot (R/G/B 255/0/0) steht. Wenn Dein Text kompiliert wird, wird zunächst an jeder Stelle, an der Du ROT verwendest, GRA_CLR_RED eingefügt. Dann wird die GRA.CH - die immer automatisch eingebunden ist - abgearbeitet, und aus GRA_CLR_RED wird 2. Zur Laufzeit kennt Dein Programm weder ROT, noch GRA_CLR_RED. Du darfst keine Defines verwenden, sondern müsstest Variablen oder Funktionsaufrufe speichern. Oder, viel einfacher, den Wert, also in diesem Fall die 2. Und das geschieht auch, wenn Du:

Code: Alles auswählen

REPLACE Field->Farbe with ROT
verwendest. Dann steht in "Farbe" eine 2. Und die kannst Du wieder direkt als Farbzuordnung (im PP oder über SetColor) verwenden, ohne Makroexpander und andere Umwege.
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Auswertung Symbolische Konstante

Beitrag von Tom »

Ach so, Du könntest das Problem auch sehr leicht, aber extrem unelegant dadurch lösen, dass Du aus den Defines einfach Memvars machst:

PRIVATE Rot := GRA_CLR_RED

Dann funktioniert Dein Code wieder. Die "#define ROT" usw. musst Du dann rausnehmen.
Herzlich,
Tom
vorti
UDF-Programmierer
UDF-Programmierer
Beiträge: 61
Registriert: Mo, 25. Sep 2017 12:21

Re: Auswertung Symbolische Konstante

Beitrag von vorti »

Hmm... Irgendwie hab ich ein Brett vorm Kopf. :banghead:

Ich stimme dir bei allen zu, allerdings verstehe ich nach wie vor nicht warum

Code: Alles auswählen

{ XBP_PP_FGCLR,  &( cFarbe ) } 	// cFarbe ist hier ROT
mir einen Fehler bringt und das hier

Code: Alles auswählen

{ XBP_PP_FGCLR,  ROT  }
funktioniert. Das ist doch dann trotzdem eine define Konstante.

PS: Es geht mir hier nicht um so sehr um eine Lösung als solches ( ich hatte es dann mit do case gemacht ), sondern um das Verständnis an sich.
Trozdem natürlich vielen Dank für die ganzen Tipps.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Auswertung Symbolische Konstante

Beitrag von Tom »

Aus diesem Code:

Code: Alles auswählen

#define ROT GRA_CLR_RED
#include 'gra.ch'
#include 'xbp.ch'
FUNCTION Main()
a:= { XBP_PP_FGCLR,  ROT  }
wird durch Compiler und, vor allem, Präprozessor, das hier:

Code: Alles auswählen

a:= { 2,  3  }
(XPP <meinprg> /P und dann <meinprg>.PPO anschauen)

Konstante sind Platzhalter. Du hast in Deiner "ROT"-Definition einen Platzhalter definiert, der durch einen Platzhalter ersetzt wird, der einen Wert referenziert, nämlich die 3 (ich hab mich weiter oben vertan - GRA_CLR_RED ist 3).

Es gibt zur Laufzeit kein "ROT" und kein "GRA_CLR_RED", sondern nur die 3. Es gibt aber auch zur Laufzeit keine einfache Funktion, um Konstanten aufzulösen. Wenn Du in "cFarbe" aber den Text "ROT" zu stehen hast, und den Makroexpander auf "cFarbe" anwendest, versucht die Software, den Inhalt (!) von "ROT" zu ermitteln. Es gibt aber keinen Inhalt von "ROT", weil "ROT" ein zur Laufzeit unbekannter Platzhalter ist. Es gäbe einen Inhalt, wenn "ROT" der Name einer Variablen wäre. Issa aba nich.
Herzlich,
Tom
vorti
UDF-Programmierer
UDF-Programmierer
Beiträge: 61
Registriert: Mo, 25. Sep 2017 12:21

Re: Auswertung Symbolische Konstante

Beitrag von vorti »

Danke dir, jetzt hab auch ich es gerallt.
Tom hat geschrieben: Mo, 03. Dez 2018 15:31 Wenn Du in "cFarbe" aber den Text "ROT" zu stehen hast, und den Makroexpander auf "cFarbe" anwendest, versucht die Software, den Inhalt (!) von "ROT" zu ermitteln.
Das war der Punkt den ich in meinen Kopf nicht bedacht habe, wenn mans weiß ist es natürlich trivial.
Nochmals Danke.
Antworten