FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Identificar un browse de Multiples Browse (Resuelto)
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Identificar un browse de Multiples Browse (Resuelto)
Posted: Tue Aug 17, 2021 04:12 PM
Estimados:
Genero varios xbrowse en un panel, y los voy creando con una iteración.
Luego quiero que al hacer doble click en uno de las columnas de cualquiera de esos browses, me llame a una funcion.
El problema es que no puedo hacer referencia a que Query y a que Browse hago referencia, porque el indice que voy creando toma el ultimo valor.
Como debería hacerlo?
Code (fw): Select all Collapse
function PlaceControls( oPanel,oQryOpc,oPadre )
   LOCAL nRow  := 5,i,oBrwDet:=ARRAY(oQryOpc:RecCount()),oQryDet:=ARRAY(oQryOpc:RecCount()),oFont1
   DEFINE FONT oFont1 NAME "TAHOMA" SIZE 0,-10

   oQryOpc:GoTop()
   i:=1
   DO WHILE !oQryOpc:eof()
        oQryDet[i]:= oApp:oServer:Query("SELECT * FROM opcionales_det_tempD WHERE idgrupo = "+ClipValue2Sql(oQryOpc:id))
        @ nRow,  10 SAY oQryOpc:nombre SIZE 120,24 PIXEL OF oPanel TRANSPARENT
        @ nRow+5, 255 SAY IF(oQryOpc:obligatorio,"Obligatorio","Opcional") SIZE 70,24 PIXEL OF oPanel RIGHT TRANSPARENT FONT oFont1
        @ nRow+5, 330 SAY "Minimo: "+ALLTRIM(STR(oQryOpc:minimo)) SIZE 60,24 PIXEL OF oPanel RIGHT TRANSPARENT FONT oFont1
        @ nRow+5, 390 SAY "Maximo: "+ALLTRIM(STR(oQryOpc:maximo)) SIZE 60,24 PIXEL OF oPanel RIGHT TRANSPARENT FONT oFont1
        @ nRow+20,10 XBROWSE oBrwDet[i] DATASOURCE oQryDet[i];
                 COLUMNS "nombre","precio",IF(oQryOpc:por_cantidad,"cantidad","tilde"),"agotado","minimo","maximo";    
                 HEADERS "Nombre","Precio",IF(oQryOpc:por_cantidad,"Cantidad","Incluir"),"Agotado","Minimo","Maximo";
                 SIZES 285,50,70,80,80,80;
         OF oPanel SIZE 450,190 PIXEL 
        IF !oQryOpc:por_cantidad
            oBrwDet[i]:aCols[3]:SetCheck(nil,.f.)   
            oBrwDet[i]:aCols[3]:bLDClickData := {|| CambiaChek(oQryDet[I],oBrwDet[I])} //Esto no funciona
            oBrwDet[i]:aCols[3]:bKeyDown := {|nKey, nFlags| IF(nKey==13,nil,CambiaChek(oQryDet[i],oBrwDet[i]))} // Esto no funciona
            oBrwDet[i]:aCols[3]:nEditType := 1
            oBrwDet[i]:aCols[3]:bEditValue:= {|| IF(oQryDet[i]:tilde,.t.,.f.) }
        ENDIF
        PintaBrw(oBrwDet[i],0)
        oBrwDet[i]:CreateFromcode()
                
        nRow  += 220
        i ++
      oQryOpc:Skip()
   ENDDO
   oPanel:SetRange()
   @ nRow,380 BUTTON "ACEPTAR"  SIZE 80,40 PIXEL OF oPanel ACTION oPadre:End()
   @ nRow, 05 BUTTON "CANCELAR" SIZE 80,40 PIXEL OF oPanel ACTION oPadre:End()
return nil

Agradezco de ante mano cualquier ayuda
Posts: 9020
Joined: Thu Oct 06, 2005 08:17 PM
Re: Identificar un browse de Multiples Browse
Posted: Wed Aug 18, 2021 10:12 AM

If I understood your sample correctly, you have to use "detached local" technique. Look around for a sample.

EMG

Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: Identificar un browse de Multiples Browse
Posted: Wed Aug 18, 2021 02:16 PM
Perfecto Enrico, muchas gracias.
Así quedo el codigo por si a alguien le llega a interesar
Code (fw): Select all Collapse
function PlaceControls( oPanel,oQryOpc,oPadre )

   local nRow  := 5,i,oBrwDet:=ARRAY(oQryOpc:RecCount()),oQryDet:=ARRAY(oQryOpc:RecCount()),oFont1,oFontTit,oQryVer
   DEFINE FONT oFont1 NAME "TAHOMA" SIZE 0,-10

   oQryOpc:GoTop()
   i:=1
   DO WHILE !oQryOpc:eof()
        oQryDet[i]:= oApp:oServer:Query("SELECT * FROM opcionales_det_tempD WHERE idgrupo = "+ClipValue2Sql(oQryOpc:id))
        CrearBrw(oQryDet[i],oBrwDet[i],oQryOpc,nRow,oPanel,oFont1) 
        nRow  += 220
        i ++
      oQryOpc:Skip()
   ENDDO
   oPanel:SetRange()
   @ nRow,380 BUTTON "ACEPTAR"  SIZE 80,40 PIXEL OF oPanel ACTION oPadre:End()
   @ nRow, 05 BUTTON "CANCELAR" SIZE 80,40 PIXEL OF oPanel ACTION oPadre:End()

   

 @ nRow,200 BUTTON "VER"  SIZE 80,40 PIXEL OF oPanel ACTION (oQryVer:= oApp:oServer:Query("SELECT * FROM opcionales_det_tempD"),xbrowse(oQryVer))

return nil

************************************
**** FUNCION PARA DEFINIR CADA BROWSE DE OPCIONALES 
STATIC FUNCTION CrearBrw(oQryDet,oBrwDet,oQryOpc,nRow,oPanel,oFont1)
LOCAL oBotMas,oBotMen
        @ nRow,  10 SAY oQryOpc:nombre SIZE 120,24 PIXEL OF oPanel TRANSPARENT
        @ nRow+5, 255 SAY IF(oQryOpc:obligatorio,"Obligatorio","Opcional") SIZE 70,24 PIXEL OF oPanel RIGHT TRANSPARENT FONT oFont1
        @ nRow+5, 330 SAY "Minimo: "+ALLTRIM(STR(oQryOpc:minimo)) SIZE 60,24 PIXEL OF oPanel RIGHT TRANSPARENT FONT oFont1
        @ nRow+5, 390 SAY "Maximo: "+ALLTRIM(STR(oQryOpc:maximo)) SIZE 60,24 PIXEL OF oPanel RIGHT TRANSPARENT FONT oFont1
        @ nRow+20,10 XBROWSE oBrwDet DATASOURCE oQryDet;
                 COLUMNS "nombre","precio",IF(oQryOpc:por_cantidad,"cantidad","tilde"),"agotado","minimo","maximo";    
                 HEADERS "Nombre","Precio",IF(oQryOpc:por_cantidad,"Cantidad","Incluir"),"Agotado","Minimo","Maximo";
                 FOOTERS ;
                 SIZES 285,50,70,80,80,80;
         OF oPanel SIZE 450,190 PIXEL
        IF !oQryOpc:por_cantidad
            oBrwDet:aCols[3]:SetCheck(nil,.f.)   
            oBrwDet:aCols[3]:bLDClickData := {|| CambiaChek(oQryDet,oBrwDet)}
            oBrwDet:aCols[3]:bKeyDown := {|nKey, nFlags| IF(nKey==13,nil,CambiaChek(oQryDet,oBrwDet))}
            oBrwDet:aCols[3]:nEditType := 1
            oBrwDet:aCols[3]:bEditValue:= {|| IF(oQryDet:tilde,.t.,.f.) }
        ENDIF
        PintaBrw(oBrwDet,0)
        oBrwDet:CreateFromcode()
RETURN nil
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Identificar un browse de Multiples Browse
Posted: Mon Aug 23, 2021 10:56 PM
Yes. This is the best and the recommended way as Mr. Enrico suggested.

At the same time it may help to know that the above codeblocks can be written like this also.

Code (fw): Select all Collapse
oBrwDet[i]:aCols[3]:bLDClickData := {|| CambiaChek(oQryDet[I],oBrwDet[I])} //Esto no funciona

revise as:
Code (fw): Select all Collapse
oBrwDet[i]:aCols[3]:bLDClickData := {|r,c,f,oCol| CambiaChek(oCol:oBrw:uDataSource,oCol:oBrw)}


Code (fw): Select all Collapse
oBrwDet[i]:aCols[3]:bEditValue:= {|| IF(oQryDet[i]:tilde,.t.,.f.) }

revise as
Code (fw): Select all Collapse
oBrwDet[i]:aCols[3]:bEditValue:= {|x,oCol| IF(oCol:oBrw:uDataSource:tilde,.t.,.f.) }


Code (fw): Select all Collapse
oBrwDet[i]:aCols[3]:bKeyDown := {|nKey, nFlags| IF(nKey==13,nil,CambiaChek(oQryDet[i],oBrwDet[i]))} // Esto no funciona

revise as
Code (fw): Select all Collapse
oBrwDet[i]:aCols[3]:bKeyDown := {|nKey, nFlags,oBrw,oCol| IF(nKey==13,nil,CambiaChek(oBrw:uDataSource,oBrw))}


This way we are not using the index variable.
Regards



G. N. Rao.

Hyderabad, India
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: Identificar un browse de Multiples Browse
Posted: Thu Aug 26, 2021 01:24 PM

Excelente Mr Rao!!!
Muchas gracias!

Continue the discussion