RE:color campo con función EVALUATE
si tu campo / columna se llama por ejemplo 'mi_campo' y tu control de dw "dw_1":
color de fondo:
dw_1.Object.mi_campo.Background.Color
color de fuente:
dw_1.Object.mi_campo.Color
te devolverá el color como una string (siende un número), que puedes convertir a Long con la función Long( ). Sólo te dará este valor long, cuando no hayas usado una expresión RGB() en el attributo de por ejemplo background.color. En ese caso te dará
string ls_color
ls_color = dw_1.object.mi_campo.background.color
ls_color = "12632256 + una tabulación + rgb( 255, 255, 255)
(la parte antes del tab es el valor por defecto, asignada como color de fondo a la hora de construir (12632256 corresponde al color 'Window background de windows' que suele ser blanco pero que tiene un número diferente a blanco. La parte después del ~t es lo que quieres.
buscas la posición del tab, te quedas con la parte de la expresión y usas la función Evaluate( ) de datawindows - pasandolo a describe( ) para calcular el long:
string ls_color, ls_expresion
long ll_resultado, ll_pos, ll_fila_actual
ls_color = dw_1.object.mi_campo.background.color
ll_pos = pos(ls_color, '~t ')
if ll_pos > 0 then
ls_color = mid(ls_color, ll_pos + 1)
ll_row = dw_datawindows.getrow()
ls_eval = "Evaluate(~"" + ls_color + ", " + String( ll_row) + ")"
ls_color = dw_datawindows.Describe(ls_eval)
end if
// si lo necesitas convertir el string a long pero para comparar valores fijos no te
// hace falta
ll_resultado = string ( ls_color)
choose case ll_resultado
case 0
// entonces negro
case 16777214
// entonces blanco
case 12632256
// entonces windows background, el color depende lo que tengas asignado a ese
// color de windows, pero suele ser blanco también.
end choose
claro que podrías también pasar de evaluar la expresión obtenido:
case 'rgb( 255, 255, 255)'
// entonces blanco
pero tendrías que escribir todas expresiones de la misma forma:
todo en minúsculas, sí o no separar los valores con un espacio en blanco etc.
Es un auténtico coñazo el uso de la función evaluate pero funciona bien. (lo único es que no se usa mucho y cada vez te costará hacerlo funcionar hasta que todas las comillas y comillas dobles están en su sitio.)
Si ves la ayuda de powerbuilder sobre la función RGB( ) , verás de donde viene este color: una combinación de valores RGB (rojo verde y azul) que se llega a calcular hacia un long (del que hablo aquí arriba) con la siguiente fórmula:
Red + (256 * Green) + (65536 * Blue)
así que blanco:
rgb(255, 255, 255) resultaría en:
255 + 65.280 + 16.711.680 = 16.777.215
No me preguntes como calcular los valores RGB usados, partiendo desde un valor long (osea al revés). Pero creo que tiene que ser posible (matemáticas oxidadas).
Lo más fácil sería ver qué colores usas, ver cuales colores Long te dan como resultados, y los metes todos en un "choose case" por ejemplo.
Tablita de la ayuda de powerbuilder:
Color Red value Green value Blue value
--------------------------------------------------------------------
Black 0 0 0
White 255 255 255
Light Gray 192 192 192
Dark Gray 128 128 128
Red 255 0 0
Dark Red 128 0 0
Green 0 255 0
Dark Green 0 128 0
Blue 0 0 255
Dark Blue 0 0 128
Magenta 255 0 255
Dark Magenta 128 0 128
Cyan 0 255 255
Dark Cyan 0 128 128
Yellow 255 255 0
Brown 128 128 0
Saludos,
Miguel