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”.