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”.
Artigo completo (View Full Post)