Re: Auswertung Symbolische Konstante [Erledigt]
Moderator: Moderatoren
Re: Auswertung Symbolische Konstante [Erledigt]
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.
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.
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Auswertung Symbolische Konstante
Meinst du den TEXT oder den numerischen Wert ?
Etwas code wäre hilfreich.
Etwas code wäre hilfreich.
Gruß
Hubert
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9357
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Auswertung Symbolische Konstante
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.
Noch einfacher - und zugleich viel schöner - ist es aber, wenn man fertige Colorpicker verwendet. Such einfach mal nach so etwas im Forum.
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.
Herzlich,
Tom
Tom
Re: Auswertung Symbolische Konstante
Colorpicker will ich an der Stelle nicht, da die Farben eine Bedeutung haben.
Hier mal der grobe Aufbau( einzelnes Bsp. )
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.
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 ) } }
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9357
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Auswertung Symbolische Konstante
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
Tom
Re: Auswertung Symbolische Konstante
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.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9357
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Auswertung Symbolische Konstante
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:
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.
Code: Alles auswählen
REPLACE Field->Farbe with ROT
Herzlich,
Tom
Tom
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9357
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Auswertung Symbolische Konstante
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.
PRIVATE Rot := GRA_CLR_RED
Dann funktioniert Dein Code wieder. Die "#define ROT" usw. musst Du dann rausnehmen.
Herzlich,
Tom
Tom
Re: Auswertung Symbolische Konstante
Hmm... Irgendwie hab ich ein Brett vorm Kopf.
Ich stimme dir bei allen zu, allerdings verstehe ich nach wie vor nicht warum
mir einen Fehler bringt und das hier
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.
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
Code: Alles auswählen
{ XBP_PP_FGCLR, ROT }
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.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9357
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Auswertung Symbolische Konstante
Aus diesem Code:
wird durch Compiler und, vor allem, Präprozessor, das hier:
(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.
Code: Alles auswählen
#define ROT GRA_CLR_RED
#include 'gra.ch'
#include 'xbp.ch'
FUNCTION Main()
a:= { XBP_PP_FGCLR, ROT }
Code: Alles auswählen
a:= { 2, 3 }
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
Tom
Re: Auswertung Symbolische Konstante
Danke dir, jetzt hab auch ich es gerallt.
Nochmals Danke.
Das war der Punkt den ich in meinen Kopf nicht bedacht habe, wenn mans weiß ist es natürlich trivial.
Nochmals Danke.