Página 1 de 2

Como pegar coluna do browse

Enviado: 06 Mai 2025 13:22
por JoséQuintas
Estou tentando pegar a coluna do browse.

Tentei oBrowse:ColPos mas tá sempre 1

Como pegar coluna do browse

Enviado: 06 Mai 2025 13:51
por Itamar M. Lins Jr.
Olá!
oTab, oDlg...

oTab:oBrw:ColPos
oDlg:oTab:oBrw:ColPos


Saudações,
Itamar M. Lins Jr.

Como pegar coluna do browse

Enviado: 06 Mai 2025 17:44
por JoséQuintas
Não vai, dá até erro.

Estou alterando o exemplo testbrowsearr.prg pra 2 colunas
É um exemplo de browse array com edição.

Alterei o array pra duas colunas

Código: Selecionar todos

   al_DOKs :=  { {"1", "12" } , {"2", "22"} , {"3", "23"} , {"4", "24"} }
A definiçào de título

Código: Selecionar todos

   hwg_CREATEARLIST( oBrwArr, al_DOKs )
   oBrwArr:acolumns[1]:heading := "DOKs"  // Header string
   oBrwArr:acolumns[1]:length  := 50
   oBrwArr:bcolorSel           := hwg_ColorC2N( "800080" )
   oBrwArr:aColumns[2]:Heading := "X"
   oBrwArr:aColumns[2]:Length  := 10
E agora mexendo na função de edição

Código: Selecionar todos

STATIC FUNCTION BrwArrayEditElem( oBrow )

   * Edit the Element in the array
   LOCAL nlaeng, cGetfield, cOldget, aRow

   hwg_Msginfo( hb_ValToExp( oBrow:nCurrent ) ) // ok, retorna a linha
   hwg_MsgInfo( hb_ValToExp( oBrow:ColPos ) ) // retorna sempre 1

Como pegar coluna do browse

Enviado: 06 Mai 2025 17:48
por JoséQuintas
Acrescentei mais um teste:

Código: Selecionar todos

   hwg_MsgInfo( hb_ValToExp( oBrow:aArray[ oBrow:nCurrent ] ) )
Ok, linha atual com 2 elementos

Falta essa ColPos

Como pegar coluna do browse

Enviado: 06 Mai 2025 18:51
por JoséQuintas
Resolvido parcial.

Agora é com os desenvolvedores.

Clique do mouse não manda nada.

Setas..... tentando entender pra que serve...

Como pegar coluna do browse

Enviado: 06 Mai 2025 18:59
por JoséQuintas
Automático é comigo mesmo kkkkk

Array do tamanho que quiser pra linhas e colunas

Código: Selecionar todos

   aBrowseList := Array(10,10)
   FOR EACH aRow IN aBrowseList
      FOR EACH aCol IN aRow
         aCol := Ltrim( Str( aRow:__EnumIndex() ) ) + "." + Ltrim( Str( aCol:__EnumIndex() ) )
      NEXT
   NEXT
Mas tem o título....

Código: Selecionar todos

   hwg_CREATEARLIST( oBrowse, aBrowseList )
   FOR EACH oCol IN oBrowse:aColumns
      oCol:Heading := Ltrim( Str( oCol:__EnumIndex() ) )
      oCol:Length  := 20
   NEXT
1. Clique do mouse não manda nada na coluna
2. A navegação com setas NÃO é coluna a coluna, sendo assim, ColPos não é atualizado com 2 colunas

Como pegar coluna do browse

Enviado: 06 Mai 2025 19:38
por alxsts
Olá!

Não entendi se quer saber em qual coluna está posicionado ou se quer obter o valor da célula...

Em todo caso, como o browse é uma tabela, tem que referenciar linha e coluna. Tente assim:

Código: Selecionar todos

hwg_MsgInfo( hb_ValToExp( oBrow:aArray[ oBrow:nCurrent ,Brow:nCol ] ) )

Como pegar coluna do browse

Enviado: 06 Mai 2025 21:02
por JoséQuintas
Valeu, mas o pipino é outro.

ColPos retorna correto.
A navegação é que está falhando.
Descobri testando o dlgauto, e depois aumentando a quantidade de colunas.

Não sei o que pode estar errado nesse exemplo.

Como pegar coluna do browse

Enviado: 06 Mai 2025 21:10
por JoséQuintas
O exemplo inicialmente tinha 2 colunas.
Haviam anotações no fonte de só poder usar array de uma coluna.
O que vi, parecendo um erro em ColPos, na verdade é que o browse não está mudando de coluna mesmo.

Quando olhei o DLGAUTO, vi o problema de navegação COM DBF.

Foi quando aumentei a quantidade de colunas do array, e vi que acontece geral.
As setas ficam funcionando parecido com um PageDown lateral, ao invés de uma coluna por vez.
Além disso, o clique do mouse não altera a coluna.
Não dava pra perceber isso no browse de só duas colunas.

O Fernando Queiroz mostrou no aplicativo dele e está funcionando.
Por isso acho que tem alguma coisa errada no exemplo.
Só não sei o que poderia ser.

Como pegar coluna do browse

Enviado: 06 Mai 2025 22:04
por JoséQuintas
E também não é nColPos, esse é a posição das colunas visíveis no browse.

Testei igual (*) outro exemplo que funciona mas não foi.
Igual com certeza não é.

Código: Selecionar todos

   //hwg_CREATEARLIST( oBrowse, aBrowseList )

   oBrowse:aArray := aBrowseList
   FOR EACH oCol IN aBrowseList[1]
      FOR EACH nTmp IN { oCol:__EnumIndex() }
         oBrowse:AddColumn( HColumn():New( Ltrim(Str(nTmp, 5)),{|v,o|(v),o:aArray[o:nCurrent,nTmp]},"C",10,0,.F.,DT_CENTER ) )
      NEXT
   NEXT
Sinceramente, não entendo.

Como pegar coluna do browse

Enviado: 06 Mai 2025 22:08
por JoséQuintas

Código: Selecionar todos

/*
 *$Id$
 *
 * HWGUI - Harbour Win32 and Linux (GTK) GUI library
 * testbrw.prg - another browsing sample (array)
 *
 * Copyright 2005 Alexander S.Kresin <alex@kresin.ru>
 * www - http://www.kresin.ru
 */
    * Status:
    *  WinAPI   :  Yes
    *  GTK/Linux:  Yes , see comment above
    *  GTK/Win  :  No

* -------------------------
* Sample crashes on GTK,
* method Add standard not
* working here, so
* the image add as hex value.
*
* -------------------------

* Only Field "Age" is editable.
* HBROWSE class on GTK:
* Obscure behavior on editable field "Age" need to fix !
* The modified value not accepted.

#include "hwgui.ch"

FUNCTION Main()

   LOCAL oMainWindow

   INIT WINDOW oMainWindow MAIN TITLE "Example" ;
     AT 200,0 SIZE 400,150

   * GTK: Submenus required, otherwise only display "Activate"
   MENU OF oMainWindow
    MENU TITLE "&Exit"
      MENUITEM "&Quit" ACTION hwg_EndWindow()
    ENDMENU
    MENU TITLE "&Dialog"
      MENUITEM "&Start Browse" ACTION DlgGet()
    ENDMENU
   ENDMENU

   ACTIVATE WINDOW oMainWindow

RETURN Nil

FUNCTION DlgGet()

   LOCAL oBmp
   LOCAL oModDlg, oBrw1, oBrw2
   LOCAL aSample1 := { {"Alex",17,2500}, {"Victor",42,2200}, {"John",31,1800}, ;
      {"Sebastian",35,2000}, {"Mike",54,2600}, {"Sardanapal",22,2350}, {"Sergey",30,2800}, {"Petr",42,2450} }
   LOCAL aSample2 := { {.t.,"Line 1",10}, {.t.,"Line 2",22}, {.f.,"Line 3",40} }
   LOCAL cValTrue

   INIT DIALOG oModDlg TITLE "About" AT 190,10 SIZE 600,320

   @ 20,16 BROWSE oBrw1 ARRAY SIZE 280,220 ;
        STYLE WS_BORDER + WS_VSCROLL + WS_HSCROLL

   @ 310,16 BROWSE oBrw2 ARRAY SIZE 280,220 ;
        STYLE WS_BORDER + WS_VSCROLL + WS_HSCROLL

   oBrw1:aArray := aSample1
   oBrowse:AddColumn( HColumn():New( "Name",{|v,o|o:aArray[o:nCurrent,1]},"C",12,0,.F.,DT_CENTER ) )
   oBrowse:AddColumn( HColumn():New( "Age",{|v,o|o:aArray[o:nCurrent,2]},"N",6,0,.T.,DT_CENTER,DT_RIGHT ) )
   oBrowse:AddColumn( HColumn():New( "Koef",{|v,o|o:aArray[o:nCurrent,3]},"N",6,0,.F.,DT_CENTER,DT_RIGHT ) )
   oBrowse:aColumns[2]:footing := "Age"
   oBrowse:aColumns[2]:lResizable := .F.

   hwg_CREATEARLIST( oBrw2,aSample2 )
#ifdef __GTK__
* Standard image OBM_CHECK not available on GTK
* Take it from hex value
   cValTrue := hwg_cHex2Bin(true_bmp())
   oBmp     := HBitmap():AddString( "true" , cValTrue )
#else
   oBmp := HBitmap():AddStandard( OBM_CHECK )
#endif
   oBrw2:aColumns[1]:aBitmaps := { { {|l|l}, oBmp } }
   oBrw2:aColumns[2]:length := 6
   oBrw2:aColumns[3]:length := 4
   oBrw2:bKeyDown := {|o,key|BrwKey(o,key)}
   oBrw2:bcolorSel := oBrw2:htbColor := 0xeeeeee
   oBrw2:tcolorSel := 0xff0000

   @ 210,260 OWNERBUTTON ON CLICK {|| hwg_EndDialog()} ;
       SIZE 180,36 FLAT                                ;
       TEXT "Close" COLOR hwg_ColorC2N("0000FF")

   ACTIVATE DIALOG oModDlg

RETURN Nil

STATIC FUNCTION BrwKey( oBrw, key )
   IF key == 32
      oBrw:aArray[ oBrw:nCurrent,1 ] := !oBrw:aArray[ oBrw:nCurrent,1 ]
      oBrw:RefreshLine()
   ENDIF

RETURN .T.

#ifdef __GTK__
FUNCTION true_bmp()

   * Hexdump of true.bmp, needed for GTK
RETURN ;
   "42 4D 36 05 00 00 00 00 00 00 36 04 00 00 28 00 " + ;
   "00 00 0D 00 00 00 10 00 00 00 01 00 08 00 00 00 " + ;
   "00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 01 " + ;
   "00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80 " + ;
   "00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80 " + ;
   "00 00 C0 C0 C0 00 C0 DC C0 00 F0 CA A6 00 00 20 " + ;
   "40 00 00 20 60 00 00 20 80 00 00 20 A0 00 00 20 " + ;
   "C0 00 00 20 E0 00 00 40 00 00 00 40 20 00 00 40 " + ;
   "40 00 00 40 60 00 00 40 80 00 00 40 A0 00 00 40 " + ;
   "C0 00 00 40 E0 00 00 60 00 00 00 60 20 00 00 60 " + ;
   "40 00 00 60 60 00 00 60 80 00 00 60 A0 00 00 60 " + ;
   "C0 00 00 60 E0 00 00 80 00 00 00 80 20 00 00 80 " + ;
   "40 00 00 80 60 00 00 80 80 00 00 80 A0 00 00 80 " + ;
   "C0 00 00 80 E0 00 00 A0 00 00 00 A0 20 00 00 A0 " + ;
   "40 00 00 A0 60 00 00 A0 80 00 00 A0 A0 00 00 A0 " + ;
   "C0 00 00 A0 E0 00 00 C0 00 00 00 C0 20 00 00 C0 " + ;
   "40 00 00 C0 60 00 00 C0 80 00 00 C0 A0 00 00 C0 " + ;
   "C0 00 00 C0 E0 00 00 E0 00 00 00 E0 20 00 00 E0 " + ;
   "40 00 00 E0 60 00 00 E0 80 00 00 E0 A0 00 00 E0 " + ;
   "C0 00 00 E0 E0 00 40 00 00 00 40 00 20 00 40 00 " + ;
   "40 00 40 00 60 00 40 00 80 00 40 00 A0 00 40 00 " + ;
   "C0 00 40 00 E0 00 40 20 00 00 40 20 20 00 40 20 " + ;
   "40 00 40 20 60 00 40 20 80 00 40 20 A0 00 40 20 " + ;
   "C0 00 40 20 E0 00 40 40 00 00 40 40 20 00 40 40 " + ;
   "40 00 40 40 60 00 40 40 80 00 40 40 A0 00 40 40 " + ;
   "C0 00 40 40 E0 00 40 60 00 00 40 60 20 00 40 60 " + ;
   "40 00 40 60 60 00 40 60 80 00 40 60 A0 00 40 60 " + ;
   "C0 00 40 60 E0 00 40 80 00 00 40 80 20 00 40 80 " + ;
   "40 00 40 80 60 00 40 80 80 00 40 80 A0 00 40 80 " + ;
   "C0 00 40 80 E0 00 40 A0 00 00 40 A0 20 00 40 A0 " + ;
   "40 00 40 A0 60 00 40 A0 80 00 40 A0 A0 00 40 A0 " + ;
   "C0 00 40 A0 E0 00 40 C0 00 00 40 C0 20 00 40 C0 " + ;
   "40 00 40 C0 60 00 40 C0 80 00 40 C0 A0 00 40 C0 " + ;
   "C0 00 40 C0 E0 00 40 E0 00 00 40 E0 20 00 40 E0 " + ;
   "40 00 40 E0 60 00 40 E0 80 00 40 E0 A0 00 40 E0 " + ;
   "C0 00 40 E0 E0 00 80 00 00 00 80 00 20 00 80 00 " + ;
   "40 00 80 00 60 00 80 00 80 00 80 00 A0 00 80 00 " + ;
   "C0 00 80 00 E0 00 80 20 00 00 80 20 20 00 80 20 " + ;
   "40 00 80 20 60 00 80 20 80 00 80 20 A0 00 80 20 " + ;
   "C0 00 80 20 E0 00 80 40 00 00 80 40 20 00 80 40 " + ;
   "40 00 80 40 60 00 80 40 80 00 80 40 A0 00 80 40 " + ;
   "C0 00 80 40 E0 00 80 60 00 00 80 60 20 00 80 60 " + ;
   "40 00 80 60 60 00 80 60 80 00 80 60 A0 00 80 60 " + ;
   "C0 00 80 60 E0 00 80 80 00 00 80 80 20 00 80 80 " + ;
   "40 00 80 80 60 00 80 80 80 00 80 80 A0 00 80 80 " + ;
   "C0 00 80 80 E0 00 80 A0 00 00 80 A0 20 00 80 A0 " + ;
   "40 00 80 A0 60 00 80 A0 80 00 80 A0 A0 00 80 A0 " + ;
   "C0 00 80 A0 E0 00 80 C0 00 00 80 C0 20 00 80 C0 " + ;
   "40 00 80 C0 60 00 80 C0 80 00 80 C0 A0 00 80 C0 " + ;
   "C0 00 80 C0 E0 00 80 E0 00 00 80 E0 20 00 80 E0 " + ;
   "40 00 80 E0 60 00 80 E0 80 00 80 E0 A0 00 80 E0 " + ;
   "C0 00 80 E0 E0 00 C0 00 00 00 C0 00 20 00 C0 00 " + ;
   "40 00 C0 00 60 00 C0 00 80 00 C0 00 A0 00 C0 00 " + ;
   "C0 00 C0 00 E0 00 C0 20 00 00 C0 20 20 00 C0 20 " + ;
   "40 00 C0 20 60 00 C0 20 80 00 C0 20 A0 00 C0 20 " + ;
   "C0 00 C0 20 E0 00 C0 40 00 00 C0 40 20 00 C0 40 " + ;
   "40 00 C0 40 60 00 C0 40 80 00 C0 40 A0 00 C0 40 " + ;
   "C0 00 C0 40 E0 00 C0 60 00 00 C0 60 20 00 C0 60 " + ;
   "40 00 C0 60 60 00 C0 60 80 00 C0 60 A0 00 C0 60 " + ;
   "C0 00 C0 60 E0 00 C0 80 00 00 C0 80 20 00 C0 80 " + ;
   "40 00 C0 80 60 00 C0 80 80 00 C0 80 A0 00 C0 80 " + ;
   "C0 00 C0 80 E0 00 C0 A0 00 00 C0 A0 20 00 C0 A0 " + ;
   "40 00 C0 A0 60 00 C0 A0 80 00 C0 A0 A0 00 C0 A0 " + ;
   "C0 00 C0 A0 E0 00 C0 C0 00 00 C0 C0 20 00 C0 C0 " + ;
   "40 00 C0 C0 60 00 C0 C0 80 00 C0 C0 A0 00 F0 FB " + ;
   "FF 00 A4 A0 A0 00 80 80 80 00 00 00 FF 00 00 FF " + ;
   "00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF " + ;
   "00 00 FF FF FF 00 FF FF FF FF FF FF FF FF FF FF " + ;
   "FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF FF " + ;
   "FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF FF " + ;
   "FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF FF " + ;
   "FF FF FF 00 00 00 FF FF FF FF 00 FF FF FF FF FF " + ;
   "FF FF FF 00 00 00 FF FF FF 00 00 00 FF FF FF FF " + ;
   "FF FF FF 00 00 00 FF FF 00 00 00 00 00 FF FF FF " + ;
   "FF FF FF 00 00 00 FF FF 00 00 FF 00 00 00 FF FF " + ;
   "FF FF FF 00 00 00 FF FF 00 FF FF FF 00 00 00 FF " + ;
   "FF FF FF 00 00 00 FF FF FF FF FF FF FF 00 00 FF " + ;
   "FF FF FF 00 00 00 FF FF FF FF FF FF FF FF 00 FF " + ;
   "FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF FF " + ;
   "FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF FF " + ;
   "FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF FF " + ;
   "FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF FF " + ;
   "FF FF FF 00 00 00 FF FF FF FF FF FF FF FF FF FF " + ;
   "FF FF FF 00 00 00 "
#endif

* ========================== EOF of testbrw.prg ==========================
Esse exemplo acima tem 2 browses.
O primeiro funciona correto, o segundo não.

Este é o encrencado

Código: Selecionar todos

/*
 *
 * demobrowsearr.prg
 *
 * $Id$
 *
 * HWGUI - Harbour Win32 GUI and GTK library source code:
 * Sample for HBROWSE class for arrays
 *
 * Copyright 2002 Alexander S.Kresin <alex@kresin.ru>
 * www - http://www.kresin.ru
 * Copyright 2020 Wilfried Brunken, DF7BE
*/

/*
  More samples for ARRAY BROWSE in
  utils\devtools\memdump.prg

  Because the HBROWSE class for arrays have some bugs,
  so this sample demonstrates a suitable working browse function
  for full editing of arrays (mainly without crash's).
  This sample is for an array with one column of type "C", but
  it could be possible to extend it for more columns with other types.
  For editing features you need buttons for adding, editing and
  deleting lines.
  We will fix the bugs as soon as possible.
  The HBROWSE class for DBF's is very stable.

  Sample for read out the edited array:

  @ 360,410 BUTTON oBtn4 CAPTION "OK " SIZE 80,26 ;
    ON CLICK { | | bCancel := .F. , ;
    aBrowseList := oBrowse:aArray , ;
    hwg_EndDialog() }

*/

   * Status:
    *  WinAPI   :  Yes
    *  GTK/Linux:  Yes
    *  GTK/Win  :  Yes

#include "hwgui.ch"
#include "common.ch"
#ifdef __XHARBOUR__
   #include "ttable.ch"
#endif

FUNCTION DemoBrowseArr( lWithDialog, oDlg )

   LOCAL oBrowse , oFont , oBtn1 , oBtn2 , oBtn3 , oBtn4
   LOCAL aBrowseList, aRow, aCol, oCol, nTmp

#ifdef __PLATFORM__WINDOWS
   PREPARE FONT oFont NAME "MS Sans Serif" WIDTH 0 HEIGHT -13
#else
   PREPARE FONT oFont NAME "Sans" WIDTH 0 HEIGHT 12 && vorher 13
#endif

/*
 If the base array has one dimension, you need to convert it
 first into a 2 dimension array
 (and back again for storage after editing)
*/
   aBrowseList := Array(10,10)
   FOR EACH aRow IN aBrowseList
      FOR EACH aCol IN aRow
         aCol := Ltrim( Str( aCol:__EnumIndex() ) ) + "." + Ltrim( Str( aCol:__EnumIndex() ) )
      NEXT
   NEXT

   IF lWithDialog
      INIT DIALOG oDlg ;
         TITLE "demobrowsearr.prg - Browse Array" ;
         AT 0,0 ;
         SIZE 600, 500 ;
         NOEXIT ;
         STYLE WS_DLGFRAME + WS_SYSMENU + DS_CENTER
   ENDIF
/*
  Do not use parameters AUTOEDIT and APPEND, they are buggy.
*/

   ButtonForSample( "demobrowsearr.prg" )

   @ 21, 80 BROWSE oBrowse ;
      ARRAY ;
      ON CLICK { | | BrwArrayEditElem( oBrowse ) };
      STYLE WS_VSCROLL + WS_HSCROLL + WS_BORDER ;
      SIZE 500, 300
      * Pressing ENTER starts editing of element, too

   //hwg_CREATEARLIST( oBrowse, aBrowseList )

   oBrowse:aArray := aBrowseList
   FOR EACH oCol IN aBrowseList[1]
      FOR EACH nTmp IN { oCol:__EnumIndex() }
         oBrowse:AddColumn( HColumn():New( Ltrim(Str(nTmp, 5)),{|v,o|(v),o:aArray[o:nCurrent,nTmp]},"C",10,0,.F.,DT_CENTER ) )
      NEXT
      //oCol:Heading := Ltrim( Str( oCol:__EnumIndex() ) )
      //oCol:Length  := 20
   NEXT

   oBrowse:bcolorSel := hwg_ColorC2N( "800080" )
   * FONT setting is mandatory, otherwise crashes with "Not exported method PROPS2ARR"
   oBrowse:ofont               := oFont && HFont():Add( 'Arial',0,-12 )

   @ 10,  410 BUTTON oBtn1 ;
      CAPTION "Edit"    ;
      SIZE 60,25  ;
      ON CLICK { || BrwArrayEditElem( oBrowse ) } ;
      TOOLTIP "Click or ENTER: Edit element under cursor"

   @ 70,  410 BUTTON oBtn2 ;
      CAPTION "Add"     ;
      SIZE 60,25  ;
      ON CLICK { || BrwArrayAddElem( oBrowse ) } ;
      TOOLTIP "Add element"

   @ 140, 410 BUTTON oBtn3 ;
      CAPTION "Delete"  ;
      SIZE 60,25  ;
      ON CLICK { || BrwArrayDelElem( oBrowse ) } ;
      TOOLTIP "Delete element under cursor"

   @ 260,410 BUTTON oBtn4 ;
      CAPTION "OK " ;
      SIZE 80,26 ;
      ON CLICK { || hwg_EndDialog() }

   IF lWithDialog
      oDlg:Activate()
   ENDIF

RETURN .T.

STATIC FUNCTION BrwArrayEditElem( oBrowse )

   * Edit the Element in the array
   LOCAL nlaeng, cGetfield, cOldget, aRow

   hwg_Msginfo( ;
      "RowPos: " + hb_ValToExp( oBrowse:RowPos ) + hb_Eol() + ;
      "ColPos: " + hb_ValToExp( oBrowse:ColPos ) )

   nlaeng := oBrowse:acolumns[ oBrowse:ColPos ]:length
   * Should be an element with one dimension and one element
   aRow := oBrowse:aArray[ oBrowse:nCurrent ]
   cGetField := Padr( aRow[ oBrowse:ColPos ], nlaeng )

   cOldget := cGetfield

   * Call edit window (GET)
   cGetfield := BrwArrayGetElem( oBrowse, cGetfield )
   * Write back, if modified or not cancelled
   IF ( .NOT. EMPTY( cGetfield ) ) .AND. ( cOldget != cGetfield )
      oBrowse:aArray[ oBrowse:nCurrent, oBrowse:ColPos ] := { cGetfield }
      oBrowse:lChanged := .T.
      oBrowse:Refresh()
   ENDIF

RETURN Nil

STATIC FUNCTION BrwArrayAddElem( oBrowse )

   * Add array element

   LOCAL oTotReg , i , nlaeng , cGetfield

   oTotReg   := {}
   nlaeng    := oBrowse:acolumns[1]:length
   cGetfield := SPACE(nlaeng)

   IF (oBrowse:aArray == NIL) .OR. EMPTY(oBrowse:aArray)
      //   ( LEN(oBrowse:aArray) == 1 .AND. oBrowse:aArray[1] == "" )
      oBrowse:aArray := {}
   ENDIF

   * Copy browse array and get number of elements
   FOR i := 1 TO LEN( oBrowse:aArray )
      AADD( oTotReg, oBrowse:aArray[ i ] )
   NEXT
   * Edit new element
   cGetfield := BrwArrayGetElem( oBrowse, cGetfield )
   IF .NOT. EMPTY( cGetfield )
      * Add new item
      AADD( oTotReg,  { cGetfield }  )
      oBrowse:aArray := oTotReg
      oBrowse:Refresh()
   ENDIF

RETURN Nil

STATIC FUNCTION BrwArrayDelElem( obrw )

   * Delete array element

   IF ( obrw:aArray == Nil ) .OR. Empty( obrw:aArray )
      * Nothing to delete
      RETURN NIL
   ENDIF
   Adel( obrw:aArray, obrw:nCurrent )
   ASize( obrw:aArray, Len( obrw:aArray ) - 1 )
   obrw:lChanged := .T.
   obrw:Refresh()

RETURN Nil

STATIC FUNCTION BrwArrayGetElem( oBrowse, cgetf )

   * Edit window for element
   * Cancel: return empty string

   LOCAL clgetf  , lcancel , oDlg
   LOCAL oLabel1, oLabel2, oGet1, oButton1, oButton2

   lcancel := .F.

   clgetf := cgetf

   INIT DIALOG oDlg ;
      TITLE "Edit array element" ;
      AT 437,74 ;
      SIZE 635,220 ;
      CLIPPER STYLE WS_POPUP + WS_VISIBLE + WS_CAPTION + WS_SYSMENU + WS_SIZEBOX + DS_CENTER


   @ 38,12 SAY oLabel1 ;
      CAPTION "Record number:"  ;
      SIZE 136,22

   @ 188,12 SAY oLabel2 ;
      CAPTION Alltrim( Str( oBrowse:nCurrent ) )  ;
      SIZE 155,22

   @ 38,46 GET oGet1 ;
      VAR clgetf ;
      SIZE 534,24 ;
      STYLE WS_BORDER

   @ 38,100 BUTTON oButton1 ;
      CAPTION "Save"   ;
      SIZE 80,32 ;
      STYLE WS_TABSTOP + BS_FLAT ;
      ON CLICK { | | oDlg:Close() } ;
      TOOLTIP "Save changes and return to array browse list"

   @ 169,100 BUTTON oButton2 ;
      CAPTION "Cancel"   ;
      SIZE 80,32 ;
      STYLE WS_TABSTOP + BS_FLAT ;
      ON CLICK { | | lcancel := .T. , oDlg:Close() } ;
      TOOLTIP "Return to array browse list without saving modifications"

   ACTIVATE DIALOG oDlg CENTER

   * Cancelled ?
   IF lcancel
      clgetf := ""
   ENDIF

RETURN clgetf

* ============================ EOF of demobrowsearr.prg ==============================

O comportamento é o mesmo, desde antes de mexer em alguma coisa.

Como pegar coluna do browse

Enviado: 07 Mai 2025 01:27
por JoséQuintas
Resumindo: ColPos não é, Colpos se refere às colunas na tela somente. o nCol dá erro.
Mas isso ainda não importa, porque está com problema de navegação.

NA TELA, olhando a tela, parado na primeira coluna, seta pro lado pula pra coluna 4 ou 5, para o que seria a primeira coluna depois de todas que estão na tela.
Igual acontece com a linha, quando apertamos pagedown, mas com as colunas.
Com as duas colunas do exemplo original, a seta não fazia nada

Por enquanto isso é prioridade, antes de encontrar o raio da coluna.

Curiosamente tem esse exemplo que mostrei, com 2 browses, 1 funciona outro não.
Vi como diferença o hwg_CreateArList(), foi o que testei alterar e não resolveu.

Por enquanto sem idéias, a não ser tentar isolar o que funciona, e alterar a partir dali.
Posso estar meio ceguinho e deixando passar alguma coisa.

Só depois volto no problema de pegar coluna.

Como pegar coluna do browse

Enviado: 07 Mai 2025 07:09
por JoséQuintas
brrowsebrowse.png
Está aí pra quem quiser.
4 browses
A ordem é primeiro o de cima e depois o de baixo.
Pra ligarem a imagem aos nomes browse1(), browse3(), browse2(), browse4()
1 3
2 4

Apertei seta pra direita
Browse1() e browse3() ok, estão na coluna 2.
Browse2() não saiu da coluna 1
Browse4() pulou direto pra coluna 4

Código: Selecionar todos

#include "hwgui.ch"

FUNCTION Test

   LOCAL oDlg

   INIT DIALOG oDlg ;
      TITLE "About" ;
      AT 0, 0 ;
      SIZE 1024, 768

   Browse1()
   Browse2()
   Browse3()
   Browse4()

   ACTIVATE DIALOG oDlg CENTER

   RETURN Nil

FUNCTION Browse1()

   LOCAL oBrw1
   LOCAL aSample1 := { {"Alex",17,2500}, {"Victor",42,2200}, {"John",31,1800}, ;
      {"Sebastian",35,2000}, {"Mike",54,2600}, {"Sardanapal",22,2350}, {"Sergey",30,2800}, {"Petr",42,2450} }

   @ 20, 20 BROWSE oBrw1 ;
      ARRAY ;
      SIZE 280, 300 ;
      STYLE WS_BORDER + WS_VSCROLL + WS_HSCROLL ;
      ON CLICK { || BrowseClick( oBrw1 ) }

   oBrw1:aArray := aSample1
   oBrw1:AddColumn( HColumn():New( "Name", {|v,o| (v), o:aArray[o:nCurrent,1]},"C",12,0,.F.,DT_CENTER ) )
   oBrw1:AddColumn( HColumn():New( "Age",  {|v,o| (v), o:aArray[o:nCurrent,2]},"N",6,0,.T.,DT_CENTER,DT_RIGHT ) )
   oBrw1:AddColumn( HColumn():New( "Koef", {|v,o| (v), o:aArray[o:nCurrent,3]},"N",6,0,.F.,DT_CENTER,DT_RIGHT ) )
   oBrw1:aColumns[2]:footing := "Age"
   oBrw1:aColumns[2]:lResizable := .F.

   RETURN Nil

FUNCTION Browse2()

   LOCAL oBrw2
   LOCAL aSample2 := { {"1","Line 1",10}, {"1","Line 2",22}, {"0","Line 3",40} }

   @ 20, 350 BROWSE oBrw2 ;
      ARRAY ;
      SIZE 280, 300 ;
      STYLE WS_BORDER + WS_VSCROLL + WS_HSCROLL ;
      ON CLICK { || BrowseClick( oBrw2 ) }

   hwg_CREATEARLIST( oBrw2,aSample2 )

   oBrw2:aColumns[2]:length := 6
   oBrw2:aColumns[3]:length := 4
   //oBrw2:bKeyDown := { |o,key| BrwKey( o, key ) }
   //oBrw2:bcolorSel := oBrw2:htbColor := 0xeeeeee
   //oBrw2:tcolorSel := 0xff0000

   RETURN Nil

FUNCTION Browse3()

   LOCAL oBrw3, aRow, aCol
   LOCAL aList := Array(10,10)

   FOR EACH aRow IN aList
      FOR EACH aCol IN aRow
         aCol := Str( aRow:__EnumIndex(), 3 ) + "." + Str( aCol:__EnumIndex(), 3 )
      NEXT
   NEXT

   @ 500, 20 BROWSE oBrw3 ;
      ARRAY ;
      SIZE 280, 300 ;
      STYLE WS_BORDER + WS_VSCROLL + WS_HSCROLL ;
      ON CLICK { || BrowseClick( oBrw3 ) }

   oBrw3:aArray := aList
   oBrw3:AddColumn( HColumn():New( "Name", {|v,o| (v), o:aArray[o:nCurrent,1]},"C",12,0,.F.,DT_CENTER ) )
   oBrw3:AddColumn( HColumn():New( "Age",  {|v,o| (v), o:aArray[o:nCurrent,2]},"C",10,0,.T.,DT_CENTER,DT_RIGHT ) )
   oBrw3:AddColumn( HColumn():New( "Koef", {|v,o| (v), o:aArray[o:nCurrent,3]},"C",10,0,.F.,DT_CENTER,DT_RIGHT ) )
   oBrw3:AddColumn( HColumn():New( "Name", {|v,o| (v), o:aArray[o:nCurrent,4]},"C",12,0,.F.,DT_CENTER ) )
   oBrw3:AddColumn( HColumn():New( "Age",  {|v,o| (v), o:aArray[o:nCurrent,5]},"C",10,0,.T.,DT_CENTER,DT_RIGHT ) )
   oBrw3:AddColumn( HColumn():New( "Koef", {|v,o| (v), o:aArray[o:nCurrent,6]},"C",10,0,.F.,DT_CENTER,DT_RIGHT ) )
   oBrw3:AddColumn( HColumn():New( "Name", {|v,o| (v), o:aArray[o:nCurrent,7]},"C",12,0,.F.,DT_CENTER ) )
   oBrw3:AddColumn( HColumn():New( "Age",  {|v,o| (v), o:aArray[o:nCurrent,8]},"C",10,0,.T.,DT_CENTER,DT_RIGHT ) )
   oBrw3:AddColumn( HColumn():New( "Koef", {|v,o| (v), o:aArray[o:nCurrent,9]},"C",10,0,.F.,DT_CENTER,DT_RIGHT ) )
   oBrw3:AddColumn( HColumn():New( "Name", {|v,o| (v), o:aArray[o:nCurrent,10]},"C",12,0,.F.,DT_CENTER ) )
   oBrw3:aColumns[2]:lResizable := .T.

   RETURN Nil

FUNCTION Browse4()

   LOCAL oBrw4, aRow, aCol
   LOCAL aList := Array(10,10)

   FOR EACH aRow IN aList
      FOR EACH aCol IN aRow
         aCol := Str( aRow:__EnumIndex(), 3 ) + "." + Str( aCol:__EnumIndex(), 3 )
      NEXT
   NEXT

   @ 500, 350 BROWSE oBrw4 ;
      ARRAY ;
      SIZE 280, 300 ;
      STYLE WS_BORDER + WS_VSCROLL + WS_HSCROLL ;
      ON CLICK { || BrowseClick( oBrw4 ) }

   hwg_CREATEARLIST( oBrw4, aList )

   oBrw4:aColumns[1]:length := 10
   oBrw4:aColumns[2]:length := 10
   oBrw4:aColumns[3]:length := 10
   oBrw4:aColumns[4]:length := 10
   oBrw4:aColumns[5]:length := 10
   oBrw4:aColumns[6]:length := 10
   oBrw4:aColumns[7]:length := 10
   oBrw4:aColumns[8]:length := 10
   oBrw4:aColumns[9]:length := 10
   oBrw4:aColumns[10]:length := 10
   //oBrw4:bKeyDown := { |o,key| BrwKey( o, key ) }
   //oBrw4:bcolorSel := oBrw2:htbColor := 0xeeeeee
   //oBrw4:tcolorSel := 0xff0000

   RETURN Nil

FUNCTION BrowseClick( oBrowse )

   hwg_MsgInfo( ;
      hb_ValToExp( oBrowse:RowPos ) + hb_Eol() + ;
      hb_ValToExp( oBrowse:ColPos ) )

   RETURN Nil
Alguém já tinha percebido isso e consegue explicar ?

Como pegar coluna do browse

Enviado: 07 Mai 2025 08:06
por Itamar M. Lins Jr.
Olá!
Elementar meu caro!

LOCAL oBrw4
...
ON CLICK { |oBrw4,nColpos| BrowseClick( oBrw4,nColPos ) }


Precisa passar var LOCAL, nos parametros de entrada "||" do CODEBLOCK! Aprendi isso, futucando aqui e ali...

Saudações,
Itamar M. Lins Jr.

Como pegar coluna do browse

Enviado: 07 Mai 2025 10:50
por JoséQuintas
Deu certo.

O outro problema, ainda não entendi muito bem, porque cada hora parece uma coisa.
No momento parece Editable := .T.