PDA

Просмотр полной версии : Работа с текстовыми полями


TuMko
31.05.2013, 13:19
1. Есть 2 текстовых поля infoText1 и infoText2. Как ограничить длину вводимых символов? пробовал прописывать maxChars, но эффекта желаемого не получил.
2. Есть кнопка nextbutton. Как сделать, чтобы она появлялась только тогда, когда в обоих полях есть текст, а если они пустые, то кнопка должна пропадать?


package
{
/**
* ...
* @author 123
*/
import flash.display.*;
import flash.events.*;
import flash.text.*;

public class SendMail extends Sprite
{
private var mailSpite:Sprite = new Sprite();
private var formatMenuScheme:TextFormat = new TextFormat();
private var infoText1:TextField = new TextField();
private var infoText2:TextField = new TextField();

public function SendMail()
{
formatMenuScheme.bold = true;
formatMenuScheme.font = "Tahoma";
formatMenuScheme.size = 16;
formatMenuScheme.color = 0x666666;

var windowFrame:Sprite = new Sprite();
windowFrame.graphics.lineStyle(3, 0x999999);
windowFrame.graphics.beginFill(0xFFFFFF, 1);
windowFrame.graphics.drawRoundRect(150, 180, 540, 130, 15, 15);
windowFrame.graphics.endFill();

infoText1.type = TextFieldType.INPUT;
// infoText1.autoSize = TextFieldAutoSize.LEFT;
infoText1.border = true;
infoText1.borderColor = 0xFF0000;
infoText1.background = true;
infoText1.backgroundColor = 0xCCCCCC;
infoText1.x = 250;
infoText1.y = 210;
infoText1.width = 400;
infoText1.height = 30;
infoText1.maxChars = 25; // количество символов

infoText2.type = TextFieldType.INPUT;
// infoText2.autoSize = TextFieldAutoSize.LEFT;
infoText2.border = true;
infoText2.borderColor = 0xFF0000;
infoText2.background = true;
infoText2.backgroundColor = 0xCCCCCC;
infoText2.x = 250;
infoText2.y = 250;
infoText2.width = 400;
infoText2.height = 30;
infoText2.maxChars = 25; // количество символов

var nextbutton:MiniCustomSimpleButton = new MiniCustomSimpleButton();
nextbutton.x = 400;
nextbutton.y = 350;
var nextButtonText:TextField = new TextField();
nextButtonText.text = "Отправить";
nextButtonText.autoSize = TextFieldAutoSize.CENTER;
nextButtonText.x = 420;
nextButtonText.y = 360;
nextButtonText.setTextFormat(formatMenuScheme);
nextButtonText.mouseEnabled = false; // отвечает за перекрытие - отключено (с. 607)


mailSpite.addChild(nextbutton);
mailSpite.addChild(nextButtonText);
mailSpite.addChild(windowFrame);
mailSpite.addChild(infoText1);
mailSpite.addChild(infoText2);
addChild(mailSpite);

nextbutton.addEventListener (MouseEvent.CLICK, clickNextButton);
infoText1.addEventListener(TextEvent.TEXT_INPUT, infoText1InputListener);
infoText2.addEventListener(TextEvent.TEXT_INPUT, infoText2InputListener);

}

private function infoText1InputListener (e:TextEvent):void {
var infoText1:TextField = TextField (e.target);
e.preventDefault();
infoText1.replaceText(infoText1.caretIndex, infoText1.caretIndex, e.text);


var regularFormat:TextFormat = new TextFormat();
regularFormat.font = "Tahoma";
regularFormat.size = 20;
regularFormat.color = 0x666666;
infoText1.setTextFormat(regularFormat, infoText1.caretIndex, infoText1.caretIndex + e.text.length);

var newCaretIndex:int = infoText1.caretIndex + e.text.length;
infoText1.setSelection(newCaretIndex, newCaretIndex);
trace(infoText1.text);

}

private function infoText2InputListener (e:TextEvent):void {
var infoText2:TextField = TextField (e.target);
e.preventDefault();
infoText2.replaceText(infoText2.caretIndex, infoText2.caretIndex, e.text);


var regularFormat2:TextFormat = new TextFormat();
regularFormat2.font = "Tahoma";
regularFormat2.size = 20;
regularFormat2.color = 0x666666;
infoText2.setTextFormat(regularFormat2, infoText2.caretIndex, infoText2.caretIndex + e.text.length);

var newCaretIndex:int = infoText2.caretIndex + e.text.length;
infoText2.setSelection(newCaretIndex, newCaretIndex);
trace(infoText2.text);

}

private function clickNextButton (e:MouseEvent):void {

}


}

}

Termin
31.05.2013, 13:28
Вопрос 2:
Пологаю создать условие:
if(infoText1.text!=""&& infoText2.text!="")
{
nextbutton.visible = true;
}

Думаю както так)))

Wolsh
31.05.2013, 15:40
TuMko, запомните на будущее: одна тема — один вопрос, и название темы должно отражать суть вопроса максимально конкретно. То есть не "Текстовое поле" и не "Работа с текстовым полем" (что одно и то же), а "Как ограничить кол-во символов в текстовом поле", например.

Final Hope
31.05.2013, 16:04
maxChars работает следующим образом:
Если maxChars = 0, то можно ввести любое количество символов.
Если maxChars = n, то можно ввести (n - 1) количество символов.
То есть, если вы хотите вводить только 5 символов, то нужно задавать maxChars = 6.

TuMko
31.05.2013, 18:59
Termin, спасибо, в принципе помогло, вот только когда удаляю из строк текст, кнопка не сразу становится невидимой, а лишь после того, как я нажму пробел в полях ввода.
Wolsh, я учту на будущее, спасибо.
Final Hope, какое бы значение maxChars я не прописывал, все равно вводится бесконечное число символов. Я писал как в конструкторе, так и в функциях infoText1InputListener и infoText2InputListener, но не работает вообще.

maxkar
31.05.2013, 19:25
Уберите preventDefault и replaceText из обработчиков событий текстового поля и проверьте. Есть у меня подозрения, что в случае maxChars последовательность событий бывает очень и очень интересной.

TuMko
31.05.2013, 22:25
тогда ошибку выдает: [Fault] exception, information=RangeError: Error #2006: The supplied index is out of bounds.
форматирование строк ввода я брал из книги к.мука, так что там по идее все должно быть правильно.

maxkar
31.05.2013, 22:54
Ну да, есть там такое в setSelection. А зачем вообще эти все приседания с текстом? Чего вы хотите добиться? Если я правильно логику понял, defaultTextFormat сделает за вас все, что нужно. Ну и на change можно подписаться, если очень хочется обрабатывать события изменения. И если очень хочется вручную модифицировать textfield, то и длину нужно вручную ограничивать при обновлении.

Termin
31.05.2013, 23:01
TuMko По вопросу 2, вы создайте условие в том слуателе событий где он будет обрабатываться чаще чем событие пробела))) Например в ENTER_FRAME будет проверятся условие в секунду столько раз сколько кадров проигрывается)))

Idon'tKnow
31.05.2013, 23:03
Суть ошибки вот в чём:

Введенное пользователем максимальное число символов, которое может содержать текстовое поле. Сценарий может вставить больше текста, чем допускает maxChars. Свойство maxChars указывает только количество символов, которые может ввести пользователь. Если это свойство имеет значение 0, пользователь может ввести любое количество символов. (с) Adobe

У Вас программа внутри меняет текст, если Вы запретите ей это делать, то пользователь не сможет ввести текст.

Вот, вроде решает. :)

private function infoText1InputListener (e:TextEvent):void {
if (infoText1.length < e.target.maxChars) { // Вот и всё.
var infoText1:TextField = TextField (e.target);
e.preventDefault();
infoText1.replaceText(infoText1.caretIndex, infoText1.caretIndex, e.text);


var regularFormat:TextFormat = new TextFormat();
regularFormat.font = "Tahoma";
regularFormat.size = 20;
regularFormat.color = 0x666666;
infoText1.setTextFormat(regularFormat, infoText1.caretIndex, infoText1.caretIndex + e.text.length);

var newCaretIndex:int = infoText1.caretIndex + e.text.length;
infoText1.setSelection(newCaretIndex, newCaretIndex);
trace(infoText1.text);
}
}

TuMko
31.05.2013, 23:14
Termin, спасибо, учту.
Idon'tKnow, спасибо большое, работает.

maxkar
31.05.2013, 23:47
Idon'tKnow, оно позволяет через ctrl-v и прочие аналоги вставки добавить гораздо больше (добавление атомарное). Поэтому нужно учитывать размер текущего выделения и размер вставляемого текста. А лучше все-таки использовать defaultTextFormat и предоставить полю самому за maxChars следить.

Idon'tKnow
01.06.2013, 01:39
Теперь не даёт.

private function infoText1InputListener (e:TextEvent):void {
if (infoText1.length + e.text.length < infoText1.maxChars) {
var infoText1:TextField = TextField (e.target);
e.preventDefault();
infoText1.replaceText(infoText1.caretIndex, infoText1.caretIndex, e.text);

var regularFormat:TextFormat = new TextFormat();
regularFormat.font = "Tahoma";
regularFormat.size = 20;
regularFormat.color = 0x666666;
infoText1.setTextFormat(regularFormat, infoText1.caretIndex, infoText1.caretIndex + e.text.length);
var newCaretIndex:int = e.currentTarget.length;
infoText1.setSelection(newCaretIndex, newCaretIndex);
}else {
trace("Текст больше максимально допустимой длины!");
// Правда тут стиль придется вставлять, т.к он не вставляется, если 1 символ до вставки сообщения бОльшей, чем допустимая длина, вставить.
}
}

Или обрезать текст: if (textInfo1.length + e.text.length > textInfo1.maxChars) {
lengthTextInfo1 = textInfo1.maxChars....
}

TuMko
01.06.2013, 15:14
в первом случает дает, если ввести на один символ меньше и с помощью вставки (ctrl+v) вставить к примеру 2 символа.
во втором случаем выдало ошибку.

Idon'tKnow
01.06.2013, 15:22
У меня всё отлично работает, maxChars = 5, я ввожу 1234 , ctrl+c (56) , ctrl+v = 12345.

P.S. maxChars должен быть равен максимально разрешимому кол-ву символов, а не максимально разрешимому кол-ву символов +1 ...
P.S.S Поставьте поменьше символов, например, 5 и потестите. У меня всё исправно работает.