Clipper On Line • Ver Tópico - Modificando classes do Windows

Modificando classes do Windows

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

Modificando classes do Windows

Mensagempor JoséQuintas » 04 Jun 2020 10:47

Façam o teste se isso é possível com Harbour 3.2 e XHarbour.
Achei fantástico.

#include "hbclass.ch"

PROCEDURE Main

   LOCAL a

   a := win_OleCreateObject( "ADODB.Recordset" )
   __ObjAddMethod( a, "Test", @Test() )
   ? a:CacheSize
   ? a:Test()
   Inkey(0)

   RETURN

FUNCTION Test()
   RETURN "ok"
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18015
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Modificando classes do Windows

Mensagempor JoséQuintas » 04 Jun 2020 11:06

JoséQuintas escreveu:Achei fantástico.


Ou quase....
Falta poder simular o ::super:
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18015
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Modificando classes do Windows

Mensagempor JoséQuintas » 04 Jun 2020 11:26

#include "hbclass.ch"

PROCEDURE Main

   LOCAL a

   a := win_OleCreateObject( "ADODB.Recordset" )
   __ObjAddMethod( a:Fields, "ToString", @ADOToString() )
   ? a:CacheSize
   ? a:ToString( a:CacheSize )
   Inkey(0)

   RETURN

FUNCTION ADOToString( x )
   RETURN Transform( x, "" )


Acima, acrescentei ToString() no recordset ADO.
Agora faltaria o ToString() pegar informação do recordset, sem precisar passar parâmetro, ou passar o nome do campo por exemplo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18015
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Modificando classes do Windows

Mensagempor JoséQuintas » 04 Jun 2020 11:52

#include "hbclass.ch"

PROCEDURE Main

   LOCAL a, aList, cName

   a := win_OleCreateObject( "ADODB.Recordset" )
   __ObjAddMethod( a:Fields, "ToString", @ADOToString() )
   ? a:CacheSize
   ? a:ToString( a:CacheSize )
   aList := __objGetMethodList( a )
   FOR EACH cName IN aList
      ? cName
   NEXT
   Inkey(0)

   RETURN

FUNCTION ADOToString( x )
   RETURN Transform( x, "" )


1
1
WIN_OLEAUTO
REALCLASS
TOSTRING


win_OleCreateObject() cria uma classe intermediária.
Adicionar um método que não tem acesso ao resto da classe me parece algo inútil.
Deve existir alguma outra possibilidade nisso, mas não encontrei.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18015
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Modificando classes do Windows

Mensagempor JoséQuintas » 05 Jun 2020 00:05

Passaram alternativas no harbour-users

FUNCTION x

   LOCAL SELF := QSelf()

   RETURN ::any


__ObjAddInLine( oRs, "GoTop", { | Self | iif( ::RecordCount() > 0, ::MoveFirst(), ) } )


Agora sim, ficou interessante.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18015
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Modificando classes do Windows

Mensagempor dbsh » 05 Jun 2020 23:11

EXEMPLO EXTENDENDO CLASSE QT
PROCEDURE ExtendQLineEdit()

EXTEND CLASS QLineEdit WITH DATA    cbGetSet                //bloco de codigo para salvar e restaura variavel/campo vinculado ao controle
EXTEND CLASS QLineEdit WITH DATA    VarTipo                 //tipo original de variavel vinculado ao controle, buffer e sempre string, recuperado de ::cbGetSet
EXTEND CLASS QLineEdit WITH DATA    cbWhen
EXTEND CLASS QLineEdit WITH DATA    cbValid

EXTEND CLASS QLineEdit WITH MESSAGE VarGet  METHOD VarGet    //retornava valor do buffer, ::Text()
EXTEND CLASS QLineEdit WITH MESSAGE VarPut  METHOD VarPut    //altera variavel, passando parametro para VarPut( [uSet] ), altera buffer
EXTEND CLASS QLineEdit WITH MESSAGE Refresh METHOD Refresh1 //restaura buffer, ::Text(), usando ::cbGetSet
EXTEND CLASS QLineEdit WITH MESSAGE Commit  METHOD Commit1   //altera variavel vinculado ao controle, passando parametro para ::Commit( default uSet=::Text() )
EXTEND CLASS QLineEdit WITH MESSAGE Upper   INLINE Upper(::Text())
EXTEND CLASS QLineEdit WITH MESSAGE Lower   INLINE Lower(::Text())
EXTEND CLASS QLineEdit WITH MESSAGE SetKey(cbKey, sCtrl, nKey) INLINE addKeyPress(Self, cbKey, sCtrl, nKey)

RETURN

STATIC FUNCTION VarGet()
LOCAL Self := QSelf(), uRet

uRet := ::Text()

IF ::cbGetSet <> NIL
   DEFA ::VarTipo TO ValType(Eval(::cbGetSet))
ELSE
   DEFA ::VarTipo TO "C"
ENDIF

uRet := ConvertVar(uRet, ::VarTipo)

RETURN uRet

//uSet altera buffer e variavel vinculada ao controle
STATIC FUNCTION VarPut(uSet)
LOCAL Self := QSelf()

IF uSet <> NIL
    ::SetText( Trim( ConvertVar(uSet, 'C') ) )
ENDIF

RETURN ::Commit()

STATIC FUNCTION Refresh1()
LOCAL Self := QSelf()
LOCAL uBuffer

//::__Super:Refresh()

IF ::cbGetSet <> NIL
    uBuffer := Eval(::cbGetSet)
    DEFA ::VarTipo TO ValType(uBuffer)
    IF ::VarTipo = 'D'
        uBuffer :=  DToC(uBuffer)
    ENDIF
    ::SetText( Trim( xStr( uBuffer ) ) )
ELSE
    uBuffer := ::Text()
ENDIF

RETURN uBuffer

//uSet altera variavel vinculada ao controle
STATIC FUNCTION Commit1(uSet)
LOCAL Self := QSelf()
LOCAL uBuffer

//::__Super:Commit()

DEFA uSet TO ::Text()

IF ::cbGetSet <> NIL
    DEFA ::VarTipo TO ValType(Eval(::cbGetSet))

    uBuffer := ConvertVar(uSet, ::VarTipo)
    Eval(::cbGetSet, uBuffer)
ELSE
    uBuffer := uSet
ENDIF

RETURN uBuffer

PROCEDURE AddKeyPress( Obj, cbSetKey, sCtrl, nKey )
LOCAL nPos

DEFA sCtrl TO ""
DEFA nKey  TO 0

IF !ValType(Obj) = 'O'
   RETURN
ENDIF

IF !__objHasData(Obj, 'acbKey')
   IF Empty(cbSetKey)
      RETURN
   ELSE
      AddVar(Obj, "acbKey")
      Obj:acbKey := {}
   ENDIF
ELSEIF Empty(cbSetKey) .and. (Empty(Obj:acbKey) .or. Len(Obj:acbKey) = 0)
   RETURN
ENDIF

IF Empty(sCtrl)
   nPos := 0
ELSEIF ValType(sCtrl) = "C"
   nPos := aScan({ 'SHIFT', 'CONTROL', 'ALT', 'META' , 'KEYPAD', 'GROUPSWITCH' }, Upper(sCtrl))
   IF nPos > 0 .and. nPos < 7
      nPos :=({Qt_ShiftModifier, Qt_ControlModifier, Qt_AltModifier, Qt_MetaModifier, Qt_KeypadModifier, Qt_GroupSwitchModifier})[nPos]
   ELSE
      nPos := 0
   ENDIF
ELSE
   nPos := sCtrl
ENDIF

IF obj:acbKey = NIL
   obj:acbKey := {}
ENDIF

IF Empty(cbSetKey)
   cbSetKey := AScan(Obj:acbKey, {|p| p[1] = nPos .and. p[2] = nKey})
   IF cbSetKey > 0
      aDelSize(Obj:acbKey, cbSetKey)
   ENDIF
ELSE
   AAdd(Obj:acbKey, {nPos, nKey, cbSetKey})
ENDIF

RETURN

010011110010000001110011011101010110001101100101011100110111001101101111001000001110100100100000011000110110111101101110011100110111010001110010011101011110110101100100011011110010000001100001001000000110111001101111011010010111010001100101
01001101011000010111001001100011011011110111001100100000010000010110111001110100011011110110111001101001011011110010000001000100011001010010000001000010011011110110111001101001
0101010001100101011011000011101000100000001010000011001000110111001010010011100100101101001110010011100000110100001100110010110100110101001100100011100100110000
Avatar de usuário

dbsh
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 115
Data de registro: 14 Jul 2004 14:19
Cidade/Estado: ES
Curtiu: 2 vezes
Mens.Curtidas: 15 vezes




Retornar para Harbour

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 12 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro