Avances con FiveTouch

Avances con FiveTouch

Postby jnavas » Sat Apr 04, 2015 8:49 am

Code: Select all  Expand view

#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
jnavas
 
Posts: 472
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela

Re: Avances con FiveTouch

Postby Antonio Linares » Sat Apr 04, 2015 9:19 am

Juan,

Muy bueno! :-)

Enhorabuena! Y muchas gracias por compartirlo!
regards, saludos

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

Re: Avances con FiveTouch

Postby jnavas » Sat Apr 04, 2015 9:46 am

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
jnavas
 
Posts: 472
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela

Re: Avances con FiveTouch

Postby Antonio Linares » Sat Apr 04, 2015 9:49 am

Juan,

Puedes usar directamente la función de Harbour:

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

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

Re: Avances con FiveTouch

Postby jnavas » Sat Apr 04, 2015 9:57 am

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: 472
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela

Re: Avances con FiveTouch

Postby jnavas » Sat Apr 04, 2015 10:05 am

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

Re: Avances con FiveTouch

Postby Antonio Linares » Sat Apr 04, 2015 10:07 am

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  Expand view
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
Antonio Linares
Site Admin
 
Posts: 41205
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Avances con FiveTouch

Postby jnavas » Sat Apr 04, 2015 11:26 am

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  Expand view
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: 472
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela

Re: Avances con FiveTouch

Postby jnavas » Sat Apr 04, 2015 11:48 am

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[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:=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[I])="A" .AND. LEN(aData[I])>1
FOR U=1 TO LEN(aData[I])
oModel:SetItem( I-1, U-1, QStandardItem( aData[I,U] ) )
NEXT U
ELSE
oModel:SetItem( I-1, 0, QStandardItem( aData[I] ) )
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
jnavas
 
Posts: 472
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela

Re: Avances con FiveTouch

Postby Antonio Linares » Sat Apr 04, 2015 1:01 pm

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: 41205
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Avances con FiveTouch

Postby Antonio Linares » Sat Apr 04, 2015 1:03 pm

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

Re: Avances con FiveTouch

Postby cnavarro » Sat Apr 04, 2015 1:56 pm

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  Expand view

   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
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6498
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Avances con FiveTouch

Postby cnavarro » Sat Apr 04, 2015 2:19 pm

En mi anterior codigo, sustituye la linea:

Code: Select all  Expand view

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

 


por
Code: Select all  Expand view


   :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  Expand view

    uVal:value<QString>()
   // cambiando el tipo segun lo que vi antes, pero no se como pasarlo
 
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6498
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Avances con FiveTouch

Postby cnavarro » Sat Apr 04, 2015 3:34 pm

Creo que podria ser asi

Code: Select all  Expand view

// 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

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

 
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6498
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Avances con FiveTouch

Postby jnavas » Sat Apr 04, 2015 5:27 pm

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  Expand view

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

Next

Return to FiveTouch

Who is online

Users browsing this forum: No registered users and 5 guests