En este artículo veremos el caso de _Memberdata y cómo arreglarlo.
_Memberdata
_Memberdata es una propiedad que guarda la capitalización de las propiedades y métodos creados. Por defecto VFP crea todas las propiedades y métodos en minúsculas, pero con la propiedad _Memberdata VFP puede recordar la capitalización que le demos a la propiedad (Ver más información en la ayuda de VFP o en la web de Microsoft sobre MemberData Extensibility)Por ejemplo, si creamos la propiedad "ValorMaximo" con el PEM Editor (de VFPx), la propiedad _Memberdada tendrá información con esta estructura:
<VFPData>
<memberdata name="valormaximo" display="ValorMaximo"/>
</VFPData>
Donde:
- name contiene el nombre original en minúsculas
- type (opcionalmente) contiene el tipo de elemento ("Property" o "Method" habitualmente)
- display contiene el nombre capitalizado a mostrar
Propiedad "ValorMaximo" creada con el PEM Editor |
A medida que se van agregando propiedades capitalizadas, se irán agregando también elementos <memberdata name="xx" display="Xx">, y llegado un momento dado este campo puede llegar a ser bastante largo (puede tener hasta unos 8 KiB de longitud)
Este es un ejemplo de propiedad _Memberdata corrupta, visto con el Notepad++ desde la vista texto generada por FoxBin2Prg de la librería foxcharts.vcx en GitHub:
Pueden observarse algunos problemas evidentes:
- VFPData aparece varias veces, cuando solo debería aparecer 2 veces
- Siendo un miembro codificado en XML, debería tener un tag <VFPData> de inicio y un tag </VFPData> final, el cual no se ve
- El tag <VFPData> de inicio está anidado en sí mismo varias veces
*<DefinedPropArrayMethod>
*m: caption_assign
*m: reset && Resets the legend GDI+ objects
*m: rotation_assign
*m: _drawstring
*m: _setup
*m: _updatemeasures
*m: _value_assign
*p: backcoloralpha
*p: forecoloralpha
*p: format && Specifies the input and ...
*p: format2
*p: isparent
*p: ogfx
*p: rotationcenter
*p: _forceformat
*p: _height
*p: _initialized
*p: _memberdata && XML Metadata ...
*p: _obrush
*p: _ofont
*p: _orectangle
*p: _ostringformat
*p: _transfcaption
*p: _value
*p: _vartype
*p: _width
*</DefinedPropArrayMethod>
Mirando nuevamente la propiedad _Memberdata y su contenido, puede verse un patrón de repetición de varias propiedades, donde básicamente se repite esta parte:
_memberdata = <VFPData>
<memberdata name="autosize" ... display="AutoSize"/>
<memberdata name="whatsthishelpid" ... display="WhatsThisHelpID"/>
<memberdata name="_setup" ...display="_Setup"/>
<memberdata name="forecoloralpha" ... display="ForeColorAlpha"/>
<memberdata name="backcoloralpha" ... display="BackColorAlpha"/>
<memberdata name="width" ... display="Width"/>
<memberdata name="oledragpicture" ... display="OLEDragPicture"/>
...
</VFPData> && XML Metadata for customizable properties
con lo que recortando cuidadosamente el resto de repeticiones hasta el tag de finalización </VFPData>, quedaría resuelta esta parte.
Nota: Revisando esta librería encontré que tiene más secciones <VFPData> con problemas más adelante, con lo que una vez detectado el problema siempre es conveniente buscar y revisar todas las estructuras <VFPData> para asegurarse de que están correctas.
Puede pasar que alguna de las propiedades descriptas en los miembros <memberdata> esté incompleta o cortada, por ejemplo podría contener solamente la parte del "name" pero no la parte del "display".
Nuevamente, conociendo que la estructura mínima de un miembro debe contener el name y el display, simplemente se puede crear manualmente la propiedad display y ponerle un valor que seguramente va a ser bastante obvio: el nombre de la propiedad capitalizada que querramos que se muestre en el IDE de VFP.
Resumen
Una vez resueltos todos los problemas, se regenera el binario desde esta vista texto (click-derecho sobre el archivo VC2, elegir "Enviar a" -> FoxBin2Prg)
Como se ve, realmente no es difícil solucionar varios de estos problemas, pero sí es necesario dedicar un rato para analizar el problema, conocer qué es lo que estamos modificando, cuál es la estructura correcta e implementar la solución.
Hasta la próxima! :D
No hay comentarios:
Publicar un comentario