"Cosa" de Negro
febrero 24, 2005
 
Optimizacion IV - Comando With Object
WITH OBJECT ... END

Esta es otro de los nuevos comandos de xHarbour que permiten ahorrar tiempo en tareas repetitivas.

Este comando realiza una cache de un objeto y junto con algunos PCODEs permite acelerar el acceso a metodos y datas de un objeto.

La sintáxis más común es:

WITH OBJECT oGet
...:Name := "Nombre"
...:VarPut( "Walter" )
END

También se puede usar la función HB_SetWith().
Al pasarle el dato, lo guarda en la cache, y al llamar a esta función sin parámetros, lo quita.
Para acceder al objeto en el cache se usa la función HB_QWith().
Hay que destacar, que tanto HB_SetWith() como HB_QWith() no son funciones reales, sino que en tiempo de compilación se transforman en los mismos PCODEs usados en WITH OBJECT.

HB_SetWith( oGet )
...HB_QWith():Name := "Nombre"

...HB_QWith():VarPut( "Walter" )

HB_SetWith()


Este código genera el mismo PCODE que el ejemplo anterior.

Es posible usar HB_QWith() dentro de WITH OBJECT, pero no es posible usar la sintáxis reducida (:Name), con HB_SetWith().

WITH OBJECT oGet
...oOtro := HB_QWith() // Correcto
END

HB_SetWith( oGet )
...? :Name // Error
HB_SetWith()

También es posible usar el WITH OBJECT dentro de una macro.

WITH OBJECT oGet
...&(":Name := 'Nombre'")
...&(":VarPut( 'Walter' )")
END

Y el HB_SetWith() también en una macro

&("HB_SetWith( oGet )")
...HB_QWith():Name := "Nombre"
...HB_QWith():VarPut( "Walter" )
&("HB_SetWith()")

WITH OBJECT
y HB_SetWith() soportan hasta 32 niveles de anidamiento.
Cada END y cada HB_SetWith() sin parámetros o con parámetro NIL, "desanidan" un nivel.

Aqui hay un ejemplo de los usos, tomado desde el CVS de xHarbour xharbour\tests\with.prg
Comments:
Walter,

Tan sólo comentarte que el debugger no se para en las instrucciones WITH OBJECT y entiendo que es un error.

Gracias por tus artículos, son realmente buenos.

Un saludo
 
anonymous:

No se si esto ocurre en la versión actual, voy a tratar de probarlo.

En un tiempo tampoco registraba el número de línea y si tenías un error en ese lugar, el error era reportado en otro lugar. (No recuerdo si antes o despues)

Me volví loco un día con un problema en ese lugar.
 
Walter gracias por tus comentarios. Realmente interesantes.
Saludos
Rafa R.Gaona
 
Ola!! Estoy usando un recurso do xHarbour para usar a COM (Commom Object Model), mas acho que esse recurso do xHarbour esta incompleto

por exemplo:

El codigo abaixo funciona en VB y Delphi mas en xHarbour NO FUNCIONA, acho que e na forma de acesso ao objeto mas no tengo certeza


Inicia os objetos, etc, etc, por exemplo :

CreateObject("InternetExplorer.Application")
As tres linguagens aceitam a inicialização sem problemas

O codigo abaixo funciona em xHarbour/VB/Delphi
Alguns metodos que funcionam sao :

IE:Visible := .T. // OK

IE:Navigate( "www.google.com.br") //OK

Mas esse ai debaixo da problema :

No VB eu faço :
IEPostBinaryRequest = IE.Document.Body.innerHTML //OK

No Delphi eu faço
text = ie.Document.body.innerHTML //OK

Mas no xHarbour ele nao FUNCIONA,
texto := IE:Document:body:innerHTML() // ERRO


parece que ele nao consegue "enchergar" o método quando existe mais de um metodo
tipo : Objeto:Metodo1:Metodo2:Metodo3 , etc

Alguem teria alguma ideia ?

Perdoe-me pelo idioma. Meu espanhol e horrivel...
 
Publicar un comentario

<< Home

Powered by Blogger