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:
Y aquí el .rc
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:
#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 nilY aquí el .rc
// 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
Manuel
xH 1.2.3, FWH 23.07 32 bits, BC++ 7.4, xVerce CW 1.0, PellesC