Alguém conhece alguma forma (extensão) de limitar o número de caracteres e também de aplicar máscaras nos campos texto do Thinlet? Pelo que sei, o toolkit não faz isso.
Se alguém conhecer alguma solução, avise, por favor.
Alguém conhece alguma forma (extensão) de limitar o número de caracteres e também de aplicar máscaras nos campos texto do Thinlet? Pelo que sei, o toolkit não faz isso.
Se alguém conhecer alguma solução, avise, por favor.
Uma vez que tive de fazer isso, tive de escrever umas “actions” especiais. Não é perfeito (experimente fazer um “paste” nesse campo para ver que meleca vai acontecer). Acho que você entendeu a idéia.
Não escrevi nada com máscaras que eu não tive tempo.
<textfield name="DP05_PARA_DD" text="01" property="type=N" columns="2" halign="left" alignment="right" font="Courier" action="limit(this, DP05_PARA_VALOR, DP05_PARA_MM)" />
<label text="/" />
<textfield name="DP05_PARA_MM" text="11" property="type=N" columns="2" halign="left" alignment="right" font="Courier" action="limit(this, DP05_PARA_DD, DP05_PARA_AAAA)" />
<label text="/" />
<textfield name="DP05_PARA_AAAA" text="2005" property="type=N" columns="4" halign="left" alignment="right" font="Courier" action="limit(this, DP05_PARA_MM, DP05_NDOC)" />
onde "limit" é a seguinte função:
/**
* Ação "limit"
* Note que alguns campos têm 8 dígitos,
* como o de datas, outros têm 12, como de agência/conta, outros têm 19,
* como o de código de depositante. Então a limitação será feita usando
* "columns".
*
* @param field
* O campo (passe "this")
* @param prevField
* O campo anterior (passe o nome; por exemplo, "DP06_DE")
* @param nextField
* O próximo campo (passe o nome; por exemplo, "DP06_DE_DEP")
*/
public void limit(final Object field, final Object prevField,
final Object nextField) {
final int columns = getInteger(field, "columns");
if (columns > 0) {
final String text = getString(field, TEXT);
if (text.length() == columns && nextField != null) {
requestFocusAndSelect(nextField);
} else if (text.length() == 0 && prevField != null) {
requestFocusAndSelect(prevField);
}
}
}
/**
* Efetua um "requestFocus" em um campo e o seleciona completamente.
*
* @param field
* O campo a ser focado e selecionado.
*/
private void requestFocusAndSelect(final Object field) {
requestFocus(field);
final String text = getString(field, TEXT);
if (text != null && text.length() > 0) {
setInteger(field, "start", 0);
setInteger(field, "end", text.length());
}
}
Se eu entendi direito, thingol, bastaria modificar seu código para verificar se o tamanho do textfield é maior que o columns, truncá-lo para o tamanho do columns e emitir um bip nessa situação antes de pular para o próximo campo.
Além disso, para deixar a solução um pouco mais limpa, a classe base para as views poderia varrer os elementos e acrescentar essa action automaticamente a todos os textfields.
Eu preferiria algo do tipo:
Volta e meia alguém modifica o código-fonte do Thinlet para suprir essas carências. (Se você olhar o site do Thinlet há algumas contribuições).
É realmente uma pena que o Thinlet seja simples demais 
Thingol, eu procurei no site do Thinlet (http://thinlet.sourceforge.net/home.html) e não vi muitas contribuições neste sentido, apenas aplicações exemplo (Showcase)… são nestes exemplos que encontro as contribuições ou tem outro site que posso dar uma olhada?
Estou com o mesmo problema em relação às máscaras para resolver, mas tudo fica parecendo meio que uma gambiarra…