Page 1 of 2

Avances con FiveTouch

Posted: Sat Apr 04, 2015 8:49 am
by jnavas

Code: Select all

#include "FiveTouch.ch"

#include "FiveTouch.ch"

#xcommand DEFAULT <uVar1> := <uVal1> ;
[, <uVarN> := <uValN> ] => ;
<uVar1> := If( <uVar1> == nil, <uVal1>, <uVar1> ) ;;
[ <uVarN> := If( <uVarN> == nil, <uValN>, <uVarN> ); ]


function Main()
LOCAL oBtnCancelJ
LOCAL aBtnText:={"Incluir","Inspector","Modificar","Eliminar","Salir"}
LOCAL aBtn :=ARRAY(LEN(aBtnText))

PRIVATE oDlgBrw,oBrw

SET DELETE ON
SET CENTURY ON
SET DATE FRENCH

FT_CREATE_TABLES()

USE ("FT_USER.DBF") 
GO TOP

IF RECCOUNT()=0
FT_EDITUSER(NIL)
ENDIF

DEFINE DIALOG oDlgBrw TITLE "Usuarios" ;
SIZE 460, 600   

@ 30, 0 BROWSE oBrw OF oDlgBrw ;
SIZE 458, 600 ;
HEADERS "Id", "Nombre","Fecha","Activo" ;
FIELDS FIELD->USR_ID, FIELD->USR_NAME, FIELD->USR_DATE,FIELD->USR_ACTIVE

@ 0, BCOL(1) BUTTON aBtn[1] PROMPT aBtnText[1] OF oDlgBrw ;
ACTION FT_EDITUSER(NIL)

@ 0, BCOL(2) BUTTON aBtn[2] PROMPT aBtnText[2] OF oDlgBrw ;
ACTION FT_INSPECT(oBrw)

@ 0, BCOL(3) BUTTON aBtn[3] PROMPT aBtnText[3] OF oDlgBrw ;
ACTION FT_EDITUSER(FIELD->USR_ID,3)

@ 0, BCOL(4) BUTTON aBtn[4] PROMPT aBtnText[4] OF oDlgBrw ;
ACTION FT_EDITUSER(FIELD->USR_ID,4)

@ 0, BCOL(5) BUTTON aBtn[5] PROMPT aBtnText[5] OF oDlgBrw ;
ACTION oDlgBrw:End()

ACTIVATE DIALOG oDlgBrw CENTERED 

//FT_EDITUSER()
CLOSE ALL

RETURN NIL

FUNCTION BCOL(nCol)
RETURN 81*(nCol-1)+10   



FUNCTION FT_EDITUSER(cId_User)
LOCAL oDlg,I,oBtnOk,oBtnCancel
LOCAL oSay:=ARRAY(3)

PRIVATE oId,oName,oDate,oActive
PRIVATE cId:=SPACE(03),cName:=SPACE(100),dDate:=DTOC(DATE()),lActive:=.T.
PRIVATE aSay :={"ID" ,"Nombre","Fecha"}
PRIVATE aVars:={"cId","cName" ,"dDate"}

IF !Empty(cId_User)
MsgAlert(cId_User)
GO TOP
LOCATE FOR FIELD->USR_ID=cId_User
cId :=FIELD->USR_ID
cName :=FIELD->USR_NAME
dDate :=CTOD(FIELD->USR_DATE)
lActive:=FIELD->USR_ACTIVE
ENDIF

DEFINE DIALOG oDlg TITLE "Crear Usuario <AdaptaPro>" ;
SIZE 300, 200   

FOR I =1 TO LEN(aSay)
@ CROW(I),10 SAY oSay[I] PROMPT aSay[I] OF oDlg 
NEXT I

@ CROW(1),060 GET oId VAR cId OF oDlg
oId:setFixedSize(30,24)
oId:setInputMask("00") // Solo Numérico


@ CROW(2),060 GET oName VAR cName OF oDlg 
oName:setFixedSize(120,24)

@ CROW(3),060 GET oDate VAR dDate OF oDlg
oDate:setFixedSize(80,24)
oDate:setInputMask("00/00/0000")

@ CROW(1),160 CHECKBOX oChk VAR lActive OF oDlg ;
PROMPT "Active"

/*
@ CROW(4), 1 BUTTON oBtnOk PROMPT "Inspect" OF oDlg ;
ACTION FT_INSPECT(oId)
*/

@ CROW(5), 110 BUTTON oBtnOk PROMPT "Ok" OF oDlg ;
ACTION FT_SAVEUSR(oDlg)

@ CROW(5),200 BUTTON oBtnCancel PROMPT "Cancel" OF oDlg ;
ACTION oDlg:End()

ACTIVATE DIALOG oDlg CENTERED

FT_INSPECT(oId)

return nil 

FUNCTION CROW(nRow)
RETURN 30*(nRow-1)+20   

/*
// Guardar Registro
*/
FUNCTION FT_SAVEUSR(oDlg)
LOCAL cMsg:="",i,uValue

FOR I=1 TO LEN(aVars)
if Empty(&(aVars[I]))
cMsg:=cMsg+IF(Empty(cMsg),"",CRLF)+aSay[I]
ENDIF
NEXT I

IF !Empty(cMsg)
MsgInfo(cMsg,"Falta campo(s)")
RETURN .F.
ENDIF

// USE ("FT_USER.DBF") 
GO TOP

LOCATE FOR FIELD->USR_ID=cId

IF !FOUND()
APPEND BLANK
ENDIF

REPLACE FIELD->USR_ID WITH cId,;
FIELD->USR_NAME WITH cName,;
FIELD->USR_DATE WITH CTOD(dDate),;
FIELD->USR_ACTIVE WITH lActive

COMMIT
// USE

IF !MsgYesNo("Desea Agregar Otro Usuario")
oDlg:End()
ENDIF

FOR I=1 TO LEN(aVars)
if Empty(&(aVars[I]))
cMsg:=cMsg+IF(Empty(cMsg),"",CRLF)+aSay[I]
ENDIF
NEXT I

// Las variables debe ser vaciadas

oId:SetText(CTOEMPTY(cId))
oName:SetText(CTOEMPTY(cName))
oDate:SetText(CTOEMPTY(dDate))

RETURN NIL  


FUNCTION FT_CREATE_TABLES()
LOCAL I
LOCAL aTables:={}
LOCAL aStruct:={}
LOCAL aIndex :={}

AADD(aStruct,{"USR_ID", "C",003,0})
AADD(aStruct,{"USR_NAME", "C",120,0})
AADD(aStruct,{"USR_DATE" , "D",008,0})
AADD(aStruct,{"USR_ACTIVE","L",001,0})

AADD(aTables,{"FT_USER.DBF",aStruct,aIndex})

FOR I=1 TO LEN(aTables)

IF !FILE(aTables[I,1])
dbcreate(aTables[I,1],aTables[I,2])
ENDIF
NEXT I

RETURN NIL

/*
// Devuelve Vacio
*/
FUNCTION CTOEMPTY(uValue,cType,nLen)

DEFAULT cType:=ValType(uValue)

IF cType="C" .AND. EMPTY(nLen) .AND. ValType(uValue)="C"
nLen:=LEN(uValue)
ENDIF

DO CASE
CASE ValType(uValue)="U".AND.cType$"CM"
uValue:=SPACE(nLen)
CASE ValType(uValue)="U".AND.cType="N"
uValue:=0.00
CASE ValType(uValue)="U".AND.cType="D"
uValue:=CTOD("")
CASE ValType(uValue)="U".AND.cType="L"
uValue:=.F.
CASE ValType(uValue)="C"
uValue:=SPACE(nLen) 
CASE ValType(uValue)="N"
uValue:=0
CASE ValType(uValue)="D"
uValue:=CTOD("")
CASE ValType(uValue)="L"
uValue:=.F.
ENDCASE
RETURN uValue

FUNCTION MsgAlert(cMsg1,cMsg2)
return MsgInfo(cMsg1,cMsg2) 

FUNCTION FT_INSPECT(oObj)

LOCAL aMetodos:=__objGetMethodList( oObj ) // Lectura de Metodos

ViewArray(aMetodos,2,oObj)

RETURN NIL

function VIEWARRAY(aData,nCol,oObj)

local oDlg := QDialog()
local oLayout := QVBoxLayout()
local oBrw := QTableView( oDlg )
local oModel := QStandardItemModel( LEN(aData), nCol, oDlg )

oModel:SetHorizontalHeaderItem( 0, QStandardItem( "Header1" ) )
oModel:SetHorizontalHeaderItem( 1, QStandardItem( "Header2" ) )

FOR I=1 TO LEN(aData)
oModel:SetItem( I-1, 0, QStandardItem( aData[I] ) )
oModel:SetItem( I-1, 1, QStandardItem( STR(I) ) )
NEXT I

oDlg:SetLayout( oLayout )
oBrw:SetModel( oModel )
oLayout:AddWidget( oBrw )

oDlg:SetWindowTitle( "Inspector, Clase "+oObj:ClassName() )
oDlg:Resize( 500, 400 ) 
oDlg:Center()
oDlg:Exec()

return nil

 
Image
Image

Re: Avances con FiveTouch

Posted: Sat Apr 04, 2015 9:19 am
by Antonio Linares
Juan,

Muy bueno! :-)

Enhorabuena! Y muchas gracias por compartirlo!

Re: Avances con FiveTouch

Posted: Sat Apr 04, 2015 9:46 am
by jnavas
Antonio
Buen dia, gracias, todo lo que desarrolle en Fivetouch lo voy a compartir, ya tengo compromisos con clientes,
Puedes generar un nuevo build con las funciones OSEND y OADATA para concluir el inspector, me sido muy util conocer los metodos, ahora me falta conocer las data.

He estado investigando el Browse, ya logre conocer cual es la linea donde se posiciona el browse. Observe que browse administra con comandos SQL QSqlQuery

// Indices del
oBrw:currentIndex(1):DATA
oBrw:currentIndex(1):row() // Indica Numero de la Linea

// El contenido del Browse se administra mediante comandos SQL, clase QSqlQuery
http://www.archivum.info/qt-interest@tr ... d-row.html

// Obtener los datos de una casilla, no se cual es el objeto model, es model = new QStandardItemModel(4,2,this);
// http://www.qtforum.org/article/33855/in ... cking.html
// http://www.bogotobogo.com/Qt/Qt5_QTable ... ew_MVC.php
LineEdit->setText(model.record(index.row()).value(index.column()).toString());

Re: Avances con FiveTouch

Posted: Sat Apr 04, 2015 9:49 am
by Antonio Linares
Juan,

Puedes usar directamente la función de Harbour:

__ObjSendMsg( oObj, cMsg, ... )

Re: Avances con FiveTouch

Posted: Sat Apr 04, 2015 9:57 am
by jnavas
Antonio
Gracias, necesito AODATA o similar para leer el Objeto, asi creare un folder para la data y otro para los metodos.
previamente todo el Dialogo con todos los controles y sirva para inspeccionar todo el formulario.

Re: Avances con FiveTouch

Posted: Sat Apr 04, 2015 10:05 am
by jnavas
jnavas wrote:Antonio
Buen dia, gracias, todo lo que desarrolle en Fivetouch lo voy a compartir, ya tengo compromisos con clientes,
Puedes generar un nuevo build con las funciones OSEND y OADATA para concluir el inspector, me sido muy util conocer los metodos, ahora me falta conocer las data.

He estado investigando el Browse, ya logre conocer cual es la linea donde se posiciona el browse. Observe que browse administra con comandos SQL QSqlQuery

// Indices del
oBrw:currentIndex(1):DATA
oBrw:currentIndex(1):row() // Indica Numero de la Linea

// El contenido del Browse se administra mediante comandos SQL, clase QSqlQuery
http://www.archivum.info/qt-interest@tr ... d-row.html

// Obtener los datos de una casilla, no se cual es el objeto model, es model = new QStandardItemModel(4,2,this);
// http://www.qtforum.org/article/33855/in ... cking.html
// http://www.bogotobogo.com/Qt/Qt5_QTable ... ew_MVC.php
LineEdit->setText(model.record(index.row()).value(index.column()).toString());
Antonio, encontre el Model ahora voy a tratar de extraer los datos
unction VIEWARRAY(aData,nCol,oObj)

local oDlg := QDialog()
local oLayout := QVBoxLayout()
local oBrw := QTableView( oDlg )
local oModel := QStandardItemModel( LEN(aData), nCol, oDlg )

oModel:SetHorizontalHeaderItem( 0, QStandardItem( "Header1" ) )
oModel:SetHorizontalHeaderItem( 1, QStandardItem( "Header2" ) )

FOR I=1 TO LEN(aData)
oModel:SetItem( I-1, 0, QStandardItem( aData ) )
oModel:SetItem( I-1, 1, QStandardItem( STR(I) ) )
NEXT I

oDlg:SetLayout( oLayout )
oBrw:SetModel( oModel )
oLayout:AddWidget( oBrw )

oDlg:SetWindowTitle( "Inspector, Clase "+oObj:ClassName() )
oDlg:Resize( 500, 400 )
oDlg:Center()
oDlg:Exec()

Re: Avances con FiveTouch

Posted: Sat Apr 04, 2015 10:07 am
by Antonio Linares
Juan,

Mientras creo un nuevo build, aqui tienes el código por si quieres añadirlo a tu PRG y asi poder usarlo:

Code: Select all

function aOData( oObject )

   local aInfo  := ASort( __ClassSel( oObject:ClassH ) )
   local aData  := {}
   local n      := 1
   local lExact := Set( _SET_EXACT, .t. )

   while SubStr( aInfo[ n ], 1, 1 ) != "_"
      #ifdef __HARBOUR__ 
         if AScan( aInfo, "_" + aInfo[ n ], n + 1 ) != 0 
      #else 
         if AScan( aInfo, "_" + SubStr( aInfo[ n ], 1, 9 ), n + 1 ) != 0 
      #endif 
            AAdd( aData, aInfo[ n ] )
         endif
      n++
   end

   Set( _SET_EXACT, lExact )

return aData

Re: Avances con FiveTouch

Posted: Sat Apr 04, 2015 11:26 am
by jnavas
Antonio Linares wrote:Juan,

Mientras creo un nuevo build, aqui tienes el código por si quieres añadirlo a tu PRG y asi poder usarlo:

Code: Select all

function aOData( oObject )

   local aInfo  := ASort( __ClassSel( oObject:ClassH ) )
   local aData  := {}
   local n      := 1
   local lExact := Set( _SET_EXACT, .t. )

   while SubStr( aInfo[ n ], 1, 1 ) != "_"
      #ifdef __HARBOUR__ 
         if AScan( aInfo, "_" + aInfo[ n ], n + 1 ) != 0 
      #else 
         if AScan( aInfo, "_" + SubStr( aInfo[ n ], 1, 9 ), n + 1 ) != 0 
      #endif 
            AAdd( aData, aInfo[ n ] )
         endif
      n++
   end

   Set( _SET_EXACT, lExact )

return aData
Antonio
La funcion devuelve aData (Vacio)

Re: Avances con FiveTouch

Posted: Sat Apr 04, 2015 11:48 am
by jnavas
Antonio
aLista:= ASort( __ClassSel( oObj:ClassH ) )
aMetodos:=ASORT(__objGetMethodList( oObj ))

Ambas devuelven los metodos, necesito leer la classdata


#include "FiveTouch.ch"

#include "FiveTouch.ch"

#xcommand DEFAULT <uVar1> := <uVal1> ;
[, <uVarN> := <uValN> ] => ;
<uVar1> := If( <uVar1> == nil, <uVal1>, <uVar1> ) ;;
[ <uVarN> := If( <uVarN> == nil, <uValN>, <uVarN> ); ]


function Main()
LOCAL oBtnCancelJ
LOCAL aBtnText:={"Incluir","Inspec Métodos","Modificar","Insp. Data","Salir"}
LOCAL aBtn :=ARRAY(LEN(aBtnText))

PRIVATE oDlgBrw,oBrw

SET DELETE ON
SET CENTURY ON
SET DATE FRENCH

FT_CREATE_TABLES()

USE ("FT_USER.DBF")
GO TOP

IF RECCOUNT()=0
FT_EDITUSER(NIL)
ENDIF

DEFINE DIALOG oDlgBrw TITLE "Usuarios" ;
SIZE 460, 600

@ 30, 0 BROWSE oBrw OF oDlgBrw ;
SIZE 458, 600 ;
HEADERS "Id", "Nombre","Fecha","Activo" ;
FIELDS FIELD->USR_ID, FIELD->USR_NAME, FIELD->USR_DATE,FIELD->USR_ACTIVE

@ 0, BCOL(1) BUTTON aBtn[1] PROMPT aBtnText[1] OF oDlgBrw ;
ACTION FT_EDITUSER(NIL)

@ 0, BCOL(2) BUTTON aBtn[2] PROMPT aBtnText[2] OF oDlgBrw ;
ACTION FT_INSPECT(oBrw)

@ 0, BCOL(3) BUTTON aBtn[3] PROMPT aBtnText[3] OF oDlgBrw ;
ACTION FT_INSPECT(oBrw:currentIndex(1):DATA)

@ 0, BCOL(4) BUTTON aBtn[4] PROMPT aBtnText[4] OF oDlgBrw ;
ACTION FT_INSPECT_DATA(oBrw)

@ 0, BCOL(5) BUTTON aBtn[5] PROMPT aBtnText[5] OF oDlgBrw ;
ACTION oDlgBrw:End()



ACTIVATE DIALOG oDlgBrw CENTERED

// FT_INSPECT(oBrw:currentIndex(1)
//MsgInfo(oBrw:record(oBrw:currentIndex(1):row()).value(index.column()).toString());
//gInfo(oBrw:currentIndex(1):column())
//FT_EDITUSER()
CLOSE ALL

RETURN NIL

FUNCTION BCOL(nCol)
RETURN 81*(nCol-1)+10



FUNCTION FT_EDITUSER(cId_User)
LOCAL oDlg,I,oBtnOk,oBtnCancel
LOCAL oSay:=ARRAY(3)

PRIVATE oId,oName,oDate,oActive
PRIVATE cId:=SPACE(03),cName:=SPACE(100),dDate:=DTOC(DATE()),lActive:=.T.
PRIVATE aSay :={"ID" ,"Nombre","Fecha"}
PRIVATE aVars:={"cId","cName" ,"dDate"}

IF !Empty(cId_User)
MsgAlert(cId_User)
GO TOP
LOCATE FOR FIELD->USR_ID=cId_User
cId :=FIELD->USR_ID
cName :=FIELD->USR_NAME
dDate :=CTOD(FIELD->USR_DATE)
lActive:=FIELD->USR_ACTIVE
ENDIF

DEFINE DIALOG oDlg TITLE "Crear Usuario <AdaptaPro>" ;
SIZE 300, 200

FOR I =1 TO LEN(aSay)
@ CROW(I),10 SAY oSay PROMPT aSay OF oDlg
NEXT I

@ CROW(1),060 GET oId VAR cId OF oDlg
oId:setFixedSize(30,24)
oId:setInputMask("00") // Solo Numérico


@ CROW(2),060 GET oName VAR cName OF oDlg
oName:setFixedSize(120,24)

@ CROW(3),060 GET oDate VAR dDate OF oDlg
oDate:setFixedSize(80,24)
oDate:setInputMask("00/00/0000")


@ CROW(1),160 CHECKBOX oChk VAR lActive OF oDlg ;
PROMPT "Active"

/*
@ CROW(4), 1 BUTTON oBtnOk PROMPT "Inspect" OF oDlg ;
ACTION FT_INSPECT(oId)
*/

@ CROW(5), 110 BUTTON oBtnOk PROMPT "Ok" OF oDlg ;
ACTION FT_SAVEUSR(oDlg)

@ CROW(5),200 BUTTON oBtnCancel PROMPT "Cancel" OF oDlg ;
ACTION oDlg:End()

ACTIVATE DIALOG oDlg CENTERED

FT_INSPECT(oId)

return nil

FUNCTION CROW(nRow)
RETURN 30*(nRow-1)+20

/*
// Guardar Registro
*/
FUNCTION FT_SAVEUSR(oDlg)
LOCAL cMsg:="",i,uValue

FOR I=1 TO LEN(aVars)
if Empty(&(aVars))
cMsg:=cMsg+IF(Empty(cMsg),"",CRLF)+aSay
ENDIF
NEXT I

IF !Empty(cMsg)
MsgInfo(cMsg,"Falta campo(s)")
RETURN .F.
ENDIF

// USE ("FT_USER.DBF")
GO TOP

LOCATE FOR FIELD->USR_ID=cId

IF !FOUND()
APPEND BLANK
ENDIF

REPLACE FIELD->USR_ID WITH cId,;
FIELD->USR_NAME WITH cName,;
FIELD->USR_DATE WITH CTOD(dDate),;
FIELD->USR_ACTIVE WITH lActive

COMMIT
// USE

IF !MsgYesNo("Desea Agregar Otro Usuario")
oDlg:End()
ENDIF

FOR I=1 TO LEN(aVars)
if Empty(&(aVars))
cMsg:=cMsg+IF(Empty(cMsg),"",CRLF)+aSay
ENDIF
NEXT I

// Las variables debe ser vaciadas

oId:SetText(CTOEMPTY(cId))
oName:SetText(CTOEMPTY(cName))
oDate:SetText(CTOEMPTY(dDate))

RETURN NIL


FUNCTION FT_CREATE_TABLES()
LOCAL I
LOCAL aTables:={}
LOCAL aStruct:={}
LOCAL aIndex :={}

AADD(aStruct,{"USR_ID", "C",003,0})
AADD(aStruct,{"USR_NAME", "C",120,0})
AADD(aStruct,{"USR_DATE" , "D",008,0})
AADD(aStruct,{"USR_ACTIVE","L",001,0})

AADD(aTables,{"FT_USER.DBF",aStruct,aIndex})

FOR I=1 TO LEN(aTables)

IF !FILE(aTables[I,1])
dbcreate(aTables[I,1],aTables[I,2])
ENDIF
NEXT I

RETURN NIL

/*
// Devuelve Vacio
*/
FUNCTION CTOEMPTY(uValue,cType,nLen)

DEFAULT cType:=ValType(uValue)

IF cType="C" .AND. EMPTY(nLen) .AND. ValType(uValue)="C"
nLen:=LEN(uValue)
ENDIF

DO CASE
CASE ValType(uValue)="U".AND.cType$"CM"
uValue:=SPACE(nLen)
CASE ValType(uValue)="U".AND.cType="N"
uValue:=0.00
CASE ValType(uValue)="U".AND.cType="D"
uValue:=CTOD("")
CASE ValType(uValue)="U".AND.cType="L"
uValue:=.F.
CASE ValType(uValue)="C"
uValue:=SPACE(nLen)
CASE ValType(uValue)="N"
uValue:=0
CASE ValType(uValue)="D"
uValue:=CTOD("")
CASE ValType(uValue)="L"
uValue:=.F.
ENDCASE
RETURN uValue

FUNCTION MsgAlert(cMsg1,cMsg2)
return MsgInfo(cMsg1,cMsg2)

FUNCTION FT_INSPECT(oObj)

LOCAL aMetodos:=ASORT(__objGetMethodList( oObj )) // Lectura de Metodos

ViewArray(aMetodos,2,oObj)

RETURN NIL

function VIEWARRAY(aData,nCol,oObj)
LOCAL I,U
local oDlg := QDialog()
local oLayout := QVBoxLayout()
local oBrw := QTableView( oDlg )
local oModel := QStandardItemModel( LEN(aData), nCol, oDlg )

oModel:SetHorizontalHeaderItem( 0, QStandardItem( "Header1" ) )
oModel:SetHorizontalHeaderItem( 1, QStandardItem( "Header2" ) )

FOR I=1 TO LEN(aData)

IF ValType(aData)="A" .AND. LEN(aData)>1
FOR U=1 TO LEN(aData)
oModel:SetItem( I-1, U-1, QStandardItem( aData[I,U] ) )
NEXT U
ELSE
oModel:SetItem( I-1, 0, QStandardItem( aData ) )
oModel:SetItem( I-1, 1, QStandardItem( STR(I) ) )
ENDIF

NEXT I

oDlg:SetLayout( oLayout )
oBrw:SetModel( oModel )
oLayout:AddWidget( oBrw )

oDlg:SetWindowTitle( "Inspector, Clase "+oObj:ClassName() )
oDlg:Resize( 500, 400 )
oDlg:Center()
oDlg:Exec()

return nil
FUNCTION VAL2CHAR_( uValue )
LOCAL cResult := "NIL", cType := VALTYPE( uValue )

DO CASE
CASE cType == "A"
cResult := "{ ... }"

CASE cType == "C"
cResult := '"' + uValue + '"'

CASE cType == "D"
cResult := DTOC( uValue )

CASE cType == "L"
cResult := IIF( uValue, ".T.", ".F." )

CASE cType == "N"
cResult := LTRIM( STR( uValue))

CASE cType == "O"
cResult := "Object"

CASE cType == "B"
cResult := "{ || ... }"

ENDCASE

RETURN cResult

FUNCTION OSEND(oObj,cMsg)
RETURN __ObjSendMsg( oObj, cMsg )

function FT_FOLDER()
local aFld:=ARRAY(3)
local oDlg := QDialog()
local oLayout := QVBoxLayout()
local oFolder := QTabWidget( oDlg )

oDlg:SetLayout( oLayout )
oLayout:AddWidget( oFolder )
oDlg:SetWindowTitle( "A folder" )
oDlg:Resize( 400, 400 )

oFolder:AddTab( QWidget(), "One" )
oFolder:AddTab( QWidget(), "Two" )
oFolder:AddTab( QWidget(), "Three" )

oDlg:Center()
oDlg:Exec()

FT_INSPECT_DATA(oFolder)

return nil

FUNCTION FT_INSPECT_DATA(oObj)
LOCAL aLista:= ASort( __ClassSel( oObj:ClassH ) )

ViewArray(aLista,2,oObj)

RETURN NIL



Re: Avances con FiveTouch

Posted: Sat Apr 04, 2015 1:01 pm
by Antonio Linares
Juan,

La forma de saber cuales son métodos y cuales son DATAs es buscando si existe el nombre con un subrayado delante.

En caso de existir, entonces es una DATA y no un método.

Por ejemplo:

si existiese "Test" y "_Test" entonces es una DATA.

Para asegurarnos, podriamos comprobar que uno de los elementos del array del objeto (un objeto mantiene sus DATAs en un array) es igual a lo que nos devuelve "_" + Mensaje

Re: Avances con FiveTouch

Posted: Sat Apr 04, 2015 1:03 pm
by Antonio Linares
En realidad un objeto es un conjunto de DATAs (array) con unos ciertos comportamientos dados por su clase.

Re: Avances con FiveTouch

Posted: Sat Apr 04, 2015 1:56 pm
by cnavarro
En el caso de QT, no funciona bien extraer las DATAs de un objeto
Debe ser porque para su lectura o cambio de valor tienen sus correspondientes Methodos
Para ver sus Datas has de usar algo como esto

Code: Select all

   oDlg := QDialog()
  
.../...


   oDlgM    := oDlg:metaObject()
   aValores := Array( oDlgM:propertyCount() )
   //MsgInfo( Len( aValores ) )
   oVarsList := QTableWidget()
   oRightLayout:AddWidget( oVarsList )
   WITH OBJECT oVarsList
      
      :setStyleSheet( "border: 0px solid white;" )
      :setRowCount( Len( aValores ) )
      :setColumnCount( 2 )
      :SetHorizontalHeaderItem( 0, QTableWidgetItem( "Property" ) )
      :SetHorizontalHeaderItem( 1, QTableWidgetItem( "Valor" ) )
      For x = 1 to Len( aValores )   
     
         aValores[ x ] := oDlgM:property( x - 1 ):QMetaProperty()
         :SetItem( x-1, 0, QTableWidgetItem( aValores[ x ]:name() ) )
         uVal := oDlg:property( aValores[ x ]:name() ):QVariant()
         :SetItem( x-1, 1, QTableWidgetItem( uVal:typeToName( uVal:type() ) ) ) 
         // Ya tenemos el nombre, y el tipo de valor que contiene: numérico y string, ahora solo queda obtener el valor
         // Estoy con ello 
     Next x
      
   ENDWITH

 
http://doc.qt.io/qt-4.8/qobject.html#Q_PROPERTY

A ver si tienes mas suerte que yo

Image

Re: Avances con FiveTouch

Posted: Sat Apr 04, 2015 2:19 pm
by cnavarro
En mi anterior codigo, sustituye la linea:

Code: Select all

    :SetItem( x-1, 1, QTableWidgetItem( uVal:typeToName( uVal:type() ) ) )

 
por

Code: Select all


   :SetItem( x-1, 1, QTableWidgetItem( uVal:toString() ) )

 
y obtienes los valores, eso si pasados a String
Lo suyo seria usar el metodo value() del uVal, pero estuve intentando como hacer que funcionara y no di con la forma ya que habria que hacerlo algo asi:

Code: Select all

    uVal:value<QString>()
   // cambiando el tipo segun lo que vi antes, pero no se como pasarlo
 

Re: Avances con FiveTouch

Posted: Sat Apr 04, 2015 3:34 pm
by cnavarro
Creo que podria ser asi

Code: Select all

// Devuelve un array de dos dimensiones {  { nombre_data, uvalor }, ...}
//---------------------------------------------------------------//

Function aOQtData( oObject )

Local oDlgM    := oObject:metaObject()
Local aProps   := Array( oDlgM:propertyCount() )
Local aValores := Array( Len( aProps ), 2 )
Local x
Local uVal

   For x = 1 to Len( aValores )   
      aProps[ x ] := oDlgM:property( x - 1 ):QMetaProperty()
      aValores[ x ][ 1 ]  := aProps[ x ]:name()
      uVal := oObject:property( aProps[ x ]:name() ):QVariant()      
      //( uVal:typeToName( uVal:type() ) ) ) //uVal:value() ) )
      aValores[ x ][ 2 ]  := uVal:toString()
   Next x

Return aValores

//---------------------------------------------------------------//

 

Re: Avances con FiveTouch

Posted: Sat Apr 04, 2015 5:27 pm
by jnavas
Cristóbal
Gracias, encontre en foro de QT esta sintaxis para leer la data de una columna

model.record(index.row()).value(index.column()).toString())

Este es el programa fivewin
local oModel := QStandardItemModel( LEN(aData), nCol, oDlg )

Estoy inspeccionando oModel para conocer la manera leer el contenido de linea y columna.

Si el browse se crea con un Arreglo, puedo usar el arreglo para leer su contenido, ya logre determina la posicion del Row(), si es necesario leer la clasdata de cualquier objeto asi podemos aprovechas mas a FiveTouch y las clases QT.

cnavarro wrote:En el caso de QT, no funciona bien extraer las DATAs de un objeto
Debe ser porque para su lectura o cambio de valor tienen sus correspondientes Methodos
Para ver sus Datas has de usar algo como esto

Code: Select all

   oDlg := QDialog()
  
.../...


   oDlgM    := oDlg:metaObject()
   aValores := Array( oDlgM:propertyCount() )
   //MsgInfo( Len( aValores ) )
   oVarsList := QTableWidget()
   oRightLayout:AddWidget( oVarsList )
   WITH OBJECT oVarsList
      
      :setStyleSheet( "border: 0px solid white;" )
      :setRowCount( Len( aValores ) )
      :setColumnCount( 2 )
      :SetHorizontalHeaderItem( 0, QTableWidgetItem( "Property" ) )
      :SetHorizontalHeaderItem( 1, QTableWidgetItem( "Valor" ) )
      For x = 1 to Len( aValores )   
     
         aValores[ x ] := oDlgM:property( x - 1 ):QMetaProperty()
         :SetItem( x-1, 0, QTableWidgetItem( aValores[ x ]:name() ) )
         uVal := oDlg:property( aValores[ x ]:name() ):QVariant()
         :SetItem( x-1, 1, QTableWidgetItem( uVal:typeToName( uVal:type() ) ) ) 
         // Ya tenemos el nombre, y el tipo de valor que contiene: numérico y string, ahora solo queda obtener el valor
         // Estoy con ello 
     Next x
      
   ENDWITH

 
http://doc.qt.io/qt-4.8/qobject.html#Q_PROPERTY

A ver si tienes mas suerte que yo

Image