Jump to content
Fivewin Brasil

Clausula on change não funciona no COMBOBOX


Breno

Recommended Posts

Bom dia meus caros.

Estou enfrentando um possivel bug na classe combobox. (ou na classe MENU)

E uma dialog, costumo colocal menus ( ODLG:SETMENU(menu_nodialogo(odlg) ) . Quando faço isso, a clausula ON CHANGE em todos os controles COMBOBOX do dialog não funcionam.

Se eu não coloco o menu no dialog, tudo funciona perfeitamente.

Em versão antiga do fw, não acontece esse problema.

Alguem já passou por isso ?

 

Fwh 13.07 - xhb 1.2.3

Link to comment
Share on other sites

Ola Kabiaba. Obrigado pela atenção.

Certo, falhei .

Segue abaixo um exemplo.

Repare nas duas opções ACTIVATE do dialog. (estão comentadas)

O problema é:

Não consigo fazer o change do combobox funcionar, se monto o menu do dialog.

Se quiser testar, coloque teste prg em algum programa seu . Testei aqui e repete o mal funcionamento (sem erro)

 

 

TESTECOMBO.prg

Link to comment
Share on other sites

Mesma lógica, vista por outro prisma.

[code]
// C:\FWH\SAMPLES\TESTCMB3.PRG

#Include 'FiveWin.ch'
#Include "Constant.ch"

STATIC oBar

FUNCTION Main()

   LOCAL oDlg, oDbf, oFont, oBold
   LOCAL cOrder  := "", oCbx, cTitle
   LOCAL nBottom := 27.2
   LOCAL nRight  := 89
   LOCAL nWd     := Max( nRight * DLG_CHARPIX_W, 180 )
   LOCAL nHt     := nBottom * DLG_CHARPIX_H

   cTitle := "COMBOBOX by kapiabafwh@gmail.com"

   oFont := TFont():New( "Tahoma", 0, 14,, )
   oBold := TFont():New( "Tahoma", 0, 14,, .T. )

   // DEFINE DIALOG oDlg SIZE nWd, nHt PIXEL TRUEPIXEL TITLE cTitle

   DEFINE DIALOG oDlg SIZE 350, 400 PIXEL TRUEPIXEL FONT oFont    ;
      COLOR CLR_BLACK, RGB( 245, 245, 235 ) TITLE cTitle          ;
      STYLE nOR( DS_MODALFRAME, WS_POPUP, WS_CAPTION, WS_SYSMENU, ;
                 WS_MINIMIZEBOX)

   oDlg:lHelpIcon := .F.

   @ 120, 50 COMBOBOX oCbx VAR cOrder SIZE 100, 400 PIXEL OF oDlg ;
      ITEMS { "item1", "item2", "item3" }                         ;
      ON CHANGE  msgalert( "combobox mudou: " )                   ;
      HEIGHTGET 20 STYLE CBS_DROPDOWN

   ACTIVATE DIALOG oDlg CENTER                 ;
      ON INIT ( Btnbar( oBar, oDlg ) )

   oFont:End()
   oBold:End()

RETURN NIL

FUNCTION Btnbar( oBar, oDlg )

   LOCAL aBtnBar

   aBtnBar := Array( 6 )

   DEFINE BUTTONBAR oBar OF oDlg  SIZE 50, 50 TOP NOBORDER  2007

   DEFINE BUTTON aBtnBar[ 1 ] OF oBar PROMPT "New"       ACTION MsgInfo()

   DEFINE BUTTON aBtnBar[ 2 ] OF oBar PROMPT "Modify"    ACTION MsgInfo()

   DEFINE BUTTON aBtnBar[ 3 ] OF oBar PROMPT "Duplicate" ACTION MsgInfo()

   DEFINE BUTTON aBtnBar[ 4 ] OF oBar PROMPT "Del"       ACTION MsgInfo()

   DEFINE BUTTON aBtnBar[ 5 ] OF oBar PROMPT "Print"     ACTION MsgInfo()

   DEFINE BUTTON aBtnBar[ 6 ] OF oBar PROMPT "Exit"      ACTION( oDlg:End() )

RETURN( oBar )

// FIN / END - kapiabafwg@gmail.com
[/code]

Regards, saludos.

 

Link to comment
Share on other sites

Seu COMBOBOX funcionando perfeito.

// C:\FWH\SAMPLES\TESTECMB.PRG

#Include "FiveWin.ch"

FUNCTION TESTECOMBO()

   LOCAL oDlg,  cOrder := "", oCbx, cTitle

   cTitle := "COMBOBOX MODIFICADO by kapiabafwh@gmail.com"

   DEFINE DIALOG oDlg SIZE 600, 400 TITLE cTitle

   oDlg:lHelpIcon := .F.

   @ 15, 20 COMBOBOX oCbx VAR cOrder SIZE 100, 400 PIXEL OF oDlg ;
      ITEMS { "item1", "item2", "item3" }                        ;
      ON CHANGE  msgalert( "combobox mudou: " )                  ;
      HEIGHTGET 20 STYLE CBS_DROPDOWNLIST

   ACTIVATE DIALOG oDlg CENTERED ;
      ON INIT( oDlg:SetMenu( Monta_Menu( oDlg ) ) )

RETURN NIL

FUNCTION Monta_Menu( oDlg )

   LOCAL oMenu

   // monta o menu no dialogo
   MENU oMenu
      MENUITEM " &INSERE AQUI" OF oMenu ;
         ACTION msgalert( "insere" )

      MENUITEM " &APAGA AQUI " OF oMenu ;
         ACTION msgalert( "apaga" )

      MENUITEM "&SAIDA AQUI  " OF oMenu ;
         ACTION( oDlg:End() )

   ENDMENU

RETURN( oMenu )

// FIN / END - kapiabafwh@gmail.com

 

Link to comment
Share on other sites

Beleza Garoto. Muito obrigado

Seu primeiro exemplo (com buttonbar) funcionou legal.

Mas o segundo (com menutem) não. Compilei diretamente seu exemplo. Nâo deu nenhum erro, mas não funcionou o change

Acrecito que há alguma diferença de versão. ( O meu fivewin é o 13.07, e o seu ?)

Se puder dispobinilizar seu fonte da classe combobox e da classe  menu para eu compilar aqui e ´tentar matar a charada', eu agradeceria.

Grato demais

Abçs

 

Link to comment
Share on other sites

Não funciona com FWH1307, melhor é você atualizar sua versão junto ao Gilmer: gilmer@fivewin.com.br

// DropDown ComboBoxes

#include "FiveWin.ch"

STATIC oDlg

function Main()

   local oCbx
   local cText := "     "

   DEFINE DIALOG oDlg FROM 10, 10 TO 20, 50 ;
      TITLE "DropDown ComboBox Test"

   // NAO FUNCIONA COM FWH1307 - MELHOR ATUALIZAR VERSÃO.
   @ 3.5, 1 COMBOBOX oCbx VAR cText STYLE CBS_DROPDOWN ;
      ITEMS { "One", "Two", "Three" } ;
      ON CHANGE oDlg:SetText( cText )

   ACTIVATE DIALOG oDlg CENTERED ON INIT( _SetMenu() )

return nil

function _SetMenu()

   local oMenu

   MENU oMenu
      MENUITEM "&One"  ACTION MsgInfo( "One" )
      MENUITEM "&Two"  ACTION MsgInfo( "Two" )
   ENDMENU

   oDlg:SetMenu( oMenu )

return nil

procedure AppSys  // Xbase++ requirement

return

Abs.

Regards, saludos.

 

Link to comment
Share on other sites

Mistério do kralho.... kkkkkkkkkkkkkkk

O estranho, é que se eu parto de um botão, funciona em FWH1307 sem problemas.

// C:\FWH\SAMPLES\TESTECMB.PRG

#include "FiveWin.ch"
#include "DbCombo.Ch"

FUNCTION TESTECOMBO()

   LOCAL oDlg,  cOrder := "", oCbx, cTitle, oButton

   cTitle := "COMBOBOX MODIFICADO by kapiabafwh@gmail.com"

   DEFINE DIALOG oDlg SIZE 600, 400 TITLE cTitle

   oDlg:lHelpIcon := .F.

   @ 15, 20 COMBOBOX oCbx VAR cOrder SIZE 100, 400 PIXEL OF oDlg ;
      ITEMS { "item1", "item2", "item3" }                        ;
      ON CHANGE msgalert( "combobox mudou: " )                   ;
      STYLE CBS_DROPDOWN UPDATE

   @ 5, 5 BUTTON oButton PROMPT "Test Character type ItemCode DbCombo" ;
      ACTION Dialog2()

   ACTIVATE DIALOG oDlg CENTERED ;
      ON INIT( oDlg:SetMenu( Monta_Menu( oDlg ) ) )

RETURN NIL

// Dialog2 is exaclly the same copy of the above, instead of Numeric Type data in aItems
// character Type data is used in aItems
FUNCTION Dialog2()

   LOCAL oDlg2, oCmbCommodity, oCmbItems, oSayCommodityCode, oSayItemCode
   LOCAL aLstOfCommodities := {}, aCodeOfCommodities := {}
   LOCAL aLstOfItems := {}, aCodeOfItems := {}
   LOCAL cCommodityCode, cItemCode

   // Character data type ItemCode
   aLstOfCommodities := { "Fruits", "Vegetables" }
   aCodeOfCommodities := { "25", "35" }  // Character type aItem values

   cCommodityCode := "35"
   cItemCode := Space( 2 )

   DEFINE DIALOG oDlg2 TITLE "Test DBCombo with Character type aItems" FROM 10, 30 TO 30, 100

   @1, 25 SAY oSayCommodityCode PROMPT cCommodityCode OF oDLG2

   @1, 1 DBCOMBO oCmbCommodity VAR cCommodityCode;
      ITEMS aCodeOfCommodities ;
      SIZE 120, 200 ;
      LIST aLstOfCommodities ;
      OF oDlg2;
      ON CHANGE ( SetDbCombo2( cCommodityCode, oCmbItems, @aLstOfItems, @aCodeOfItems, @cItemCode ), ;
      oSayCommodityCode:SetText( cCommodityCode ), ;
      oSayItemCode:SetText( cItemCode ) ) ;
      VALID ( SetDbCombo2( cCommodityCode, oCmbItems, @aLstOfItems, @aCodeOfItems, @cItemCode ), ;
      oSayCommodityCode:SetText( cCommodityCode ), ;
      oSayItemCode:SetText( cItemCode ), .T. ) ;
      UPDATE

   @3, 25 SAY oSayItemCode PROMPT cItemCode OF oDlg2

   @3, 1 DBCOMBO oCmbItems VAR cItemCode;
      ITEMS aCodeOfItems ;
      SIZE 120, 200 ;
      LIST aLstOfItems;
      OF oDlg2;
      ON CHANGE( msgalert( "combobox mudou: " ) )                  ;
      UPDATE

   // ON CHANGE ( oSayItemCode:SetText( cItemCode ) ) ;
   // UPDATE

   ACTIVATE DIALOG oDlg2 ;
      ON INIT Eval( oCmbCommodity:bChange )

RETURN NIL

FUNCTION SetDbCombo2( cCommodityCode, oCmbItems, aLstOfItems, aCodeOfItems, cItemCode )

   aLstOfItems := {};aCodeOfItems := {}

   IF cCommodityCode == "25" // Fruits
      aLstOfItems := { "Apple", "Grapes", "Mango" }
      aCodeOfItems := { "21", "31", "41" }  // Character type aItem values
   ELSEIF cCommodityCode == "35" // Vegetables
      aLstOfItems := { "Cucumber", "Potato", "Tomato" }
      aCodeOfItems := { "51", "61", "71" }  // Character type aItem values
   ENDIF

   // The sequence of commads are important here. ie The default ItemCode should be assigned only
   // after calling oCmbItems:SetItems() and then followed by a oCmbItems:refresh()
   oCmbItems:SetItems( aCodeOfItems, aLstOfItems )

   IF cCommodityCode == "25" // Fruits
      cItemCode := "41"  // 3rd Item ie Mango should be the default one on DbCombo
   ELSEIF cCommodityCode == "35" // Vegetables
      cItemCode := "61" // 2nd Item ie Potato should be the default one on DbCombo
   ENDIF

   oCmbItems:Refresh()

RETURN NIL

FUNCTION Monta_Menu( oDlg )

   LOCAL oMenu

   // monta o menu no dialogo
   MENU oMenu
   MENUITEM " &INSERE AQUI" OF oMenu ;
      ACTION msgalert( "insere" )

   MENUITEM " &APAGA AQUI " OF oMenu ;
      ACTION msgalert( "apaga" )

   MENUITEM "&SAIDA AQUI  " OF oMenu ;
      ACTION( oDlg:End() )

   ENDMENU

RETURN( oMenu )

// FIN / END - kapiabafwh@gmail.com

 

Link to comment
Share on other sites

A única forma que funciona corretamente, é usando BUTTONBAR com esta versão velha sem modificar a classe.

#include "FiveWin.ch"  // TIM.PRG modificado.

FUNCTION Main()

   LOCAL oDlg, oFld
   LOCAL oGet, oCbx
   LOCAL nVar  := 900
   LOCAL cVar  := "Three"

   DEFINE DIALOG oDlg SIZE 500, 300

   // @ 2, 1 FOLDER oFld ITEMS "One", "Two", "Three" SIZE 240, 95

   // @ 10,160 GET oGet VAR nVar PICTURE "999" SIZE 50,20 PIXEL RIGHT OF oBar ;
   // VALID ( MsgInfo( nVar ), .t. )

   @ 30, 40 COMBOBOX oCbx VAR cVar ITEMS { "One", "Two", "Three" } ;
      SIZE 90, 200 PIXEL OF oDlg                                  ;
      ON CHANGE( MsgInfo( cVar ), .T. ) UPDATE

   @ 7.3, 17 BUTTON "Ok" ACTION oDlg:End()

   ACTIVATE DIALOG oDlg CENTERED ;
      ON INIT ( BuildBar( oDlg ) )

// ON INIT ( BuildBar( oDlg ), AEval( oFld:aDialogs, { | oDlg | BuildBar( oDlg ) } ) )

RETURN NIL

FUNCTION BuildBar( oDlg )

   LOCAL oBar

   DEFINE BUTTONBAR oBar OF oDlg SIZE 40, 40 2007

   DEFINE BUTTON OF oBar

   DEFINE BUTTON OF oBar

   DEFINE BUTTON OF oBar

RETURN NIL

Regards, saludos.

 

Link to comment
Share on other sites

1 hora atrás, kapiaba disse:
A única forma que funciona corretamente, é usando BUTTONBAR com esta versão velha sem modificar a classe.

#include "FiveWin.ch"  // TIM.PRG modificado.

FUNCTION Main()

   LOCAL oDlg, oFld
   LOCAL oGet, oCbx
   LOCAL nVar  := 900
   LOCAL cVar  := "Three"

   DEFINE DIALOG oDlg SIZE 500, 300

   // @ 2, 1 FOLDER oFld ITEMS "One", "Two", "Three" SIZE 240, 95

   // @ 10,160 GET oGet VAR nVar PICTURE "999" SIZE 50,20 PIXEL RIGHT OF oBar ;
   // VALID ( MsgInfo( nVar ), .t. )

   @ 30, 40 COMBOBOX oCbx VAR cVar ITEMS { "One", "Two", "Three" } ;
      SIZE 90, 200 PIXEL OF oDlg                                  ;
      ON CHANGE( MsgInfo( cVar ), .T. ) UPDATE

   @ 7.3, 17 BUTTON "Ok" ACTION oDlg:End()

   ACTIVATE DIALOG oDlg CENTERED ;
      ON INIT ( BuildBar( oDlg ) )

// ON INIT ( BuildBar( oDlg ), AEval( oFld:aDialogs, { | oDlg | BuildBar( oDlg ) } ) )

RETURN NIL

FUNCTION BuildBar( oDlg )

   LOCAL oBar

   DEFINE BUTTONBAR oBar OF oDlg SIZE 40, 40 2007

   DEFINE BUTTON OF oBar

   DEFINE BUTTON OF oBar

   DEFINE BUTTON OF oBar

RETURN NIL

Regards, saludos.

 

20 horas atrás, Rogerio Figueira disse:

Breno, se a sua versão do FW é a 13.07 provavelmente é bug da classe combobox, na época quando atualizei o meu FW (ainda estou no 14.02) tive que passar a usar a classe combobox anterior e até hoje continuo assim, infelizmente não deu ainda para atualizar o FW.
Saludos.

Grato Rogério. Pedi pro Kabiaba as classes da versão dele para decifrar o mistério. Mas de qualquer forma já resolveu meu problema urgente com o primeiro exemplo dele ( Com buttonbar). Mas se vc puder me mandar essas duas classes que funcionaram com vc, agradeceria.

Abçs

Link to comment
Share on other sites

Pois é Kabiaba...poem mistério  nisso...kkk

Não sei se o problema é na classe combobox  ou na classe menu (que esculhemba a combobox ) da 13.07.

Vc viu que se usar a combo numa dialog sem menu, funciona.  E tem mais....outros métodos da classe combo tb não funcionam em dialogs com menu tipo menuitem.

Vou tentar arranjar essas duas classes de outra versão para recompilar e ver se mato a charada.

No momento vou aproveitar teu exemplo e usar o ButtomBar. É o jeito. 

Agradeço a valiosa ajuda.

 

Link to comment
Share on other sites

9 horas atrás, Breno disse:

Grato Rogério. Pedi pro Kabiaba as classes da versão dele para decifrar o mistério. Mas de qualquer forma já resolveu meu problema urgente com o primeiro exemplo dele ( Com buttonbar). Mas se vc puder me mandar essas duas classes que funcionaram com vc, agradeceria.

Abçs

Breno, eu já não lembro mais qual era o bug da classe da versão em uso, mas teve comentários lá no fórum e eu passei a utilizar esta que funcionou e funciona até hoje. Tbm uso BUTTONBAR sem problemas.
Segue a classe.

COMBOBOX.PRG

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...