Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 29.11.2012, 17:34
lexa2000lexa вне форума Посмотреть профиль Отправить личное сообщение для lexa2000lexa Найти все сообщения от lexa2000lexa
  № 1  
Ответить с цитированием
lexa2000lexa

Регистрация: Sep 2005
Сообщений: 950
По умолчанию Не всегда срабатывает метод getCharBoundaries

Доброго времени суток всем.
Столкнулся с проблемой, не могу понять, в чем проблема.
Опишу задачу в пару словах, необходимо из строки выбрать дроби и отобразить их, все бы хорошо, но при большом количестве цифр числителя или знаменателя перестает корректно работать метод
getCharBoundaries. Привожу кусок рабочего кода с ошибкой.
Код AS3:
var myTextField:TextField;
var myTextFormat:TextFormat = new TextFormat();
var arrayDecimal:Array = new Array();
myTextFormat.size = 20;
myTextFormat.leading = myTextFormat.size;
var str:String = "Для приготовления салата использовали 723333333333333333333/9 кг огурцов, помидоров на 2/9 кг меньше, чем огурцов, а перца на 878754554656565555555555555555527423423423/9 кг больше. Сколько килограммов огурцов и помидоров и перца использовали для приготовления салата?";
createProblemSituation()
function createProblemSituation()
{
	var _index:int = str.indexOf("/");
	if (_index!=-1)
	{
		var pattern:RegExp = new RegExp(/([0-9]+)\/([0-9]+)/g);
		str = str.replace(pattern,replaceStr);
	}
	myTextField = createText(str,0,0,550);
	this.addChild(myTextField);
	searcSymbol(arrayDecimal);
}
function replaceStr():String
{
	var n:uint = Math.max(arguments[1].length,arguments[2].length);
	var _obj:Object = {length:n,numerator:arguments[1],denominator:arguments[2]};
	arrayDecimal.push(_obj);
	var _str:String = "–";
	while (n!=1)
	{
		_str +=  "–";
		n--;
	}
	return _str;
}
function searcSymbol(array:Array):void
{
	var _index:int = 0;
	var _frame:Rectangle;
	//var _spotlight:Shape;
	var _numerator:TextField;
	var _denominator:TextField;
	trace(myTextField.text.length);
	for (var i:uint = 0; i<array.length; i++)
	{
		_index = myTextField.text.indexOf('–',_index);
		if (_index!=-1)
		{
			_frame = myTextField.getCharBoundaries(_index);
			trace(_frame,_index);
			_numerator = createText(array[i].numerator,(_frame.x - _frame.width/5),(_frame.y - _frame.height/2));
			_denominator = createText(array[i].denominator,(_frame.x - _frame.width/5),(_frame.y + _frame.height/2));
			this.addChild(_numerator);
			this.addChild(_denominator);
			_index += array[i].length;
		}
	}
}
function createText(str:String,x:int=0,y:int=0,w:uint=0):TextField
{
	var _txt:TextField = new TextField();
	_txt.x = x;
	_txt.y = y;
	//_txt.border = true;
	_txt.selectable = false;
	_txt.autoSize = TextFieldAutoSize.LEFT;
	_txt.multiline = true;
	if(w!=0){
		_txt.wordWrap = true;
		_txt.width = w;
	}
	_txt.text = str;
	_txt.setTextFormat(myTextFormat);
	return _txt;
}

Создать новую тему Ответ Часовой пояс GMT +4, время: 15:20.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 15:20.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.