FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Peque帽a contribuci贸n. Class TOptions
Posts: 731
Joined: Fri Oct 07, 2005 07:42 AM
Peque帽a contribuci贸n. Class TOptions
Posted: Tue Oct 21, 2008 08:52 AM
Amigos, quiero compartir con ustedes una peque帽a clase, que me esta
siendo muy 煤til, que nos va a permitir cargar desde un XML , atributo/valor, y podremos acceder a ellos a traves de una tabla de dispersi贸n, conocidas como Hash.

No se si existe algo similar a este invento en Harbour, o estoy
reinventando la rueda, pero que bien me lo paso :-)

Asi, en vez de declarar un mont贸n de variables y cargarlas desde un XML,
podemos obviar eso, y poder usar una clase que nos permite tener que olvidarnos de eso, dando una mayor flexibilidad.

Digamos que podemos usar la clase TOptions como una extension de nuestras clases o funciones.

Nuestro XML de codificaci贸n de ejemplo;

<values_default>
 ;Definicion de Cliente
 <PARAM id="cliente" constante="dni"  valor="122345" />
 <PARAM id="cliente" constante="nombre" valor="Pepe Luis" />

 ;Definicion de Proveedor
 <PARAM id="proveedor" constante="dni"  valor="32115X" />
 <PARAM id="proveedo" constante="nombre" valor="Manolo" />
</values_default>



Ahora , solamente nos queda como hacer uso de eso XML;

op := TOptions():New( "fichero.xml" )
op:Load( "cliente" )
? op:Item["dni"] , op:Item["nombre"]

op:Load( "proveedor" )
? op:Item["dni"] , op:Item["nombre"]


Espero les sea 煤til, es que en Delphi lo hacen de esta manera,
驴 como no vamos a hacerlo nosotros :-) ?

C贸digo fuente de la clase, puedes ver lo simple que es;

#include "hbclass.ch"
#include "hbxml.ch"

Class TOptions
    DATA oXmlDoc
    DATA cOption
    DATA Item
    DATA cError, lError
    DATA cRoot INIT "values_default"
    DATA cFile

    METHOD New( cFile )
    METHOD Load( cOption )

End Class

METHOD New( cFile ) CLASS TOptions

     ::cFile := cFile

RETURN Self

METHOD Load( cOption ) CLASS TOptions
    Local oNodo , oNodeChild

    ::Item := {=>}  // Cada llamada , vamos a recargar el Hash
    HSETCASEMATCH( ::iTem, .F. )  // No tengo en cuenta Upper/Lower

    ::oXmlDoc := TXmlDocument():New( Memoread( ::cFile ) )

    if ::oXmlDoc:nStatus != HBXML_STATUS_OK
       ::cError := "Error While Processing File: " + AllTrim( Str( ::oXmlDoc:nLine ) ) + " # "+;
                 "Error: " + HB_XmlErrorDesc( ::oXmlDoc:nError ) + " # " +;
                 "Tag Error on tag: " + ::oXmlDoc:oErrorNode:cName + " # " +;
                 "Tag Begin on line: " + AllTrim( Str( ::oXmlDoc:oErrorNode:nBeginLine ) )
       ::lError := .T.
       return nil
    endif

    if ( oNodo := ::oXmlDoc:FindFirst( ::cRoot ) ) != NIL
      oNodeChild := oNodo:oChild
      while oNodeChild != NIL
            if UPPER( oNodeChild:GetAttribute("id") ) = UPPER( cOption )
               ::Item[ oNodeChild:GetAttribute("constante") ] := oNodeChild:GetAttribute("valor")
            endif
            oNodeChild := oNodeChild:oNext
      end while
    endif

RETURN NIL
Saludos

Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Peque帽a contribuci贸n. Class TOptions
Posted: Tue Oct 21, 2008 02:40 PM

Gracias Rafa por la aportacion

a usarla :-)

salu2
carlos vargas

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)

Continue the discussion