Page 1 of 1

Bug Redefine ComboBox + oDB:FIELD - URGENT

Posted: Sun Feb 25, 2007 1:12 am
by ericmagaldi
Sorry my English :)

Antonio Linares,

//Bug Redefine ComboBox + oDB:FIELD with ('F' or 'J') in ITEM {'J - Pessoa Jurídica', 'F - Pessoa Física'} ?!

Code: Select all

use CLIENTE
// have one Class proper (TDBTable), but exemplify with TDataBase
DataBase oDBCli

? oDBCli:CLI_TIPPES // equal 'F' or 'J' - not is activate correctly element ComboBox (On Init Dlg).

//-----------------------------------------------------------
//Bug, if first Control receive Focus:

...
Redefine COMBOBOX oCbxTipPes ;
         VAR oDBCli:CLI_TIPPES ;
         ITEMS {'J - Pessoa Jurídica', 'F - Pessoa Física'} ;
         ID 4002  ;
         OF oFld:aDialogs[1]

Activate Dialog oDlg ;
         Center ;
         On Init PosCbx(oCbxTipPes,oDBCli:CLI_TIPPES)

// Use only this mode
//-----------------------------------------------------------
// Correct, if variable common:
...
cTipPes:=oDBCli:CLI_TIPPES

Redefine COMBOBOX oCbxTipPes ;
         VAR cTipPes ;
         ITEMS {'J - Pessoa Jurídica', 'F - Pessoa Física'} ;
         ID 4002  ;
         OF oFld:aDialogs[1]

Activate Dialog oDlg ;
         Center ;
         On Init PosCbx(oCbxTipPes,cTipPes)
//-----------------------------------------------------------
// Correct all mode:
...
@02,10 COMBOBOX oCbxTipPes ;
         VAR oDBCli:CLI_TIPPES ;
         ITEMS {'J - Pessoa Jurídica', 'F - Pessoa Física'} ;
         ID 4002  ;
         OF oFld:aDialogs[1]

Activate Dialog oDlg ;
         Center ;
         On Init PosCbx(oCbxTipPes,cTipPes)
//-----------------------------------------------------------
// Set position in oCbx:aItem
//-----------------------------------------------------------
function PosCbx( oCbx, cValue )
local nPos

if oCbx # nil .and. ! EMPTY(cValue)
   if (nPos:=ASCAN(oCbx:aItems, {|x| UPPER(cValue) == UPPER(PADR(x,LEN(cValue)))} )) > 0
      ? 'PosCbx() Find "' + cValue + '" in element ' + ALLTRIM(STR(nPos))
      oCbx:Select(nPos)
   endif
endif
return nil
//-----------------------------------------------------------
//-----------------------------------------------------------
// RESOURCE SCRIPT generated by "Pelles C for Windows, version 4.50".

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

LANGUAGE LANG_PORTUGUESE,SUBLANG_PORTUGUESE_BRAZILIAN

CDT_CLIENTE DIALOGEX DISCARDABLE 6, 18, 398, 194
STYLE WS_POPUP|DS_MODALFRAME|DS_CONTEXTHELP|DS_3DLOOK|WS_CAPTION|WS_SYSMENU|WS_VISIBLE
CAPTION "Dialog"
FONT 8, "MS Sans Serif", 0, 0, 1
BEGIN
CONTROL "", 4001, "SysTabControl32", 0x00000000, 0, 20, 396, 144
CONTROL "Cancelar", 4003, "Button", WS_TABSTOP, 344, 172, 45, 15
END

CDT_CLIENTE_GERAL DIALOGEX DISCARDABLE 6, 18, 396, 134
STYLE WS_CHILD|DS_3DLOOK|WS_VISIBLE
CAPTION "Dialog"
FONT 8, "MS Sans Serif", 0, 0, 1
BEGIN
CONTROL "", 4001, "Edit", ES_AUTOHSCROLL|WS_BORDER|WS_TABSTOP, 24, 12, 40, 12
CONTROL "", 4002, "ComboBox", WS_BORDER|CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP, 200, 12, 144, 40
CONTROL "", 4003, "Edit", ES_AUTOHSCROLL|WS_BORDER|WS_TABSTOP, 24, 48, 140, 12
END

CDT_CLIENTE_ENDERECO DIALOGEX DISCARDABLE 6, 18, 396, 134
STYLE WS_CHILD|DS_3DLOOK|WS_VISIBLE
CAPTION "Dialog"
FONT 8, "MS Sans Serif", 0, 0, 1
BEGIN
END

CDT_CLIENTE_FISCAL DIALOGEX DISCARDABLE 6, 18, 396, 134
STYLE WS_CHILD|DS_3DLOOK|WS_VISIBLE
CAPTION "Dialog"
FONT 8, "MS Sans Serif", 0, 0, 1
BEGIN
CONTROL "", 4001, "ComboBox", WS_BORDER|CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP, 112, 28, 168, 44
END
//-----------------------------------------------------------

Posted: Sun Feb 25, 2007 5:42 pm
by Rochinha
See the sample below

Code: Select all

#include "fivewin.ch"

function main()

   local oDlg, cCombo := "3"
   local aItems := { "1 - Um", "2 - Dois", "3 - Tres", "4 - Quatro" }

   cCombo := mascan( aItems, cCombo )

   DEFINE DIALOG oDlg FROM 2, 2 TO 18, 60 TITLE "Test" ;
          STYLE nOr( DS_MODALFRAME, WS_POPUP, WS_CAPTION, WS_SYSMENU, 4 )

          @ 2, 2 COMBOBOX cCombo ;
                 ITEMS aItems SIZE 200, 100 ;
                 ON DRAWITEM (cCombo := mascan( aItems, cCombo ), oCombo:Refresh())

   ACTIVATE DIALOG oDlg CENTERED

return nil

function mascan( aItems, cString )
   nLArray  := len( aItems )
   nLString := len( cString )
   for i = 1 to nLArray
       if substr(aItems[i],1,nLString) = cString
          return aItems[i]
       endif
   next
   return ""
Improve it!

Posted: Sun Feb 25, 2007 10:30 pm
by ericmagaldi
Set Translate Off... :)

Oi Rochinha..

O exemplo abaixo funciona somente na forma @...ComBoBox.
No modo Redefine nada é executado no ON DRAWITEM.

Na forma @...ComboBox que postei, também funciona.

O estranho, conforme especifiquei, se for uma variável comum (LOCAL cTipPes:='F'), irá funcionar, mas se usar variável de instância para o CBX, dá problema.

Tô achando que é Bug mesmo.

Posted: Tue Feb 27, 2007 1:18 pm
by Rochinha
Eric

Como eu sempre carrego minhas variaveis antes use desta forma:

Code: Select all

// Use only this mode 
//----------------------------------------------------------- 
// Correct, if variable common: 
... 
cTipPes := MAscan( {'J - Pessoa Jurídica', 'F - Pessoa Física'}, oDBCli:CLI_TIPPES )

Redefine COMBOBOX oCbxTipPes ; 
         VAR cTipPes ; 
         ITEMS {'J - Pessoa Jurídica', 'F - Pessoa Física'} ; 
         ID 4002  ; 
         OF oFld:aDialogs[1] 

Activate Dialog oDlg ; 
         Center ; 
         On Init PosCbx(oCbxTipPes,cTipPes) 

Posted: Tue Feb 27, 2007 10:40 pm
by ericmagaldi
Correto, tenho certeza que desta forma funcionará, entre outras formas que citei.

Mas pretendo usar da forma que mencionei (afinal existem os Methods) pois tento trabalhar na forma mais direta e otimizada possível. E se comprovado o Bug, o mesmo deve ser corrigido, correto ?!

Até o momento não tive nenhum contato do FiveWin.br ou Linares, inclusive enviei exemplos para ambos...

Posted: Wed Feb 28, 2007 8:30 am
by Antonio Linares
Éric,

It is not a bug. Please set:

oDBCli:lTenChars := .F. // Avoid Clipper restriction compatibility

as CLI_TIPPES is 10 chars length

Posted: Wed Feb 28, 2007 8:40 am
by ericmagaldi
Antonio Linares wrote:Éric,

It is not a bug. Please set:

oDBCli:lTenChars := .F. // Avoid Clipper restriction compatibility

as CLI_TIPPES is 10 chars length
Não resolveu!!!
e a minha classe não terá "lTenChars"
CLI_TIPPES é de 1 byte, mas se transformará conforme o elemento do vetor!!!

Qualquer umas das formas abaixo, funciona corretamente:

Variável comum (LOCAL cTipPes:='F')
ReDefine ComboBox cTipPes... // Assim funciona

ou
@10,10 ComboBox oDBCli:CLI_TIPPES ... // Assim funciona

ou
Quando não receber o primeiro foco // Assim funciona

Ainda continuo com o problema !!!!!
Você testou o exemplo que te enviei por email ????

Posted: Wed Feb 28, 2007 8:47 am
by Antonio Linares
Éric,

This is defined in class TDataBase:

DATA lTenChars AS LOGICAL INIT .t.

When Clipper assigns an object DATA, it places an underscore before the name:

oDBCli:CLI_TIPPES := .F. => oDBCli:_CLI_TIPPES( .F. )

but _CLI_TIPPES length is 11, so Class TDataBase checks if lTenChars is .F. and it not, then its value is NOT assigned

Posted: Wed Feb 28, 2007 8:55 am
by Antonio Linares
Éric,

Tu ejemplo usa folders, y posiblemente ahí esté la diferencia

Posted: Wed Feb 28, 2007 8:56 am
by ericmagaldi
Antonio,

não concordo com a necessidade de usar lTenChars, não faz sentido pra mim.
E eu não uso TDataBase, pois tenho uma própria ( TDBTable() )

Comentei 3 síntaxes que funciona corretamente, assim:
ReDefine oDBCli:CLI_TIPPES, em somente um caso, não quer funcionar...
ou seja, ao executar PosCBX(...), no On Init, para acertar o elemento, já chega errado dentro da PosCBX(...)

A questão é, quando é variavel de instância, internamente do ComboBox, este mudando o valor inicial do oDBCli:CLI_TIPPES, antes mesmo de ser avaliado no On INIT do DLG....

por favor, observe os exemplos que enviei por email...

Posted: Wed Feb 28, 2007 9:16 am
by Antonio Linares
Éric,

Cierto, en tu ejemplo no usas la Clase TDataBase.

El problema de tu código ocurre porque el combobox al tomar el foco VARIA el valor de oDBCli:FIELD:CLI_TIPPES ANTES de que lo asignes

Posted: Wed Feb 28, 2007 9:26 am
by Antonio Linares
Éric,

Hazlo de esta forma:

Code: Select all

Redefine COMBOBOX oCbxTipo ;
         VAR oDBCli:FIELD:CLI_TIPPES ;
         ITEMS {'J - Pessoa Jurídica', 'F - Pessoa Física'} ;
         ID 4002  ;
         OF oFld:aDialogs[1] ;
         WHEN ( IniciaCBX( oCbxTipo,oDBCli:FIELD:CLI_TIPPES ), .T. )

...

Redefine COMBOBOX oCbxRegime ;
         VAR oDBCli:FIELD:CLI_REGIME;
         ITEMS {'0 - Não informado', '3 - Simples', '1 - Lucro Presumido', '2 - Lucro Real'} ;
         ID 4001  ;
         OF oFld:aDialogs[3] ;
         WHEN ( IniciaCBX(oCbxRegime,oDBCli:FIELD:CLI_REGIME ), .T. )

Activate Dialog oDlg ;
         Center

Posted: Wed Feb 28, 2007 9:32 am
by ericmagaldi
Sim, funciona..


mas não é uma forma correta, certo ?!

Não usei esta técnica, porque sei que o When sempre é avaliado, a cada mudança de foco.
Como é algo relacionado no inicio, portanto deveria funcionar no "On Init", pois desta forma acredito que esta dentro das especificações da ordem de chamadas dos eventos no FW, e não estou tentando fazer nada fora do comum.

Acredito que é Bug do ComboBox / ReDefine, concorda ????

Posted: Wed Feb 28, 2007 9:33 am
by Antonio Linares
Éric,

> Acredito que é Bug do ComboBox / ReDefine, concorda ????

No. Parece un problema de focus

Posted: Wed Feb 28, 2007 9:39 am
by ericmagaldi
hehe... era isso que eu queria dizer, um "Bug"

e acha que em breve teremos uma correção sobre isso ?

:D