quarta-feira, 25 de fevereiro de 2009

Delphi Intraweb - Gerar dinamicamente JavaScript

Continuação do artigo Delphi Intraweb – JavaScript II (Continua)

Antes de qualquer coisa, preciso registrar a alegria de podermos contar com mais um colaborador no nosso blog.
Prezados leitores, em nome de todos os colaboradores, quero manifestar a alegria em poder contar com mais um grande amigo no time do Estação ZN. Rodrigo Alencar, brother de longas datas tem contribuído com um material de extrema qualidade, pertinência e originalidade.
Rodrigão, seja bem vindo ao Estação ZN, é uma honra poder contar com o sua participação!

Dando continuidade ao tema ...

Para controlarmos, através de JavaScript, a ação de habilitar e desabilitar o IWCombo1 (O que carregamos com os nomes das bandas) vamos gerar dinamicamente o script que vai no browser fazer esse gerenciamento.
Adicione no IWForm mais um IWCheckBox, e codifique conforme ilustrado abaixo:


private
procedure LoadComboBandas;
procedure DesabilitaControles;
procedure BuildScriptControlEnabled;
public

Na seção “private” declarei o método que vai construir dinamicamente o JavaScript, “BuildScriptControlEnabled”.
procedure TZnIWForm.BuildScriptControlEnabled;
const
  FunctionJsBodyStatment = 'function %s{%s}';
  AQuebraLinhaJs = #13;
  AStatementFnc =
      '  var ZnComboLnd = FindElem("%s");' + AQuebraLinhaJs +
      '  alert(ZnComboLnd[ZnComboLnd.selectedIndex].innerHTML);' + AQuebraLinhaJs +
      '  var ZnChkBox = FindElem("%s");' + AQuebraLinhaJs +
      '  alert(ZnChkBox.innerHTML);' + AQuebraLinhaJs +
      '  ZnChkBox.checked  = !ZnChkBox.checked;' + AQuebraLinhaJs +
      '  ZnComboLnd.disabled = !ZnChkBox.checked;'  + AQuebraLinhaJs +
      ' if (!ZnComboLnd.disabled){ ' + AQuebraLinhaJs +
      '   alert(ZnComboLnd.name + " está Habilitado"); ' + AQuebraLinhaJs +
      '   ZnComboLnd.style.backgroundColor = "#FFFFFF"; ' + AQuebraLinhaJs +
      '   ZnComboLnd.focus(); ' + AQuebraLinhaJs +
      '   return true; ' + AQuebraLinhaJs +
      '  } ' + AQuebraLinhaJs +
      ' else{ '+ AQuebraLinhaJs +
      ' ZnComboLnd.style.backgroundColor ="#E7E7E7"; '+ AQuebraLinhaJs +
      '   return false; ' + AQuebraLinhaJs +
      ' };'+ AQuebraLinhaJs;
var
  StrStatement: String;
begin
  StrStatement := AQuebraLinhaJs;
  StrStatement :=  StrStatement + Format(AStatementFnc,
    [UpperCase(IWComboBox1.Name), UpperCase(ChckBoxBandas.Name)]);

  StrStatement := Format(FunctionJsBodyStatment,
    ['ZnHabilitaCmbBanda()', StrStatement]);
  Self.JavaScript.Add(StrStatement);
  ChckBoxBandas.ScriptEvents.Add('onClick').EventCode.Add('ZnHabilitaCmbBanda()');
end;


Observe que temos problemas na hora de trabalharmos com o objeto do tipo “CheckBox”. Veja que, para montar a string que será adicionada a propriedade “JavaScript” do IWForm, na linha 8, recuperamos o objeto com função “FindElem()”.Do contrário, teríamos que usar o nome completo do componente (definido em JavaScript na página web). Ou seja, teríamos que concatenar com o nome do controle (IWCheckBox) no Delphi como bendito sufixo “_CHECKBOX”.
Na linha 9, somos obrigados a simular o comportamento “Click” do objeto. Que absurdo! Do contrário ele não efetiva o “Click”. Pelo menos, essa foi a solução que encontrei, visto que o click do componente não rolava.
Na linha 10, somente então, efetivamos a atribuição de valor a propriedade “disabled” do objeto recuperado na linha 7 (o “IWComboBox1”).

No trecho de código abaixo, podemos ver como ficou no browser a função que dinamicamente montamos no Delphi:
function ZnHabilitaCmbBanda(){
  var ZnCombo = document.forms[0].IWCOMBOBOX1;
  var ZnChkBox = FindElem("CHCKBOXBANDAS");
  ZnChkBox.checked  = !ZnChkBox.checked;
  ZnCombo.disabled = !ZnChkBox.checked;
 if (!ZnCombo.disabled){ 
   alert(ZnCombo.name + " está Habilitado"); 
   ZnCombo.style.backgroundColor = "#FFFFFF"; 
   ZnCombo.focus(); 
   return true; 
  }; 
 else{ 
 ZnCombo.style.backgroundColor ="#E7E7E7"; 
 };
}


Isso acontece especialmente no Intraweb 8 porque ele trata o comportamento de todo “CheckBox” com uma tag “span”. Como se não bastasse isso, para complicar ainda mais, ele agrega, arbitráriamente, um sufixo ao nome original do componente, “_CHECKBOX”. Isso certamente deve ter complicado a vida de quem tentou trabalhar com JavaScript no Intraweb 8. Veja um trecho de código gerado no browser pelo Intraweb 8 na definição do “CHCKBOXBANDAS”:


<input tabindex="27" type="CHECKBOX" name="CHCKBOXBANDAS_CHECKBOX">
<span onclick="FindElem('CHCKBOXBANDAS_CHECKBOX').checked =
!FindElem('CHCKBOXBANDAS_CHECKBOX').checked;">Habilitar Bandas</span>
</span>


No Intraweb 5 isso não acontece. Primeiro, não existe o sufixo na definição JavaScript do componente. Segundo, embora exista a tag span, ela presta somente para exibir o conteúdo do caption do IWCheckBox, o comportamento do CheckBox não está programado nela. Portanto, não precisaríamos simular o click em código conforme eu fiz na linha 04 da “function ZnHabilitaCmbBanda()”. Alias, se alguém tiver algo a acrescentar a minha análise, por favor, fique a vontade. Em outras, palavras, foi a solução que encontrei.

Outro ponto importante, quero destacar nesse exemplo a atribuição dinâmica da propriedade “ScriptEvent” do TIWCheckBox, “ChkBoxBandas”. Isso está sendo feito na linha 28 do procedimento “BuildScriptControlEnabled”.

Nenhum comentário:

Postar um comentário

 
BlogBlogs.Com.Br