Página 1 de 2

No exported method: PROPS2ARR (Faltou oFont pro browse)

Enviado: 26 Out 2021 20:36
por JoséQuintas

Código: Selecionar todos

Error BASE/1004  No exported method: PROPS2ARR  
Called from PROPS2ARR(0)  
Called from HBROWSE:EDIT(1837)  
Called from HBROWSE:BUTTONDBL(1757)  
Called from HBROWSE:ONEVENT(423)  
Called from HWG_ACTIVATEMAINWINDOW(0)  
Called from HMAINWINDOW:ACTIVATE(400)  
Called from HWGUIBROWSE(56)  
Called from PTESHWGUI(17)  
Called from DOPRG(139)  
Called from (b)RUNMODULE(115)  
Como sair do browse com ENTER, sem entrar no modo de edição?

Error BASE/1004 No exported method: PROPS2ARR

Enviado: 27 Out 2021 01:07
por alxsts
Olá!

Se entendi bem, são coisas mutuamente exclusivas. Se você teclar enter em um browse, é porque ele tem o foco e vai poder detectar o enter no evento keyPress. Normalmente, se o browse não estiver vazio, enter serve para selecionar a linha sobre a qual foi detectado o enter. Se quiser tratar a linha ou sair do browse, é só tratar isto no evento keyPress...

Error BASE/1004 No exported method: PROPS2ARR

Enviado: 27 Out 2021 06:20
por JoséQuintas
alxsts escreveu: vai poder detectar o enter no evento keyPress
a evento keypress, se refere a keydown?

Código: Selecionar todos

   oBrowse:bKeyDown := { | o, key | oBrowseKey( o, key, @cText ) }
   oBrowse:bEnter   := { || oBrowse:oParent:Close() }

   ACTIVATE WINDOW oDlgPesquisa

   RETURN NIL

STATIC FUNCTION oBrowseKey( oBrowse, nKey, cText )

   DO CASE
   CASE nKey == K_ENTER .OR. nKey = K_ESC
      oBrowse:oParent:Close()
   CASE nKey == K_BS
   CASE nKey == K_F5 .AND. OrdCount() > 1 .AND. lCanChangeOrder
   CASE nKey == K_ALT_L .OR. nKey == K_CTRL_L .OR. nKey == K_ALT_T
   CASE nKey == K_ALT_F
   ENDCASE

   HB_SYMBOL_UNUSED( cText )

   RETURN .T.

Error BASE/1004 No exported method: PROPS2ARR

Enviado: 27 Out 2021 10:17
por JoséQuintas
Esqueci de mencionar:

Isso que postei já está no fonte, mas dá erro assim mesmo.

Error BASE/1004 No exported method: PROPS2ARR

Enviado: 27 Out 2021 10:43
por alxsts
Olá!

O caminho é este mas, na HwGUI, o teste de teclas é diferente. Veja:

Código: Selecionar todos

FUNCTION Teste()

   LOCAL oForm, aArray := {}, oBr

   INIT DIALOG oForm TITLE "Teste" AT 374,216 SIZE 778,425;
        FONT HFont():Add( "Verdana",0,-13,400,,,) CLIPPER  NOEXIT STYLE DS_CENTER + WS_VISIBLE + WS_CAPTION + WS_SYSMENU ICON NIL
   
   @ 006,005 BROWSE oBr ARRAY SIZE 770,400 FONT HFont():Add( '',0,-13,400,,,) AUTOEDIT STYLE WS_TABSTOP+WS_VSCROLL+WS_HSCROLL ;

   oBr:bKeyDown := {|o,oForm| oBr_KeyPress(o, oForm) }

...

RETURN NIL
//---------------------------------------------------------------------------------------------------------------------------------------

STATIC FUNCTION oBr_KeyPress(o, oForm )

   If GetKeyState(VK_RETURN,.F.,.T.) < 0
      oForm:close()
   Endif

RETURN .T.
//---------------------------------------------------------------------------------------------------------------------------------------

Error BASE/1004 No exported method: PROPS2ARR

Enviado: 27 Out 2021 10:47
por Itamar M. Lins Jr.
Olá!
Este método está em \source\winapi\drawidg.prg

Código: Selecionar todos

*
  Returns an array with font properties (for creating a copy of a font entry)
  Copy sample
   apffrarr := oFont1:Props2Arr()
   oFont2 := HFont():Add( apffrarr[1], apffrarr[2], apffrarr[3], apffrarr[4], apffrarr[5], ;
                apffrarr[6], apffrarr[7], apffrarr[8] )
 */
METHOD Props2Arr() CLASS HFont
//        fontName, nWidth, nHeight , fnWeight, fdwCharSet, fdwItalic, fdwUnderline, fdwStrikeOut
//        1         2       3         4         5           6          7             8
   LOCAL fontName , nWidth , nHeight , fnWeight , fdwCharSet , fdwItalic , fdwUnderline , fdwStrikeOut
   LOCAL aFontprops := {}

   fontName     := iif( ::name == NIL , "<Empty>", ::name )
   nWidth       := iif( ::width == Nil, - 9999 , ::width )
   nHeight      := iif( ::height == NIL , - 9999 , ::height )
   fnWeight     := iif( ::weight == Nil, - 9999 , ::weight )
   fdwCharSet   := iif( ::CharSet == Nil, - 9999 , ::CharSet )
   fdwItalic    := iif( ::Italic == Nil, - 9999 , ::Italic )
   fdwUnderline := iif( ::Underline == Nil, - 9999 , ::Underline )
   fdwStrikeOut := iif( ::StrikeOut == Nil, - 9999 , ::StrikeOut )

   AADD (aFontprops, fontName)  && C
   AADD (aFontprops, nWidth)    && all other of type N
   AADD (aFontprops, nHeight)
   AADD (aFontprops, fnWeight)
   AADD (aFontprops, fdwCharSet)
   AADD (aFontprops, fdwItalic)
   AADD (aFontprops, fdwUnderline)
   AADD (aFontprops, fdwStrikeOut)

 RETURN aFontprops
Portanto deve-se ativar esse método para ser visto ai na classe ARRAY... Não sei fazer... E não tenho certeza se é isso. Mas é o que estou entendendo.

Saudações,
Itamar M. Lins Jr.

Error BASE/1004 No exported method: PROPS2ARR

Enviado: 27 Out 2021 12:13
por JoséQuintas
Itamar M. Lins Jr. escreveu:Portanto deve-se ativar esse método para ser visto ai na classe ARRAY... Não sei fazer... E não tenho certeza se é isso. Mas é o que estou entendendo.
Como assim? seus browses não tem ENTER ?
Se tem, então mesmo assim pode ter ajudado, pode ser a falta da MAIN() fornecendo defaults pra tudo.
alxsts escreveu:O caminho é este mas, na HwGUI, o teste de teclas é diferente. Veja:
oBr:bKeyDown := {|o,oForm| oBr_KeyPress(o, oForm) }
...
STATIC FUNCTION oBr_KeyPress(o, oForm )

If GetKeyState(VK_RETURN,.F.,.T.) < 0
oForm:close()
Endif

RETURN .T.
Discordo totalmente.
Motivo 1: GetKeyState() aqui nem existe, graças ao Viktor, no 3.4 ela está renomeada pra wapi_GetKeyState(), portanto NÃO FAZ PARTE DE HWGUI.
Motivo 2:

Código: Selecionar todos

   oBrowse:bKeyDown := { | o, key | oBrowseKey( o, key ) }
...
STATIC FUNCTION oBrowseKey( oBrowse, nKey )

   MsgExclamation( Transform( nKey, "" ) )
nkey.png
nkey.png (6.55 KiB) Exibido 1946 vezes
Por enquanto não sei se hb_KeyStd( nKey ) resolve a diferença de teclas, porque nesse caso não houve diferença.
Em todo caso, testar acrescentando a janela nos parâmetros.

Error BASE/1004 No exported method: PROPS2ARR

Enviado: 27 Out 2021 12:17
por Itamar M. Lins Jr.
Olá!
Como assim? seus browses não tem ENTER ?
Tem, mas o browse array não é o mesmo browse DBF.
Não tem esse erro com a ausência do método props2arr.
Não tem nada a ver com ENTER ou qualquer outra tecla, a Hwgui (windows) controla todas.

Saudações,
Itamar M. Lins Jr.

Error BASE/1004 No exported method: PROPS2ARR

Enviado: 27 Out 2021 12:20
por alxsts
Olá!
JoséQuintas escreveu:portanto NÃO FAZ PARTE DE HWGUI
Use hwg_Getkeystate( nKey ) (Windows only)

Error BASE/1004 No exported method: PROPS2ARR

Enviado: 27 Out 2021 12:26
por Itamar M. Lins Jr.
Olá!
O Alexander me ensinou a usar assim:

Código: Selecionar todos

oBrw:bOther       := {|oBrw, msg, wParam, lParam| fKeyDown(oBrw, msg, wParam, lParam )

Static FUNCTION fKeyDown(oBrw, msg, wParam, lParam)
LOCAL nKEY := hwg_PtrToUlong( wParam ))
IF msg == WM_KEYDOWN
    If nKey == VK_ESCAPE
...
IF nKey == VK_RETURN
...
ENDIF
ENDIF

//Meus browses uso pesquisa letra a letra já no automático.
IF msg == WM_CHAR
  
   If nKey = VK_ESCAPE
      hwg_EndDialog()
      RETURN .F.
   ElseIf nKey == VK_BACK
      If len(cPesq) > 0
         cPesq := substr(cPesq,1,len(cPesq)-1)
         RefoBrw('eq',oBrw,cPesq)
      EndIf
      RETURN  .F.
   ENDIF
   IF nKey = VK_RETURN .OR. nKey = VK_TAB
      RETURN .F.
   ENDIF
   cPesq += chr(nKey)
   RefoBrw('eq',oBrw,cPesq)

EndIf

Saudações,
Itamar M. Lins Jr.

Error BASE/1004 No exported method: PROPS2ARR

Enviado: 27 Out 2021 12:57
por JoséQuintas

Código: Selecionar todos

SYSTEM ERROR  
Error BASE/1004  No exported method: PROPS2ARR  
Called from PROPS2ARR(0)  
Called from HBROWSE:EDIT(1837)  
Called from HBROWSE:BUTTONDBL(1757)  
Called from HBROWSE:ONEVENT(423)  
Called from HWG_ACTIVATEMAINWINDOW(0)  
Called from HMAINWINDOW:ACTIVATE(400)  
Called from HWGUIBROWSE(39)  
Called from PTESHWGUI(17)  
Called from DOPRG(139)  
Called from (b)RUNMODULE(115)  
Pelo que eu entendo disso, está tentando EDITAR.

Código: Selecionar todos

#xcommand @ <x>,<y> BROWSE [ <oBrw> ]  ;
            [ <lArr: ARRAY> ]          ;
            [ <lDb: DATABASE> ]        ;
            [ OF <oWnd> ]              ;
            [ ID <nId> ]               ;
            [ SIZE <width>, <height> ] ;
            [ ON INIT <bInit> ]        ;
            [ ON SIZE <bSize> ]        ;
            [ ON PAINT <bDraw> ]       ;
            [ ON CLICK <bEnter> ]      ;
            [ ON RIGHTCLICK <bRClick> ];
            [ ON GETFOCUS <bGfocus> ]  ;
            [ ON LOSTFOCUS <bLfocus> ] ;
            [ STYLE <nStyle> ]         ;
            [ <lNoVScr: NO VSCROLL> ]  ;
            [ <lNoBord: NOBORDER> ]    ;
            [ FONT <oFont> ]           ;
            [ <lAppend: APPEND> ]      ;
            [ <lAutoedit: AUTOEDIT> ]  ;
            [ ON UPDATE <bUpdate> ]    ;
            [ ON KEYDOWN <bKeyDown> ]  ;
            [ ON POSCHANGE <bPosChg> ] ;
            [ <lMulti: MULTISELECT> ]  ;
Pelo que entendo disso, só vai editar se colocar AUTOEDIT.

Resolvida uma parte, referente ao ENTER.

Código: Selecionar todos

   oBrowse:bEnter   := { || hwg_EndWindow( oWindow ) }
Agora falta resolver o CLICK, isto não resolveu

Código: Selecionar todos

   @ 1, 1 BROWSE ARRAY oBrowse ;
      SIZE AppWidth() - 10, AppHeight() - 10 STYLE WS_BORDER + WS_VSCROLL + WS_HSCROLL ;
      ON CLICK { || hwg_EndWindow( oDlgPesquisa ) }

Error BASE/1004 No exported method: PROPS2ARR

Enviado: 27 Out 2021 13:01
por JoséQuintas

Código: Selecionar todos

FUNCTION HwguiBrowse( cTitle, cnSQL, oBrowseList )

   LOCAL oDlgPesquisa, oBrowse

   INIT WINDOW oDlgPesquisa TITLE cTitle AT 9, 0 SIZE AppWidth(), AppHeight()
   //INIT DIALOG oDlgPesquisa AT 0, 0 SIZE AppWidth() , AppHeight() TITLE "Browse do arquivo " + Alias()

   @ 1, 1 BROWSE ARRAY oBrowse ;
      SIZE AppWidth() - 10, AppHeight() - 10 STYLE WS_BORDER + WS_VSCROLL + WS_HSCROLL ;
      ON CLICK { || hwg_EndWindow( oDlgPesquisa ) }
   oBrowse:aArray := cnSQL
   BrowseSet( oBrowse, oBrowseList, oDlgPesquisa )

   //ACTIVATE DIALOG oDlgPesquisa
   ACTIVATE WINDOW oDlgPesquisa

   RETURN Nil

Error BASE/1004 No exported method: PROPS2ARR

Enviado: 27 Out 2021 13:04
por JoséQuintas
Configuração do browse:

Código: Selecionar todos

FUNCTION BrowseSet( oBrowse, oBrowseList, oWindow )

   LOCAL oElement

   oBrowse:bSkip  := { | o, nSkip | ADOSkipper( o:aArray, nSkip ) }
   oBrowse:bGotop := { | o | o:aArray:MoveFirst() }
   oBrowse:bGobot := { | o | o:aArray:MoveLast() }
   oBrowse:bEof   := { | o | o:nCurrent > o:aArray:RecordCount() }
   oBrowse:bBof   := { | o | o:nCurrent == 0 }
   oBrowse:bRcou  := { | o | o:aArray:RecordCount() }
   oBrowse:bRecno := { | o | o:aArray:AbsolutePosition() }
   oBrowse:bRecnoLog := oBrowse:bRecno
   oBrowse:bGOTO  := { | o, n | (o), o:aArray:Move( n - 1, 1 ) }

   FOR EACH oElement IN oBrowseList
      ADD COLUMN oElement[ 2 ] TO oBrowse HEADER oElement[ 1 ] LENGTH Int( Len( Transform( Eval( oElement[ 2 ] ), "" ) ) * 1.2 ) + 1
   NEXT

   oBrowse:bKeyDown := { | o, key | oBrowseKey( o, key ) }
   oBrowse:bEnter   := { || hwg_EndWindow( oWindow ) }

   RETURN Nil

Error BASE/1004 No exported method: PROPS2ARR

Enviado: 27 Out 2021 13:05
por JoséQuintas
Configuração de teclas, que no momento não tem efeito.

Código: Selecionar todos

STATIC FUNCTION oBrowseKey( oBrowse, nKey, oWindow )

   (oBrowse)
   nKey := hb_KeyStd( nKey )
   MsgExclamation( Transform( nKey, "" ) )
   DO CASE
   CASE hb_KeyStd( nKey ) == K_ENTER // .OR. nKey = K_ESC
      hwg_EndWindow( oWindow )
      RETURN .F.
   CASE nKey == K_BS
   CASE nKey == K_F5 // .AND. OrdCount() > 1 .AND. lCanChangeOrder
   CASE nKey == K_ALT_L .OR. nKey == K_CTRL_L .OR. nKey == K_ALT_T
   CASE nKey == K_ALT_F
   ENDCASE

   RETURN .T.

Error BASE/1004 No exported method: PROPS2ARR

Enviado: 27 Out 2021 13:14
por JoséQuintas
Correção:
bENTER não resolveu nada.
Ao bloquear o nKey == K_ENTER não fechou mais.
Removi o bENTER e deixei só a função de teclas, e ok pra fechar no ENTER.

Ficou pendente o CLICK.

Tentar entender porque entrou na rotina EDIT.