Avances con FiveTouch

User avatar
jnavas
Posts: 399
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela
Contact:

Avances con FiveTouch

Post 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
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Avances con FiveTouch

Post by Antonio Linares »

Juan,

Muy bueno! :-)

Enhorabuena! Y muchas gracias por compartirlo!
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
jnavas
Posts: 399
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela
Contact:

Re: Avances con FiveTouch

Post 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());
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Avances con FiveTouch

Post by Antonio Linares »

Juan,

Puedes usar directamente la función de Harbour:

__ObjSendMsg( oObj, cMsg, ... )
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
jnavas
Posts: 399
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela
Contact:

Re: Avances con FiveTouch

Post 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.
User avatar
jnavas
Posts: 399
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela
Contact:

Re: Avances con FiveTouch

Post 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()
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Avances con FiveTouch

Post 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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
jnavas
Posts: 399
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela
Contact:

Re: Avances con FiveTouch

Post 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)
User avatar
jnavas
Posts: 399
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela
Contact:

Re: Avances con FiveTouch

Post 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


User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Avances con FiveTouch

Post 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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Avances con FiveTouch

Post by Antonio Linares »

En realidad un objeto es un conjunto de DATAs (array) con unos ciertos comportamientos dados por su clase.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Avances con FiveTouch

Post 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
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Avances con FiveTouch

Post 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
 
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Avances con FiveTouch

Post 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

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

 
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
User avatar
jnavas
Posts: 399
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela
Contact:

Re: Avances con FiveTouch

Post 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
Post Reply