Como continuacion a mi post:
viewtopic.php?f=6&t=27442
LLevo algún tiempo desarrollando una herramienta, para mi trabajo, que me permita consultar, editar y modificar arrays mediante tablas/listbox, y que pueda trabajar con matrices complejas multidimensionales. Esto me está produciendo algunos quebraderos de cabeza que voy solventando sobre la marcha, pero a la vez me ha llevado a implementar algunas funciones interesantes que a lo mejor se pueden aplicar en otros ámbitos, por eso las expongo aquí, en los siguientes posts, por si a alguien le interesa.
********************
El primer "inconveniente" con del que me topé nada más empezar, fue la presentación de los elementos de la tabla. Los array de Clipper/Harbour son tan versátiles y potentes que un elemento puede contener cualquier tipo de dato: Numérico, String, Fecha, etc., incluso arrays multidimensionales, objetos o CodeBlocks (además pueden mesclarse). Con cValToChar() se solucionan los tipos normales, pero los arrays, por ejemplo, me los representa con la palabra "Array", o como { ... }, según los casos, y eso no me dice mucho. Por eso escribí la siguiente función:
Code: Select all | Expand
FUNCTION InfoArray(aDat)
LOCAL xDat := "{ "
*
IF aDat = NIL
RETURN ""
ELSEIF Empty(aDat) .OR. aDat[1] = NIL
xDat += ""
ELSEIF ValType(aDat[1]) == "A"
xDat += InfoArray(aDat[1])
ELSE
xDat += ALLTRIM(cValToChar(aDat[1]))
ENDIF
*
IF Len(aDat) < 2
xDat += " }"
ELSE
xDat += ",... }"
ENDIF
RETURN xDat
Por Ejemplo, el array { "Antonio","Juan","Pedro" } lo escribe como: "{ Antonio,... }",
y el array { { 1,2,3 },{ 12,13,14 } } lo escribe como: "{ {1,...},... }".
No es como ValToPrg() que desglosa el array completo, pero cabe en la celda de la tabla y me da información básica. En este caso me indica que el primer array es de una sola dimensión y contiene nombres, y que el segundo es bidimensional y contiene números.
En cuanto a los datos tipo objeto lo solventé escribiendo su ClassName ¿?. Por ahora me sirve.