Trouble in XBrowse

Post Reply
Soares289
Posts: 30
Joined: Tue Apr 17, 2007 7:07 pm
Location: Brasil-São Paulo-SP

Trouble in XBrowse

Post by Soares289 »

Hi, everyone!
I am having trouble in addeding buttons in execution time for a xbrowse Object and passing a function in a variable and using the "&".
When i click the button, i see a error message saying that the oBrw is not found.

Can someone help me on it?

Here is and exemple of the code

.

Code: Select all

#include "FiveWin.ch"
#include "xbrowse.ch"
#include "SQLRDD.ch"

//First at all, sorry for my poor inglish
//This code is a test function that i'm trying to implement in my sistem
//This take the position of the browse and the buttons that this will have and adjust in a Group

function main(cDSN)				//this funcion is just for text

   local dbRotG
   
   connect(cDSN)   
   
   dbRotG   :="Teste(oBrw)"			//the function that i'll receive as a parameter


   DEFINE WINDOW oWin FROM 1,1 TO 1024,1280 PIXEL TITLE "Teste"  //PIXEL 
   
   SET MESSAGE OF oWin TO "Teste Window" CENTERED TIME DATE   //Logozinho Rs

   USE cadcli new via "sqlrdd"
   
   DS_BROWSE(oWin,0,0,90,90,,dbRotG)     //All as percent

   ACTIVATE WINDOW oWin MAXIMIZED

return

//\\/\Testes/\//\\ upahead is the test function caller

****************************************************************************************************

function DS_Browse( oWin , vLeft , vTop , vWidth , vHeight , sTabela , bFunc )
      
      local oBrw, oFra, oBtn, vBtnTop
      
      vBtnTop=7			//the first button top
      vX=(GetSysMetrics(0) / 100) ; vY=(GetSysMetrics(1) / 100)      //Get the value of one percent of the window

      if vLeft==nil ; vLeft=0 ; else ; vLeft*= vX ; endif						//check the values
      if vTop==nil ; vTop=0 ; else ; vTop *= vY ; endif                 //Checa se os dados são validos
      if vWidth==nil ; vWidth=80 * vX ; else ; vWidth *=  vX ; endif
      if vHeight==nil ; vHeight=80 * vY ; else ; vHeight *= vY ; endif
  
      if sTabela==nil ; sTabela=alias() ; endif				//take the tables
      
      oFra := desenharFrame(oWin,vLeft,vTop,vWidth,vHeight)             //Desenha o Frame
      oBrw := desenharBrowse(vWidth-(vX * 8.5), vHeight-(vY * 4),sTabela, oFra)        //Desenha o Browse

   if bFunc <> nil ; desenharBotao(vWidth-( vX*8) , vBtnTop, vX*8 , vY*3.3 , bFunc , oFra , oBrw) ; endif  //Checa se uma outra variavel esta
                                                                                                            //ok e então monta o botão
return

****************************************************************************************************

function desenharBrowse(vWidth,vHeight,sTabela, oFra)

   local  wfname, wfdesc
   
   
   a='select * from campos where file_name = "' + (sTabela) + '" and SR_DELETED<>" " order by indkey_001'//field_ord, sr_recno'
   use (A) alias campos new via "SQLRDD"			//take the table listing the coluns we will use
   go top
   
   oBrw := TXbrowse():New( oFra )                  //Options of the browse
   oBrw:nMarqueeStyle      :=  5
   oBrw:nColDividerStyle   := LINESTYLE_DARKGRAY
   oBrw:nRowDividerStyle   := LINESTYLE_DARKGRAY
   oBrw:lAllowRowSizing    := .f.
   oBrw:lAllowColHiding    := .f.
   oBrw:lAllowColSwapping  := .f.
   oBrw:LVScroll            := .f.
      
   oBrw:oFont :=TFont():New("Courier New")         //The font
   
   
   do while !eof()   \\here the function will add colun one by oneof the tabla, but only the listed in the table campos
   
      wfname = campos->field_name               //The coluns
      wfdesc = campos->field_desc
      wflen = campos->field_len
      
      sele (sTabela)
      oCol := TXBrwColumn():New( oBrw )
      oCol := oBrw:AddCol()
      oCol:bStrData  := { || &wfname }
      oCol:nWidth        := wflen * 10
      oCol:cHeader   := wfdesc
      oCol:lAllowSizing=.f.
      
      sele campos
      skip
      
   enddo
   close 
   
   sele (sTabela)
   oBrw:SetRDD()		//i dont remember what is this now, i thing i just add this for test... rs

   oBrw:CreateFromCode()
   oBrw:nFreeze := 1  
   oBrw:nTop := 7
   oBrw:nLeft := 0
   oBrw:nHeight := vHeight
   oBrw:nWidth := vWidth
   
   //oBrw:VSetRange(1,1)
   
return oBrw

function desenharFrame(oWin, vLeft, vTop,vWidth,vHeight)
//Here the frame are maked
   @ vTop-7 , vLeft GROUP oFra TO vTop+vHeight+7 , vLeft+vWidth PIXEL //Desenha o Frame

return oFra

****************************************************************************************************

function desenharBotao( vLeft , Vtop , vWidth , vHeight , bFunc , oFra, oBrw)
   //Here is the case, i try do that of many ways
   
   //bFunc := 'teste(oBrw)'		i tryed use here many string inside of it and nothing
	 //bFunc := "{||teste(oBrw)}"
	 //bFunc := "{|oBrw|teste(oBrw)}"
	 
	 @ vTop, vLeft BUTTON oBtn Prompt "Teste" of oFra ACTION Teste(oBrw) SIZE vWidth, vHeight PIXEL
	 //this is the only way i try and work. Butit is not what i want, i need pass the function reference in parameter
	 
	 /* i try a lot o way, and no one work, here is some exemples of bads trys ;\	 
	 
		@ vTop, vLeft BUTTON oBtn PROMPT "Teste" of oFra ACTION &bFunc SIZE vWidth, vHeight PIXEL
		@ vTop, vLeft BUTTON oBtn PROMPT "Teste" of oFra ACTION bFunc SIZE vWidth, vHeight PIXEL
		@ vTop, vLeft BUTTON oBtn PROMPT "Teste" of oFra ACTION {||&bFunc} SIZE vWidth, vHeight PIXEL
		@ vTop, vLeft BUTTON oBtn PROMPT "Teste" of oFra ACTION {|oBrw|&bFunc} SIZE vWidth, vHeight PIXEL
		
		btnNew := TButton():New(vTop,vLeft,"&New",oFra,,vWidth,vHeight,,,.F.,.T.,.F.,,.F.,,,.F. )
		oBtn:bAction = {||&bFunc}
		oBtn:bAction = bFunc
		oBtn:bAction = {|oBrw|&bFunc}
	 */ 
	 
	/*			this don't work :@
   @ vTop,  vLeft BUTTON oBtn PROMPT "Teste" OF oFra SIZE vWidth, vHeight PIXEL
   oBtn:bAction    = { || &bFunc}//,oBrw:GoBottom(), oBrw:SetFocus() }
	 */
return

****************************************************************************************************

function Teste(oBrw)
   msginfo(oBrw:nHeight)		//just do see if the function can access the browse
return obj

****************************************************************************************************

#include "d:\xhb\samples\sqlrdd\connect.prg"		//the SQLRDD conection (Must have a ini file on the app path with the conection string


I dont know very well FiveWin, if some one know other way to do that, i'll be happy to know :)


Thanks for all.


User avatar
Maurilio Viana
Posts: 252
Joined: Tue Oct 25, 2005 2:48 pm
Location: Garça/Garza/Heron City - Brazil
Contact:

Re: Trouble in XBrowse

Post by Maurilio Viana »

Soares, assim deveria funcionar:

dbRotG := {|| Teste(oBrw) }

...... action eval( dbRotG )

Claro que a funcao Teste() deve existir e o parâmetro oBrw deve ser enxergado pelo programa...

[ ]'s
Maurilio
Soares289
Posts: 30
Joined: Tue Apr 17, 2007 7:07 pm
Location: Brasil-São Paulo-SP

Post by Soares289 »

Muito obrigado Maurilio Viana, eu testei aqui, e parece que funcionou.
Eu não fazia idéia da nescessidade da função "Eval". :D
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Carlos Alberto,

You can also do:

@ vTop, vLeft BUTTON oBtn PROMPT "Teste" of oFra ACTION Teste(oBrw) ...

but do it as Maurilio told you if you are using a codeblock defined somewhere else
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply