dc_getrefresh() und Multiline [ERLEDIGT]

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

dc_getrefresh() und Multiline [ERLEDIGT]

Beitrag von Manfred »

Ich habe gerade etwas merkwürdiges festgestellt. In DCMULTILINE Feldern ändere ich die Hintergrundfarbe. Danach mache ich ein dc_getrefresh(getlist) und die Hintergrundfarbe wird wieder zurückgesetzt auf den Ursprungswert. Das passiert nur bei den Multiline Feldern. Hat das jemand auch schon mal gehabt?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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: dc_getrefresh() und Multiline

Beitrag von Tom »

Stimmt so. Wenn Farben direkt angegeben sind (DCMULTINIE ... COLOR GRA1,GRA2), führt daran auch kein Weg vorbei. Das ist schon seit langer Zeit so, weshalb ich dieserart vorgehe:

Code: Alles auswählen

@ 0,0 DCMULTINE ... COLOR {||MlColors(nId)} OBJECT oMulti
Die Funktion MlColors returniert abhängig von der ML-Id das Farbarray. Wenn ich geänderte Farben darstellen will, ändere ich die Rückgabewerte der Funktion und rufe DC_GetRefresh(oMulti) auf. Alternativ kann man auch einfach den Codeblock in oMulti:Color[1] überschreiben und DC_GetRefresh(oMulti) aufrufen.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: dc_getrefresh() und Multiline

Beitrag von Manfred »

Ich bin mir jetzt nicht sicher, ob ich Dich verstehe. dc_getrefresh() wird an der Stelle für alles benötigt. Also muß es schon so da stehen bleiben. Die Multiline Felder haben bei der Erzeung die Standardfarben, also da wird nichts gesetzt. Es wird nur zwischendurch geprüft und dann die Hintergrundfarbe "erneuert" mit SetColorBG
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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: dc_getrefresh() und Multiline

Beitrag von Tom »

DC_GetRefresh(GetList) aktualisiert alle Elemente der GetList, also auch das Multiline. Ruft man DC_GetRefresh(o) mit dem Namen eines beliebigen Objekts auf, wird nur dieses aktualisiert, und wenn "o" das DCMULTILINE-Objekt ist, erneuert sich die Farbe:

Code: Alles auswählen

cTest := 'Test'
nFgColor := GRA_CLR_WHITE
nBgColor := GRA_CLR_BLACK
@ 0,0 DCMULTILINE cTest SIZE 80,10 COLOR {||{nFgColor,nBgColor}} OBJECT oML
@ 11,0 DCPUSHBUTTON CAPTION 'Farbe' SIZE 7,1 ACTION {||nFgColor := GRA_CLR_DARKRED,DC_GetRefresh(oML)}
Die Farbe ändert sich - und bleibt geändert, wenn ein DC_GetRefresh(GetList) aufgerufen wird!
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: dc_getrefresh() und Multiline

Beitrag von Manfred »

Hi Tom,

ich verstehe den Zusammenhang nicht. Ich ändere die Hintergrundfarbe nicht in der Eingabe, sondern irgendwann zwischendurch.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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: dc_getrefresh() und Multiline

Beitrag von Tom »

Hallo, Manfred.

Okay, die Fußgängerversion. :wink:

Wenn Du ein DCMULTILINE-Objekt ohne Farbangaben erzeugst, enthält die iVar "COLOR" des Objekts die eingestellten Standardfarben oder simpel das Array {1,0} (GRA_CLR_BLACK,GRA_CLR_WHITE). Beim Refresh des Objekts werden die Farben erneut ausgelesen und gesetzt, ganz egal, was Du mit den Farben per SetColorBG/FG sonst so tust - ein DC_GetRefresh(GetList) liest die iVar aus und setzt wieder die Farben, die dort stehen. Das gilt übrigens auch für fast alle anderen Elemente.

Jetzt gibt es folgende Möglichkeiten:

1. Statt SetColorBG zu nehmen, machst Du das hier: oML:Color[1] := <nMeineVordergrundFarbe> (für Hintergrund [2] nehmen), danach DC_GetRefresh(oML). Das ist wahrscheinlich der einfachste Weg.
2. Du gibst, wie im vorigen Beispiel gezeigt, einen Codeblock für die Farben an (COLOR {||{nMeineVordergrundFarbe,nMeineHintergrundFarbe}}) und veränderst die Werte, wieder gefolgt von einem Refresh des Objekts.
3. Du baust eine Funktion in den Codeblock und änderst deren Rückgabewerte (ist im Prinzip dasselbe).

Jedenfalls ist es so, dass eXpress++ solche Veränderungen per SetColorFg/Bg schnuppe sind, wenn die Objekte refresht und neu gezeichnet werden. In diesem Augenblick greift die Lib auf die eigenen iVars zu und reagiert auf diese. Deshalb ändert sich Deine Farbe auch wieder. Das ist schon immer so in eXpress++ und wahrscheinlich sogar eher ein Feature als ein Bug. Obwohl DC_GetRefresh() laut Doku eigentlich nur die Datalinks evaluieren sollte, aber es macht tatsächlich einiges mehr.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: dc_getrefresh() und Multiline

Beitrag von Manfred »

Danke Tom,

das habe ich so verstanden und es klappt jetzt wohl so, wie ich es haben wollte.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Antworten