PDA

Просмотр полной версии : TextField особое редактирование текста


Andrew_J
06.11.2008, 15:45
Есть массив мувиков, в которых содержатся textfield'ы. Записываю в них слова с пропусками букв, например так "сл_во с п_опу_ком", т.е. на месте пропусков "_". Нужно сделать так чтобы при редактировании вводились только буквы вместо пропусков и при стирании удалялись только они (заменялись на "_").
Т.е. длина текста в буквах постоянна.

Подскажите как это грамотно сделать, сравнивать при вводе текст до и текст после, или считывать с клавы символы и анализировать?

И как отключить выделение текста в текстфилде, вставку, копирование и пр.

Просто начал делать, использую все события уже:
TextField.onChanged
TextField.onKillFocus
TextField.onScroller
TextField.onSetFocus,
а баги всеравно вылезают :(

Если нужно кину исходничек потом.

Mnilionic
06.11.2008, 16:56
Можно попробовать отслеживать позицию курсора и в звисисмости от положение редактировать/не редактировать поле.
Можно разбить textfielв на несколько маленьких textfield в местох пропусков.

попробуйте так и так

chingachgoog
06.11.2008, 19:09
Баги - это нормально :)
может это поможет:
http://flasher.ru/forum/showthread.php?t=101700

Andrew_J
06.11.2008, 20:25
Mnilionic, я в общем то и стал делать по первому способу, даже все получилось, но! при переходе от одного текст филда в другой, иногда прога считала что я уже в ругом текстфилде, а текст писался в предыдущем уже, на этом я и остановился.
Последовательность срабатывания событий непонятная, если делать все неспешно то работает, а стресс тест не проходит, не успевает там чтото.
Разбить текстфилд на несколько, тоже думал, но остановился как на запасном варианте, если уж ничто не поможет.

chingachgoog, чтото подобное я и творю, я кстати сделал для того чтобы это работало мувик, а в нем текстфилд, потом вешаю на него onRelease, при срабатывании которого onRelease удаляется, а курсор переходит в текстифлде на нужное место :)

У меня ещё такая проблема, курсор в текстфилде, на нем обработчик onChange, что если я ввожу символ, то в текстфилде он удаляется. Далее есть кнопка btn_check, которая удаляет все обрабочики текстфилда и делает Selection.setFocus(null).
Вот, если зажать кнопку ввода "F" к примеру нак клаве и нажать на btn_check мышкой, то обработчики не дающие написать символы в филде снимаются и пока фокус не пропал вписывается один символ всегда, т.е. фокус с текстфилда не мгновенно уходит, почему?

Mnilionic
07.11.2008, 05:07
вариант с разбитым полем.
без оптимизации, как пример
var str = 'сл_во с п_опу_ком';
var separator = '_';


// разбиваем строку с пропусками
var sub_strs = str.split(separator);
var inputs = new Array();


// формат текста
var fmt = new TextFormat();
with(fmt){
font = 'Courier New'; size = 20; color = 0x000000; align = 'center';
}
// формат разделителя
var _fmt = new TextFormat();
with(_fmt){
font = 'Courier New'; size = 20; color = 0xFF0000; align = 'center';
}

var extent = _fmt.getTextExtent('Ш'); // широкая буква
// определения
var offset = extent.textFieldWidth - extent.width;
var separator_width = extent.textFieldWidth + offset * 2; // скролится горизонтально почему-то
var separator_height = extent.textFieldHeight;





// _x координата очередного поля
var sx = 20;
for( var i = 0; i< sub_strs.length; i++){
// создаём часть строки
var tf = this.createTextField('part_'+i, this.getNextHighestDepth(), sx , 50, 1, 1);
with(tf){
setNewTextFormat(fmt);
text = sub_strs[i];
autoSize = true;
selectable = false;
sx += _width - offset * 2;
}

if( sub_strs.length == i+1) break;

// создаем поле ввода с разделителем
var _tf = this.createTextField('_part_'+i, this.getNextHighestDepth(), sx , 50, separator_width, separator_height);
with(_tf){
setNewTextFormat(_fmt);
type = "input";
text = separator;
maxChars = separator.length;
sx += _width - offset * 2;
}

// события удобств
_tf.index = inputs.length;
inputs.push(_tf);
_tf.onSetFocus = selectSeparator
_tf.onKillFocus = checkSeparator;
_tf.onChanged = checkJump;
}


function selectSeparator(){

}

function checkSeparator(){
if(this.text == '' || this.text == separator) this.text = separator;
}

function checkJump(){
if(this.text != '' && this.text != separator) jump(this.index + 1);
}

function jump(index){
var tf = inputs[index] || inputs[0];
if(tf.text == separator ) tf.text = '';
Selection.setFocus(tf);
}

Andrew_J
08.11.2008, 23:38
Mnilionic, спасибо за пример, наверно так и сделаю, тут меньше исключительных ситуаций, к-е надо предусматреть.

Добавлено через 40 часов 21 минуту
Спрошу в этой теме,
Есть редактируемый текстфилд, курсор в нем, можно ли как по кнопке сделать так, чтобы после её нажатия в текст филде писать было нельзя?

Скажу сразу, я испробовал десятки методов, ничто не дало результата, только удаление филда :(

Mnilionic
10.11.2008, 16:54
my_btn.onPress = function(){
my_tf.type = 'dynamic';
}

не помогает?

Andrew_J
11.11.2008, 01:16
Если это единственный способ, то плохо, у меня после смены типа были проблемы потом с этими текстфилдами :(

dimarik
11.11.2008, 01:23
chingachgoog, а как Вы там (http://flasher.ru/forum/showthread.php?t=101700) порешали?

Mnilionic
11.11.2008, 03:31
Andrew_J, какие проблемы?

ну почему единственный. Можно поверх поля вешать кнопку, незабыв отключить .tabEnabled у поля и .useHandCursor у кнопки ;)

chingachgoog
11.11.2008, 14:24
chingachgoog, а как Вы там (http://flasher.ru/forum/showthread.php?t=101700) порешали?

Не помню уже. :)