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

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

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

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
По умолчанию Странное поведение текстфилда

Здравствуйте.

Столкнулся с проблемой. Есть Спрайт с кучей текстфилдов.
у них
Код AS3:
selectable = false;
type = DYNAMIC;
По даблклику на спрайте я им всем ставлю:
Код AS3:
selectable = true;
type = INPUT;
т.е. позволяю пользователю редактировать их. Так вот собственно когда они становятся активными и вводимыми - то какая-то хрень с вводом. По полю надо несколько раз кликнуть чтоб можно было что-то ввести. Иначе или курсор не появляется, или стоит, мигает, но ничего не вводится.
При чем если перед тем как поля стали активными в полях этих был какой-то текст, то всё гораздо проще, можно поставить курсор в конце введенного текста. А если пустое, то геморно добиться нормального начала ввода.

Данные из этих полей потом попадают в БД, так вот просматривая БД обнаружил что там вконце каждой строки еще \r пишется. Может это из-за него? Я сейчас его начал обрезать перед записью в БД, до этого были какие-то непонятки. То строки не сравнивались между собой то еще чего-то.


Последний раз редактировалось iNils; 28.11.2010 в 03:46.
Старый 28.11.2010, 11:11
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 2  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
код покажите, как все это делаете

Старый 28.11.2010, 11:13
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 3  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
\r\n - нормальный перенос строки под виндой. В Unix'ах - это просто \n.
Про остальное не скажу - не сталкивался.

Старый 28.11.2010, 12:54
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 4  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
\r это перенос строки на маке
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 28.11.2010, 20:19
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 5  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Цитата:
Сообщение от mikhailk Посмотреть сообщение
код покажите, как все это делаете
Та дохрена там кода.... Неохота вас утруждать длительным чтением и разбором. Если получится как-то нормально обрезать чтоб только нужное осталось - скину конечно.

Цитата:
Сообщение от i.o.
\r\n - нормальный перенос строки под виндой. В Unix'ах - это просто \n.
Про остальное не скажу - не сталкивался.
Ну вот у меня винда, но пишет только \r
Цитата:
\r это перенос строки на маке
И поэтому в базе пишет что переносы строки в формате макинтоше. что-то типа "mac linebreaks detected"
Это рождает еще один вопрос - а как бы указать текстфилдам формат юникода? база в юникоде, амф тоже с юникодом работает. Сейчас я просто эти концы строк обрезаю, а если надо переносы то хтмл <p></p> ставлю (я использую хтмл-текст везде)

//************************
полез пытаться код урезать до читаемых объемов...

Старый 28.11.2010, 20:28
Партизан вне форума Посмотреть профиль Отправить личное сообщение для Партизан Найти все сообщения от Партизан
  № 6  
Ответить с цитированием
Партизан
 
Аватар для Партизан

блогер
Регистрация: Nov 2007
Адрес: Almaty, Moscow
Сообщений: 396
Записей в блоге: 5
Отправить сообщение для Партизан с помощью Skype™
Цитата:
Сообщение от Dukobpa3 Посмотреть сообщение
Это рождает еще один вопрос - а как бы указать текстфилдам формат юникода?
По умолчанию - utf-8
Переносы строк от кодировки не зависят. Меняйте \n\r на <p></p>

Старый 28.11.2010, 20:38
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 7  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
По умолчанию Насобирал исходники.

Вот это класс окна в котором всё происходит.

Код AS3:
private var barPane:MovieClip;
private var barTable:Vector.<Vector.<Object>>;
private var barHeight:int = 0;
 
 
private function initBar(obj:Object):void {
	barTable = new Vector.<Vector.<Object>>();
 
	for (var r:int = 0; r < obj.serverInfo.totalCount; r++ ) {
 
		barTable[r] = new Vector.<Object>(7, true);
 
		//image
		barTable[r][0] = new Object();
		var _request:URLRequest = new URLRequest(SERVER + "Picture/Bar/Beer/" + obj.serverInfo.initialData[r][4]);
		var loader:Loader = new Loader();
		loader.load(_request);
		barTable[r][0].link = new Sprite();
		barTable[r][0].loader = loader;
		barTable[r][0].img = obj.serverInfo.initialData[r][4];
		loader.contentLoaderInfo.addEventListener(Event.COMPLETE, drawImages);
 
		//title/text
		var titleText:MovieClip = new MovieClip();
		var title:AdvTextField = new AdvTextField();
		title.text = obj.serverInfo.initialData[r][0];
		title.width = 600;
		title.height = 20;
		title.setHtmlFormat("HelveticaR", 0x000000, 18);
		titleText.addChild(title);
 
		var text:AdvTextField = new AdvTextField();
		text.text = obj.serverInfo.initialData[r][1];
		text.width = 500;
		text.height = 160;
		text.setHtmlFormat("HelveticaR", 0x000000, 12, "justify");
		text.y = 30;
		titleText.addChild(text);
 
		barTable[r][1] = new Object();
		barTable[r][1].link = titleText;
 
		//cost 
		var costTable:MovieClip = new MovieClip();
		var tfY:int = 10;
		for (var i:int = 0 ; i < 3 ; i ++) {
			var tf:AdvTextField = new AdvTextField();
			tf.text = obj.serverInfo.initialData[r][5 + i]
			tf.y = tfY;
			tf.width = 40;
			tf.setHtmlFormat("HelveticaR", 0x000000, 14, "right");
			costTable.addChild(tf);
 
			var tf1:AdvTextField = new AdvTextField();
			tf1.text = obj.serverInfo.initialData[r][8 + i]
			tf1.y = tfY;
			tf1.x = 60;
			tf1.width = 50;
			tf1.setHtmlFormat("HelveticaR", 0x000000, 14, "left");
			costTable.addChild(tf1);
			tfY += 35;
		}
		var div:Shape = new Shape();
		div.graphics.lineStyle(2, 0xffffff, 0.4);
		div.graphics.moveTo(50, 15);
		div.graphics.lineTo(50, 90);
		costTable.addChild(div);
 
		barTable[r][2] = new Object();
		barTable[r][2].link = costTable;
	}
	drawBar();
}
 
private function drawBar():void {
	barPane = new MovieClip();
	barPane.scrollRect = new Rectangle(0, 0, 800, 480);
	barHeight = -480;
	//это скроллинг, функцию не привожу.
	this.parent.stage.addEventListener(MouseEvent.MOUSE_WHEEL, scrollWheel);
 
	var currY:int = 0;
	for (var r:int = 0; r < barTable.length ; r++ ) {
 
		//var tempRow:MovieClip = new MovieClip();
		//tempRow.x = 85;
 
		//tempRow.addChild(new Panel(775, 155, 0xffffff, 0.4));
		var tempRow:Panel = new Panel(775, 155, 0xffffff, 0.4);
 
		barTable[r][0].link.x = 10;
		barTable[r][0].link.y = 10;
		tempRow.addChild(barTable[r][0].link);
 
		barTable[r][1].link.x = 150;
		barTable[r][1].link.y = 10;
		//barTable[r][1].link.height = 160;
		tempRow.addChild(barTable[r][1].link);
 
		barTable[r][2].link.x = 655;
		barTable[r][2].link.y = 25;
		tempRow.addChild(barTable[r][2].link);
 
		tempRow.updateHeight(155);
 
		tempRow.y = currY;
		currY += tempRow.height + 10;
		barHeight += tempRow.height + 5;
		barPane.addChild(tempRow);
 
		tempRow.addEventListener(MouseEvent.DOUBLE_CLICK, setactiveBeerRow);
		tempRow.doubleClickEnabled = true;
 
		var pane:Panel = new Panel(100, 20);
		var tf:AdvTextField = new AdvTextField();
		tf.text = "Картинка"
		tf.height = 15;
		tf.width = 100;
		tf.x = 5;
		//tf.y = 5;
 
		pane.addChild(tf);
 
		var butBrowse:UniversalButton = new UniversalButton(pane, false, false, browseImage);
		butBrowse.name = String(r);
 
		tempRow.addChild(butBrowse);
		butBrowse.x = 10;
		butBrowse.y = 160;
	}
	barPane.x = 75;
	barPane.y = 196;
	this.addChild(barPane);
	drawButtons();
 
	pane = new Panel(100, 20);
	tf = new AdvTextField();
	tf.text = "Сохранить"
	tf.height = 15;
	tf.width = 100;
 
	pane.addChild(tf);
 
	var butApproove:UniversalButton = new UniversalButton(pane, false, false, saveEditBar);
 
	this.addChild(butApproove);
	butApproove.x = this.width - 220;
	butApproove.y = 173;
	butApproove.name = "saveBar";
 
	pane = new Panel(20, 20);
	tf = new AdvTextField();
	tf.text = "+"
	tf.height = 15;
	tf.width = 15;
	tf.x = 5;
	//tf.y = 5;
 
	pane.addChild(tf);
 
	var butAdd:UniversalButton = new UniversalButton(pane, false, false, addRowBar);
 
	this.addChild(butAdd);
	butAdd.x = this.width - 110;
	butAdd.y = 173;
	butAdd.name = "addBar";
	//********************
 
}
 
private function setactiveBeerRow(e:MouseEvent):void {
	trace(e.target);
	var pane:Panel = e.target as Panel;
	var child:DisplayObject;
 
	for (var i:int = 0; i < pane.numChildren; i++) 
	{
		child = pane.getChildAt(i);
		if (!(child is MovieClip)) continue;
		for (var c:int = 0; c < (child as MovieClip).numChildren ; c++) 
		{
			var childChild:DisplayObject = (child as MovieClip).getChildAt(c);
			if (childChild is AdvTextField) {
				if ((childChild as AdvTextField).selectable == true) continue;
				(childChild as AdvTextField).selectable = true;
				(childChild as AdvTextField).type = TextFieldType.INPUT;
				(childChild as AdvTextField).border = true;
				(childChild as AdvTextField).background = true;
			}
		}
	}
}
В нем фигурирует класс Panel - Это просто спрайт с заливкой, типа плашка на которой всё рисуется, чисто для визуального отображения.

Есть еще один интересный класс: AdvTextField - он екстендит текстфилд, и делает работу с хтмлТекстом в разы проще. Вот его код.
Код AS3:
package classes.utils.mytext
{
	import classes.utils.mytext.*; // это просто просто пакет шрифтов. В этом классе только ряд эмбедов.
	import flash.text.*;
	/**
	 * ...
	 * @author Dukobpa3
	 */
	public class AdvTextField extends TextField
	{
		private static const HEX:String = "0123456789ABCDEF";
 
		public var htmlColor:String;
		public var htmlFont:String;
		public var htmlSize:String;
		public var htmlAlign:String;
 
		private var htmlStyle:HtmlStyles = new HtmlStyles();
 
		public function AdvTextField() 
		{
			super();
			embedFonts = true;
			selectable = false;
			wordWrap = true;
			multiline = true;
			width = 200;
			height = 30;
 
			this.antiAliasType = AntiAliasType.ADVANCED;
 
			this.setHtmlFormat("HelveticaR", 0x000000, 12);
		}
 
		public function conText(s:String,font:String="HelveticaR",color:uint=0xFFFFFF,size:Number=12, align:String = "left"):void
		{
			this.text = s;
			htmlFont = font;
			htmlColor = stringARGB(color);
			htmlSize = String(size);
			htmlAlign = align;
 
			refresh();
		}
 
		private static function getColor(num:Number):Object {
			var ob:Object = {};
 
			ob.a = num >> 24 & 0xFF;
			ob.r = num >> 16 & 0xFF;
			ob.g = num >> 8 & 0xFF;
			ob.b = num & 0xFF;
 
			return ob;
		}
		private static function getHex(n:Number):String {
			return HEX.charAt((n >> 4) & 0xf) + HEX.charAt(n & 0xf);
		}
 
		private static function stringARGB(num:Number):String {
			var col:Object = getColor(num);
 
			var r:String = getHex(col.r);
			var g:String = getHex(col.g);
			var b:String = getHex(col.b);
 
			return String("#" + r.concat(g, b));
		}
 
		override public function set textColor(_color:uint): void {
			super.textColor = _color;
			htmlColor = stringARGB(_color);
			refresh();
		}
 
		override public function set text(_text:String): void {
			super.text = _text;
			refresh();
		}
 
		private function refresh():void {
			this.htmlText = '<font face="' + htmlFont + '" color="' + htmlColor + '" size="' + htmlSize +  '"><p align = "' + htmlAlign + '">' + this.text + '</p></font>';
		}
 
		public function setHtmlFormatObj(_format:Object):void {
			htmlColor = stringARGB(_format.color);
			htmlFont = _format.font;
			htmlSize = String(_format.size);
			htmlAlign = _format.align;
		}
 
		public function setHtmlFormat(font:String="HelveticaR",color:uint=0x000000,size:Number=12, align:String = "left"):void {
			htmlColor = stringARGB(color);
			htmlFont = font;
			htmlSize = String(size);
			htmlAlign = align;
 
			refresh();
		}
	}
 
}
Поидее это всё что относится к вопросу.
Так вот когда я делаю даблклик по панели отрабатывает функция: setactiveBeerRow(e:MouseEvent):void - и делает все текстовые филды на панели вводимыми. Ну и вводить как было сказано в первом сообщении получается как-то проблематично - если до этого там был какой-то текст, то еще более-менее. Можно поставить курсор на уже введенный текст, а если поле пустое, то крайне геморно. Полагаю это из-за непечатаемого символа конца строки, и если я попадаю курсором на него то ничего не происходит, а если перед ним, то всё ок.

Старый 29.11.2010, 18:47
Sylon вне форума Посмотреть профиль Отправить личное сообщение для Sylon Найти все сообщения от Sylon
  № 8  
Ответить с цитированием
Sylon

Регистрация: Nov 2009
Сообщений: 16
Была похожая бяка. Решалось следующим образом: .htmlText не использовать вовсе, ибо работает с массой непредсказуемых глюков, типа левых переносов в конце строки. Всё форматирование только через .setTextFormat(...) - код более громоздкий но по крайней мере работает надёжно.

Если обязательно надо хранить в стринге всё форматирование, лучше использовать .getXMLText(...) и .insertXMLText(...) - представления флеша о XML весьма своеобразные, но это вытерпеть можно, ради отсутствия глюков.

Старый 29.11.2010, 19:05
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 9  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Цитата:
Сообщение от Sylon Посмотреть сообщение
.htmlText не использовать вовсе, ибо работает с массой непредсказуемых глюков
Зато проблем с эмбедом шрифтов меньше

Но да, спасибо за подсказку, попробую. У меня класс адванседТекстФилд оверрайдит сеттер text. Возможно в этом причина.

Старый 29.11.2010, 20:25
Sylon вне форума Посмотреть профиль Отправить личное сообщение для Sylon Найти все сообщения от Sylon
  № 10  
Ответить с цитированием
Sylon

Регистрация: Nov 2009
Сообщений: 16
Цитата:
Сообщение от Dukobpa3 Посмотреть сообщение
...У меня класс адванседТекстФилд оверрайдит сеттер text. Возможно в этом причина.
Маловероятно, хотя не рекомендуется оверрайдить set и оставлять встроенный get (правда, возможные при этом глюки - совсем из другой области - при сериализации объектов). Вообще, нет особого смысла оверрайдить встроенные свойства и методы. Объём от этого не уменьшится, только лишняя головная боль. А вдруг понадобится именно встроенный метод?

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

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

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


 


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


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