Pessoal,
Primeiramente desculpem a pretenção no título do email, mas incluí a
palavra enviando pois se não a maioria das pessoas iria achar que
estou solicitando um componente de máscara.
Fiz um componente de data que está funcionando muito bem, porém está
bem "engessado" aceitando apenas o formato dd/mm/yyyy. Por isso estou
disponibilizando para uso e se alguma alma caridosa se inspirar e
quiser melhorá-lo e talvez até dinamizar o formato da máscara o código
está aí.
Uma coisa que acho que ficou nesse componente é que você pode
trabalhar diretamente com dados do tipo Date e não com a propriedade
text do componente.
Segue abaixo o código, se alguém quiser o arquivo posso enviar também.
Lembro que foi feito a "marretada" então tem coisas que com certeza
podem ser melhoradas.
package {
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import mx.controls.TextInput;
import mx.formatters.DateFormatter;
public class ERKDateInput extends TextInput {
private var _text:String = "";
private var _textFormated:String = "";
[Inspectable(defaultValue="false", enumeration="true,false",
category="ERK")]
private var _keepInitial:Boolean = false; // Verifica se o valor
inicial deve ser setado quando chamado o metodo reset
private var _initialValue:Date = null; // Armazena o primeiro
valor
setado no componente para setar novamente quando o metodo reset for
invocado e quando _keepInitial for verdadeiro
[Inspectable(defaultValue="false", enumeration="true,false",
category="ERK")]
private var _controlavel:Boolean = true;
public function ERKDateInput() {
super();
}
override protected function childrenCreated():void {
super.childrenCreated();
this.width = 80;
this.addEventListener(KeyboardEvent.KEY_DOWN,
_onKeyDown);
this.formatar();
}
private function _onKeyDown(event:KeyboardEvent):void {
var ini:int = selectionBeginIndex; // inicio da selecao
var fim:int = selectionEndIndex; // fim da selecao
if (event.keyCode == Keyboard.BACKSPACE) {
var limiteAuxIni:int = 0;
var inicioAuxFim:int = 0;
if (fim - ini > 0) {
if (ini >= 6) {
limiteAuxIni = ini - 2;
} else if (ini >= 3) {
limiteAuxIni = ini - 1;
} else {
limiteAuxIni = ini - 0;
}
if (fim >= 6) {
inicioAuxFim = fim - 2;
} else if (fim >= 3) {
inicioAuxFim = fim - 1;
} else {
inicioAuxFim = fim - 0;
}
} else {
if (ini >= 6) {
limiteAuxIni = ini - 1 - 2;
} else if (ini >= 3) {
limiteAuxIni = ini - 1 - 1;
} else {
limiteAuxIni = ini - 1 - 0;
}
if (fim >= 6) {
inicioAuxFim = fim - 2;
} else if (fim >= 3) {
inicioAuxFim = fim - 1;
} else {
inicioAuxFim = fim - 0;
}
}
var auxIni:String = this._text.substring(0,
limiteAuxIni);
var auxFim:String =
this._text.substring(inicioAuxFim,
this._text.length);
this._text = auxIni.concat(auxFim);
// Definindo a posicao do cursor
if (ini == 6) {
this.selectionBeginIndex = 4;
this.selectionEndIndex = 4;
} else if (ini == 3) {
this.selectionBeginIndex = 1;
this.selectionEndIndex = 1;
}
} else if (event.keyCode == Keyboard.DELETE) {
var limiteAuxIni:int = 0;
var inicioAuxFim:int = 0;
if (fim - ini > 0) {
if (ini >= 6) {
limiteAuxIni = ini - 2;
} else if (ini >= 3) {
limiteAuxIni = ini - 1;
} else {
limiteAuxIni = ini - 0;
}
if (fim >= 6) {
inicioAuxFim = fim - 2;
} else if (fim >= 3) {
inicioAuxFim = fim - 1;
} else {
inicioAuxFim = fim - 0;
}
} else {
if (ini >= 6) {
limiteAuxIni = ini - 2;
} else if (ini >= 3) {
limiteAuxIni = ini - 1;
} else {
limiteAuxIni = ini - 0;
}
if (fim >= 6) {
inicioAuxFim = fim + 1 - 2;
} else if (fim >= 3) {
inicioAuxFim = fim + 1 - 1;
} else {
inicioAuxFim = fim + 1 - 0;
}
}
var auxIni:String = this._text.substring(0,
limiteAuxIni);
var auxFim:String =
this._text.substring(inicioAuxFim,
this._text.length);
this._text = auxIni.concat(auxFim);
} else if (event.keyCode >= Keyboard.NUMPAD_0 &&
event.keyCode <=
Keyboard.NUMPAD_9) {
var digitado:String = null;
if (ini >= 6) {
ini -= 2;
} else if (ini >= 3) {
ini--;
}
if (fim >= 6) {
fim -= 2;
} else if (fim >= 3) {
fim--;
}
if (event.keyCode == Keyboard.NUMPAD_0) {
digitado = "0"; }
else if (event.keyCode == Keyboard.NUMPAD_1) {
digitado = "1"; }
else if (event.keyCode == Keyboard.NUMPAD_2) {
digitado = "2"; }
else if (event.keyCode == Keyboard.NUMPAD_3) {
digitado = "3"; }
else if (event.keyCode == Keyboard.NUMPAD_4) {
digitado = "4"; }
else if (event.keyCode == Keyboard.NUMPAD_5) {
digitado = "5"; }
else if (event.keyCode == Keyboard.NUMPAD_6) {
digitado = "6"; }
else if (event.keyCode == Keyboard.NUMPAD_7) {
digitado = "7"; }
else if (event.keyCode == Keyboard.NUMPAD_8) {
digitado = "8"; }
else if (event.keyCode == Keyboard.NUMPAD_9) {
digitado = "9"; }
// Verificando se tem selecao e alterando o
valor selecionado ou
// se nao ha selecao e eh apenas para adicionar
o valor digitado.
if (fim - ini > 0) {
if (digitado != null) {
var auxIni:String =
this._text.substring(0, ini);
var auxFim:String =
this._text.substring(fim,
this._text.length);
auxIni =
auxIni.concat(digitado);
this._text =
auxIni.concat(auxFim);
} else if (event.keyCode ==
Keyboard.BACKSPACE || event.keyCode
== Keyboard.DELETE) {
var auxIni:String =
this._text.substring(0, ini);
var auxFim:String =
this._text.substring(fim,
this._text.length);
this._text =
auxIni.concat(auxFim);
}
} else {
// So sera adicionado o caracter
digitado se nao houver valor
apos o cursor
// ou se o texto apos ainda poder ser
deloscado
if (this._text.charAt(ini) == null ||
this._text.charAt(ini) ==
"" || this._text.length + 1 <= 8) {
if (digitado != null) {
var auxIni:String =
this._text.substring(0, ini);
var auxFim:String =
this._text.substring(fim,
this._text.length);
auxIni =
auxIni.concat(digitado);
this._text =
auxIni.concat(auxFim);
}
}
}
// Definindo a posicao do cursor
if (ini == 3) {
this.selectionBeginIndex = 6;
this.selectionEndIndex = 6;
} else if (ini == 1) {
this.selectionBeginIndex = 3;
this.selectionEndIndex = 3;
}
}
this._text = this._text.substr(0, 8);
this.formatar();
}
private function formatar():void {
var aux:String = "";
var posInText:int = 0;
for (var i:int = 0; i < 10; i++) {
if (i == 2 || i == 5) {
aux = aux.concat("/");
posInText--;
} else {
if (this._text.length >= (posInText +
1)) {
aux =
aux.concat(this._text.charAt(posInText));
} else {
aux = aux.concat("_");
}
}
posInText++;
}
this._textFormated = aux;
this.invalidateDisplayList();
}
override protected function
updateDisplayList(unscaledWidth:Number,
unscaledHeight:Number):void {
super.updateDisplayList(unscaledWidth, unscaledHeight);
this.text = this._textFormated;
this.dispatchEvent(new Event("dateChange"));
}
public function set date(value:Date):void {
if (this._keepInitial && this._initialValue == null) {
this._initialValue = value;
}
var dateFormatter:DateFormatter = new DateFormatter();
dateFormatter.formatString = "DDMMYYYY";
this._text = dateFormatter.format(value);
this.formatar();
}
[Bindable("dateChange")]
public function get date():Date {
trace(">>>>>>> DateChange");
trace(this._text);
if (this._text.length == 8) {
var dia:int = int(this._text.substr(0, 2));
var mes:int = int(this._text.substr(2, 2)) - 1;
// Mes inicia em 0
(zero)
var ano:int = int(this._text.substr(4, 4));
var date:Date = new Date(ano, mes, dia);
trace("Retornou: " + date);
return date;
} else {
trace("Retornou: " + null);
return null;
}
}
public function reset():void {
if (this._keepInitial) {
this.date = this._initialValue;
} else {
this.date = null;
}
}
public function set controlavel(value:Boolean):void {
this._controlavel = value;
}
public function get controlavel():Boolean {
return this._controlavel;
}
public function set keepInitial(value:Boolean):void {
this._keepInitial = value;
}
public function get keepInitial():Boolean {
return this._keepInitial;
}
}
}
--~--~---------~--~----~------------~-------~--~----~
Você recebeu esta mensagem porque está inscrito na lista "flexdev"
Para enviar uma mensagem, envie um e-mail para [email protected]
Para sair da lista, envie um email em branco para
[email protected]
Mais opções estão disponíveis em http://groups.google.com/group/flexdev
-~----------~----~----~----~------~----~------~--~---