FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Listbox vs. XBrowse
Posts: 610
Joined: Wed Oct 19, 2005 08:20 PM
Listbox vs. XBrowse
Posted: Mon Jun 03, 2013 06:41 PM
Por razones obvias hace tiempo que sustituí casi todos mis Listbox por Xbrowse. Sin embargo hay un apartado que me está costando y que no logro terminar.
Se trata de "las listas deslizantes sincronizadas", es decir varios listbox en un diálogo que se van sincronizando según índices y scopes asociados.
Con listbox funciona perfecto pero con xbrowse el comportamiento es totalmente anómalo. He construído un ejemplo para que se vea con claridad.

Tengo que añadir que, aunque los controles utilizado en el diálogo son TWBrowse, también está probado con TXBrowse y el efecto es el mismo.

Cualquier sugerencia es bienvenida. Gracias.

Pego aquí el prg:
Code (fw): Select all Collapse
#include "FiveWin.ch"
#include "Ord.ch"
#include "xbrowse.ch"

static oWnd

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

function Main()

   CreaFicheros()
   IndexaFicheros()
   AbreFicheros()

   DEFINE WINDOW oWnd FROM 1, 5 TO 20, 70 ;
      MENU BuildMenu()

   //
   ACTIVATE WINDOW oWnd

return nil

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

function BuildMenu()

   local oMenu
   local oFirst, oSecond
   MENU oMenu
      MENUITEM "Prueba browse"
      MENU
         MENUITEM oFirst PROMPT "ListBox" ;
            ACTION PruebaBrowse("L")

         MENUITEM oSecond PROMPT "XBrowse";
            ACTION PruebaBrowse("X")

      ENDMENU
   ENDMENU
return oMenu

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

******************************
static function CreaFicheros()
******************************
Local aDbf

IF !FILE("PADRE.DBF")
   //
   aDbf := {}
   AADD(aDbf,{"Clave","C",1,0})
   AADD(aDbf,{"Nombre","C",40,0})
   DBCREATE("PADRE",aDbf)
   USE PADRE
   //
   PADRE->(DbAppend())
   REPLACE PADRE->Clave  WITH "1"
   REPLACE PADRE->Nombre WITH "PADRE 1"
   //
   PADRE->(DbAppend())
   REPLACE PADRE->Clave  WITH "2"
   REPLACE PADRE->Nombre WITH "PADRE 2"
   //
   PADRE->(DbAppend())
   REPLACE PADRE->Clave  WITH "3"
   REPLACE PADRE->Nombre WITH "PADRE 3"
   //
   PADRE->(DbAppend())
   REPLACE PADRE->Clave  WITH "4"
   REPLACE PADRE->Nombre WITH "PADRE 4"
   //
   USE
   //
ENDIF
//
IF !FILE("HIJO.DBF")
   //
   aDbf := {}
   AADD(aDbf,{"ClaveP","C",1,0})
   AADD(aDbf,{"Clave","C",1,0})
   AADD(aDbf,{"Nombre","C",40,0})
   DBCREATE("HIJO",aDbf)
   USE HIJO
   //
   HIJO->(DbAppend())
   REPLACE HIJO->ClaveP  WITH "1"
   REPLACE HIJO->Clave   WITH "1"
   REPLACE HIJO->Nombre WITH "HIJO 1 DE PADRE 1"
   //
   HIJO->(DbAppend())
   REPLACE HIJO->ClaveP  WITH "1"
   REPLACE HIJO->Clave  WITH "2"
   REPLACE HIJO->Nombre WITH "HIJO 2 DE PADRE 1"
   //
   HIJO->(DbAppend())
   REPLACE HIJO->ClaveP  WITH "1"
   REPLACE HIJO->Clave  WITH "3"
   REPLACE HIJO->Nombre WITH "HIJO 3 DE PADRE 1"
   //
   HIJO->(DbAppend())
   REPLACE HIJO->ClaveP  WITH "2"
   REPLACE HIJO->Clave   WITH "1"
   REPLACE HIJO->Nombre WITH "HIJO 1 DE PADRE 2"
   //
   HIJO->(DbAppend())
   REPLACE HIJO->ClaveP  WITH "2"
   REPLACE HIJO->Clave  WITH "2"
   REPLACE HIJO->Nombre WITH "HIJO 2 DE PADRE 2"
   //
   HIJO->(DbAppend())
   REPLACE HIJO->ClaveP  WITH "3"
   REPLACE HIJO->Clave   WITH "1"
   REPLACE HIJO->Nombre WITH "HIJO 1 DE PADRE 3"
   //
   HIJO->(DbAppend())
   REPLACE HIJO->ClaveP  WITH "3"
   REPLACE HIJO->Clave  WITH "2"
   REPLACE HIJO->Nombre WITH "HIJO 2 DE PADRE 3"
   //
   HIJO->(DbAppend())
   REPLACE HIJO->ClaveP  WITH "4"
   REPLACE HIJO->Clave   WITH "1"
   REPLACE HIJO->Nombre WITH "HIJO 1 DE PADRE 4"
   //
   USE
   //
ENDIF
//
IF !FILE("NIETO.DBF")
   //
   aDbf := {}
   AADD(aDbf,{"ClaveP","C",1,0})
   AADD(aDbf,{"ClaveH","C",1,0})
   AADD(aDbf,{"Clave","C",1,0})
   AADD(aDbf,{"Nombre","C",40,0})
   DBCREATE("NIETO",aDbf)
   USE NIETO
   //
   NIETO->(DbAppend())
   REPLACE NIETO->ClaveP  WITH "1"
   REPLACE NIETO->ClaveH  WITH "1"
   REPLACE NIETO->Clave   WITH "1"
   REPLACE NIETO->Nombre WITH "NIETO 1 DE HIJO 1 DE PADRE 1"
   //
   NIETO->(DbAppend())
   REPLACE NIETO->ClaveP  WITH "1"
   REPLACE NIETO->ClaveH  WITH "1"
   REPLACE NIETO->Clave  WITH "2"
   REPLACE NIETO->Nombre WITH "NIETO 2 DE HIJO 1 DE PADRE 1"
   //
   NIETO->(DbAppend())
   REPLACE NIETO->ClaveP  WITH "1"
   REPLACE NIETO->ClaveH  WITH "1"
   REPLACE NIETO->Clave  WITH "3"
   REPLACE NIETO->Nombre WITH "NIETO 3 DE HIJO 1 DE PADRE 1"
   //
   NIETO->(DbAppend())
   REPLACE NIETO->ClaveP  WITH "2"
   REPLACE NIETO->ClaveH  WITH "2"
   REPLACE NIETO->Clave   WITH "1"
   REPLACE NIETO->Nombre WITH "NIETO 1 DE HIJO 2 DE PADRE 2"
   //
   NIETO->(DbAppend())
   REPLACE NIETO->ClaveP  WITH "2"
   REPLACE NIETO->ClaveH  WITH "2"
   REPLACE NIETO->Clave  WITH "2"
   REPLACE NIETO->Nombre WITH "NIETO 2 DE HIJO 2 DE PADRE 2"
   //
   NIETO->(DbAppend())
   REPLACE NIETO->ClaveP  WITH "1"
   REPLACE NIETO->ClaveH  WITH "2"
   REPLACE NIETO->Clave  WITH "1"
   REPLACE NIETO->Nombre WITH "NIETO 1 DE HIJO 2 DE PADRE 1"
   //
   NIETO->(DbAppend())
   REPLACE NIETO->ClaveP  WITH "1"
   REPLACE NIETO->ClaveH  WITH "2"
   REPLACE NIETO->Clave  WITH "2"
   REPLACE NIETO->Nombre WITH "NIETO 2 DE HIJO 2 DE PADRE 1"
   //
   NIETO->(DbAppend())
   REPLACE NIETO->ClaveP  WITH "2"
   REPLACE NIETO->ClaveH  WITH "1"
   REPLACE NIETO->Clave  WITH "1"
   REPLACE NIETO->Nombre WITH "NIETO 1 DE HIJO 1 DE PADRE 2"
   //
   NIETO->(DbAppend())
   REPLACE NIETO->ClaveP  WITH "2"
   REPLACE NIETO->ClaveH  WITH "1"
   REPLACE NIETO->Clave  WITH "2"
   REPLACE NIETO->Nombre WITH "NIETO 2 DE HIJO 1 DE PADRE 2"
   //
   USE
   //
ENDIF
//

return nil

*********************************
static function IndexaFicheros()
********************************

IF !FILE("HIJO.CDX")
   USE HIJO
   INDEX ON HIJO->ClaveP+HIJO->Clave TO HIJO
   USE
ENDIF
//
IF !FILE("NIETO.CDX")
   USE NIETO
   INDEX ON NIETO->ClaveP+NIETO->ClaveH+NIETO->Clave TO NIETO
   USE
ENDIF
//
return nil

*********************************
static function AbreFicheros()
********************************
USE HIJO  INDEX HIJO  NEW
USE NIETO INDEX NIETO NEW
USE PADRE NEW
return nil

//
*********************************************
static function PruebaBrowse(cTipo)
*********************************************
Local oDlg
Local aCols1 := {}
Local aCols2 := {}
Local aCols3 := {}
Local oBrwPadre
Local oBrwHijo
Local oBrwNieto
//
DEFINE DIALOG oDlg RESOURCE "GENERAL"
//
////////////////////////////////////////////////////
/////////////////// BROWSE DE PADRE       //////////
////////////////////////////////////////////////////
//
IF cTipo = "L"
   REDEFINE LISTBOX oBrwPadre ;
         FIELDS PADRE->Clave+" ",;
         +PADRE->Nombre;
         FIELDSIZES 32,276,16;
         HEADERS "Clave"," Nombre ";
         ID 100;
         OF oDlg
ELSE
   REDEFINE xBrowse oBrwPadre ID 100 OF oDlg

   oBrwPadre:nMarqueeStyle       := MARQSTYLE_HIGHLROW
   oBrwPadre:nColDividerStyle    := LINESTYLE_BLACK
   oBrwPadre:lColDividerComplete := .t.
   oBrwPadre:nHeaderLines      := 1
   oBrwPadre:nDataLines        := 1
   //
   oCol := oBrwPadre:AddCol()
   oCol:bStrData  := { || PADRE->Clave}
   oCol:cHeader   := "Clave"
   AADD(aCols1,1)
   //
   oCol := oBrwPadre:AddCol()
   oCol:bStrData  := { || PADRE->Nombre}
   oCol:cHeader   := "Nombre"
   AADD(aCols1,2)
   //
ENDIF
//
oBrwPadre:bChange:= {|| (Actualiza1(oBrwHijo),Actualiza2(oBrwNieto))}

////////////////////////////////////////////
/////////////////// BROWSE DE HIJO  ////////
////////////////////////////////////////////
//
DbSelectArea("HIJO")
//
IF cTipo = "L"
   REDEFINE LISTBOX oBrwHijo ;
         FIELDS Hijo->Clave+" ",;
         +Hijo->Nombre;
         FIELDSIZES 32,276,16;
         HEADERS "Clave"," Nombre ";
         ID 200;
         OF oDlg
ELSE
   REDEFINE xBrowse oBrwHijo ID 200 OF oDlg

   oBrwHijo:nMarqueeStyle       := MARQSTYLE_HIGHLROW
   oBrwHijo:nColDividerStyle    := LINESTYLE_BLACK
   oBrwHijo:lColDividerComplete := .t.
   oBrwHijo:nHeaderLines      := 1
   oBrwHijo:nDataLines        := 1
   //
   oCol := oBrwHijo:AddCol()
   oCol:bStrData  := { || Hijo->Clave}
   oCol:cHeader   := "Clave"
   AADD(aCols2,1)
   //
   oCol := oBrwHijo:AddCol()
   oCol:bStrData  := { || Hijo->Nombre}
   oCol:cHeader   := "Nombre"
   AADD(aCols2,2)
   //
ENDIF
//
oBrwHijo:bChange:= {|| Actualiza2(oBrwNieto)}

//
////////////////////////////////////////////////
/////////////////// BROWSE DE NIETO/////////////
////////////////////////////////////////////////
//
DbSelectArea("NIETO")
//
IF cTipo = "L"
   REDEFINE LISTBOX oBrwNieto ;
         FIELDS Nieto->Clave+" ",;
         +Nieto->Nombre;
         FIELDSIZES 32,276,16;
         HEADERS "Clave"," Nombre ";
         ID 300;
         OF oDlg
ELSE
   REDEFINE xBrowse oBrwNieto ID 300 OF oDlg

   oBrwNieto:nMarqueeStyle       := MARQSTYLE_HIGHLROW
   oBrwNieto:nColDividerStyle    := LINESTYLE_BLACK
   oBrwNieto:lColDividerComplete := .t.
   oBrwNieto:nHeaderLines      := 1
   oBrwNieto:nDataLines        := 1
   //
   oCol := oBrwNieto:AddCol()
   oCol:bStrData  := { || Nieto->Clave}
   oCol:cHeader   := "Clave"
   AADD(aCols3,1)
   //
   oCol := oBrwNieto:AddCol()
   oCol:bStrData  := { || Nieto->Nombre}
   oCol:cHeader   := "Nombre"
   AADD(aCols3,2)
   //
ENDIF
//
DbSelectArea("PADRE")
//
ACTIVATE DIALOG oDlg CENTER // ON  INIT ( Actualiza1(oBrwHijo), Actualiza2(oBrwNieto) )
//
//
return nil

************************************
STATIC FUNCTION Actualiza1(oBrwHijo)
************************************
//
HIJO->(ordscope(TOPSCOPE, PADRE->Clave))
HIJO->(ordscope(BOTTOMSCOPE, PADRE->Clave))
HIJO->(DbGoTop())
oBrwHijo:GoTop()
oBrwHijo:refresh()
//
return nil

*************************************
STATIC FUNCTION Actualiza2(oBrwNieto)
*************************************
//
NIETO->(ordscope(TOPSCOPE, PADRE->Clave+HIJO->Clave))
NIETO->(ordscope(BOTTOMSCOPE, PADRE->Clave+HIJO->Clave))
NIETO->(DbGoTop())
oBrwNieto:GoTop()
oBrwNieto:refresh()
//
return nil


Y aquí el .rc
Code (fw): Select all Collapse
// RESOURCE SCRIPT generated by "Pelles C for Windows, version 5.00".

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>

LANGUAGE LANG_SPANISH,SUBLANG_SPANISH_MODERN

GENERAL DIALOGEX FIXED IMPURE 6, 18, 244, 252
STYLE WS_POPUP|DS_MODALFRAME|DS_3DLOOK|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_VISIBLE
FONT 10, "MS Sans Serif", 0, 0, 1
{
  CONTROL "", 100, "TWBrowse", WS_TABSTOP|0x00b00000, 12, 10, 220, 72
  CONTROL "", 200, "TWBrowse", WS_TABSTOP|0x00b00000, 12, 86, 220, 72
  CONTROL "", 300, "TWBrowse", WS_TABSTOP|0x00b00000, 12, 164, 220, 72
}
Un saludo,

Manuel



xH 1.2.3, FWH 23.07 32 bits, BC++ 7.4, xVerce CW 1.0, PellesC
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Listbox vs. XBrowse
Posted: Tue Jun 04, 2013 12:41 AM
Manuel.
Te digo, Google está reconociendo el sitio como sospechoso (mal intencionado).
Le hice unos cuantos ajustes. Por la definicion de Twbrowse en el recurso, tienes que ejecutar primero el ListBox, luego el XBrowse.
Code (fw): Select all Collapse
#include "FiveWin.ch"
#include "Ord.ch"
#include "xbrowse.ch"

static oWnd

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

function Main()

   CreaFicheros()
   IndexaFicheros()
   AbreFicheros()

   DEFINE WINDOW oWnd FROM 1, 5 TO 20, 70 ;
      MENU BuildMenu()

   //
   ACTIVATE WINDOW oWnd

return nil

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

function BuildMenu()

   local oMenu
   local oFirst, oSecond
   MENU oMenu
      MENUITEM "Prueba browse"
      MENU
         MENUITEM oFirst PROMPT "ListBox" ;
            ACTION PruebaBrowse("L")

         MENUITEM oSecond PROMPT "XBrowse";
            ACTION PruebaBrowse("X")

      ENDMENU
   ENDMENU
return oMenu

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

******************************
static function CreaFicheros()
******************************
Local aDbf

IF !FILE("PADRE.DBF")
   //
   aDbf := {}
   AADD(aDbf,{"Clave","C",1,0})
   AADD(aDbf,{"Nombre","C",40,0})
   DBCREATE("PADRE",aDbf)
   USE PADRE
   //
   PADRE->(DbAppend())
   REPLACE PADRE->Clave  WITH "1"
   REPLACE PADRE->Nombre WITH "PADRE 1"
   //
   PADRE->(DbAppend())
   REPLACE PADRE->Clave  WITH "2"
   REPLACE PADRE->Nombre WITH "PADRE 2"
   //
   PADRE->(DbAppend())
   REPLACE PADRE->Clave  WITH "3"
   REPLACE PADRE->Nombre WITH "PADRE 3"
   //
   PADRE->(DbAppend())
   REPLACE PADRE->Clave  WITH "4"
   REPLACE PADRE->Nombre WITH "PADRE 4"
   //
   USE
   //
ENDIF
//
IF !FILE("HIJO.DBF")
   //
   aDbf := {}
   AADD(aDbf,{"ClaveP","C",1,0})
   AADD(aDbf,{"Clave","C",1,0})
   AADD(aDbf,{"Nombre","C",40,0})
   DBCREATE("HIJO",aDbf)
   USE HIJO
   //
   HIJO->(DbAppend())
   REPLACE HIJO->ClaveP  WITH "1"
   REPLACE HIJO->Clave   WITH "1"
   REPLACE HIJO->Nombre WITH "HIJO 1 DE PADRE 1"
   //
   HIJO->(DbAppend())
   REPLACE HIJO->ClaveP  WITH "1"
   REPLACE HIJO->Clave  WITH "2"
   REPLACE HIJO->Nombre WITH "HIJO 2 DE PADRE 1"
   //
   HIJO->(DbAppend())
   REPLACE HIJO->ClaveP  WITH "1"
   REPLACE HIJO->Clave  WITH "3"
   REPLACE HIJO->Nombre WITH "HIJO 3 DE PADRE 1"
   //
   HIJO->(DbAppend())
   REPLACE HIJO->ClaveP  WITH "2"
   REPLACE HIJO->Clave   WITH "1"
   REPLACE HIJO->Nombre WITH "HIJO 1 DE PADRE 2"
   //
   HIJO->(DbAppend())
   REPLACE HIJO->ClaveP  WITH "2"
   REPLACE HIJO->Clave  WITH "2"
   REPLACE HIJO->Nombre WITH "HIJO 2 DE PADRE 2"
   //
   HIJO->(DbAppend())
   REPLACE HIJO->ClaveP  WITH "3"
   REPLACE HIJO->Clave   WITH "1"
   REPLACE HIJO->Nombre WITH "HIJO 1 DE PADRE 3"
   //
   HIJO->(DbAppend())
   REPLACE HIJO->ClaveP  WITH "3"
   REPLACE HIJO->Clave  WITH "2"
   REPLACE HIJO->Nombre WITH "HIJO 2 DE PADRE 3"
   //
   HIJO->(DbAppend())
   REPLACE HIJO->ClaveP  WITH "4"
   REPLACE HIJO->Clave   WITH "1"
   REPLACE HIJO->Nombre WITH "HIJO 1 DE PADRE 4"
   //
   USE
   //
ENDIF
//
IF !FILE("NIETO.DBF")
   //
   aDbf := {}
   AADD(aDbf,{"ClaveP","C",1,0})
   AADD(aDbf,{"ClaveH","C",1,0})
   AADD(aDbf,{"Clave","C",1,0})
   AADD(aDbf,{"Nombre","C",40,0})
   DBCREATE("NIETO",aDbf)
   USE NIETO
   //
   NIETO->(DbAppend())
   REPLACE NIETO->ClaveP  WITH "1"
   REPLACE NIETO->ClaveH  WITH "1"
   REPLACE NIETO->Clave   WITH "1"
   REPLACE NIETO->Nombre WITH "NIETO 1 DE HIJO 1 DE PADRE 1"
   //
   NIETO->(DbAppend())
   REPLACE NIETO->ClaveP  WITH "1"
   REPLACE NIETO->ClaveH  WITH "1"
   REPLACE NIETO->Clave  WITH "2"
   REPLACE NIETO->Nombre WITH "NIETO 2 DE HIJO 1 DE PADRE 1"
   //
   NIETO->(DbAppend())
   REPLACE NIETO->ClaveP  WITH "1"
   REPLACE NIETO->ClaveH  WITH "1"
   REPLACE NIETO->Clave  WITH "3"
   REPLACE NIETO->Nombre WITH "NIETO 3 DE HIJO 1 DE PADRE 1"
   //
   NIETO->(DbAppend())
   REPLACE NIETO->ClaveP  WITH "2"
   REPLACE NIETO->ClaveH  WITH "2"
   REPLACE NIETO->Clave   WITH "1"
   REPLACE NIETO->Nombre WITH "NIETO 1 DE HIJO 2 DE PADRE 2"
   //
   NIETO->(DbAppend())
   REPLACE NIETO->ClaveP  WITH "2"
   REPLACE NIETO->ClaveH  WITH "2"
   REPLACE NIETO->Clave  WITH "2"
   REPLACE NIETO->Nombre WITH "NIETO 2 DE HIJO 2 DE PADRE 2"
   //
   NIETO->(DbAppend())
   REPLACE NIETO->ClaveP  WITH "1"
   REPLACE NIETO->ClaveH  WITH "2"
   REPLACE NIETO->Clave  WITH "1"
   REPLACE NIETO->Nombre WITH "NIETO 1 DE HIJO 2 DE PADRE 1"
   //
   NIETO->(DbAppend())
   REPLACE NIETO->ClaveP  WITH "1"
   REPLACE NIETO->ClaveH  WITH "2"
   REPLACE NIETO->Clave  WITH "2"
   REPLACE NIETO->Nombre WITH "NIETO 2 DE HIJO 2 DE PADRE 1"
   //
   NIETO->(DbAppend())
   REPLACE NIETO->ClaveP  WITH "2"
   REPLACE NIETO->ClaveH  WITH "1"
   REPLACE NIETO->Clave  WITH "1"
   REPLACE NIETO->Nombre WITH "NIETO 1 DE HIJO 1 DE PADRE 2"
   //
   NIETO->(DbAppend())
   REPLACE NIETO->ClaveP  WITH "2"
   REPLACE NIETO->ClaveH  WITH "1"
   REPLACE NIETO->Clave  WITH "2"
   REPLACE NIETO->Nombre WITH "NIETO 2 DE HIJO 1 DE PADRE 2"
   //
   USE
   //
ENDIF
//

return nil

*********************************
static function IndexaFicheros()
********************************

IF !FILE("HIJO.CDX")
   USE HIJO
   INDEX ON HIJO->ClaveP+HIJO->Clave TO HIJO
   USE
ENDIF
//
IF !FILE("NIETO.CDX")
   USE NIETO
   INDEX ON NIETO->ClaveP+NIETO->ClaveH+NIETO->Clave TO NIETO
   USE
ENDIF
//
return nil

*********************************
static function AbreFicheros()
********************************
USE HIJO  INDEX HIJO  NEW
USE NIETO INDEX NIETO NEW
USE PADRE NEW
return nil

//
*********************************************
static function PruebaBrowse(cTipo)
*********************************************
Local oDlg
Local oBrwPadre
Local oBrwHijo
Local oBrwNieto
local oCol

//
DEFINE DIALOG oDlg RESOURCE "GENERAL"
//
////////////////////////////////////////////////////
/////////////////// BROWSE DE PADRE       //////////
////////////////////////////////////////////////////
//
IF cTipo = "L"
   REDEFINE LISTBOX oBrwPadre ;
         FIELDS PADRE->Clave+" ",;
         +PADRE->Nombre;
         FIELDSIZES 32,276,16;
         HEADERS "Clave"," Nombre ";
         ID 100;
         OF oDlg
ELSE
   REDEFINE xBrowse oBrwPadre ID 100 OF oDlg ;
   COLUMNS "Clave","Nombre" ;
   ALIAS "Padre" CELL LINES FOOTERS

   Estilo(oBrwPadre)
ENDIF

oBrwPadre:bChange:= {|| (Actualiza1(oBrwHijo),Actualiza2(oBrwNieto))}

////////////////////////////////////////////
/////////////////// BROWSE DE HIJO  ////////
////////////////////////////////////////////
//
DbSelectArea("HIJO")
//
IF cTipo = "L"
   REDEFINE LISTBOX oBrwHijo ;
         FIELDS Hijo->Clave+" ",;
         +Hijo->Nombre;
         FIELDSIZES 32,276,16;
         HEADERS "Clave"," Nombre ";
         ID 200;
         OF oDlg
ELSE
   REDEFINE xBrowse oBrwHijo ID 200 OF oDlg ;
   COLUMNS "Clave","Nombre" ;
   ALIAS "Hijo" CELL LINES  FOOTERS

   Estilo(oBrwHijo)
ENDIF

oBrwHijo:bChange:= {|| Actualiza2(oBrwNieto)}

//
////////////////////////////////////////////////
/////////////////// BROWSE DE NIETO/////////////
////////////////////////////////////////////////
//
DbSelectArea("NIETO")
//
IF cTipo = "L"
   REDEFINE LISTBOX oBrwNieto ;
         FIELDS Nieto->Clave+" ",;
         +Nieto->Nombre;
         FIELDSIZES 32,276,16;
         HEADERS "Clave"," Nombre ";
         ID 300;
         OF oDlg
ELSE
   REDEFINE xBrowse oBrwNieto ID 300 OF oDlg ;
   COLUMNS "Clave","Nombre" ;
   ALIAS "Nieto" CELL LINES  FOOTERS

   Estilo(oBrwNieto)
ENDIF

DbSelectArea("PADRE")

ACTIVATE DIALOG oDlg CENTER // ON  INIT ( Actualiza1(oBrwHijo), Actualiza2(oBrwNieto) )

return nil

************************************
STATIC FUNCTION Actualiza1(oBrwHijo)
************************************
//
HIJO->(ordscope(TOPSCOPE, PADRE->Clave))
HIJO->(ordscope(BOTTOMSCOPE, PADRE->Clave))
HIJO->(DbGoTop())
oBrwHijo:refresh()
return nil

*************************************
STATIC FUNCTION Actualiza2(oBrwNieto)
*************************************
//
NIETO->(ordscope(TOPSCOPE, PADRE->Clave+HIJO->Clave))
NIETO->(ordscope(BOTTOMSCOPE, PADRE->Clave+HIJO->Clave))
NIETO->(DbGoTop())
oBrwNieto:refresh()
return nil

//-------------------------
STATIC Function Estilo(oBrw)
  WITH OBJECT oBrw
   :nMarqueeStyle       := MARQSTYLE_HIGHLROW
   :nColDividerStyle    := LINESTYLE_BLACK
   :bClrSel             := {|| { nRGB(  0,  0,255), nRGB(255,248,220) } }
   :lColDividerComplete := .t.
   :nHeaderLines        := 1
   :nDataLines          := 1
  END
Return nil

Saludos.
Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 610
Joined: Wed Oct 19, 2005 08:20 PM
Re: Listbox vs. XBrowse
Posted: Tue Jun 04, 2013 12:34 PM

Francisco:

Muchísimas gracias por tu ayuda. Ahora sí que funciona perfectamente.

He quitado el enlace al ejecutable (no vaya a ser que se haya infectado de algún virus).

Un saludo,

Manuel



xH 1.2.3, FWH 23.07 32 bits, BC++ 7.4, xVerce CW 1.0, PellesC

Continue the discussion