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:
<< Home
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
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.
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.
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
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...
<< Home