|
|
|||||
Странное поведение текстфилда
Здравствуйте.
Столкнулся с проблемой. Есть Спрайт с кучей текстфилдов. у них По даблклику на спрайте я им всем ставлю: т.е. позволяю пользователю редактировать их. Так вот собственно когда они становятся активными и вводимыми - то какая-то хрень с вводом. По полю надо несколько раз кликнуть чтоб можно было что-то ввести. Иначе или курсор не появляется, или стоит, мигает, но ничего не вводится. При чем если перед тем как поля стали активными в полях этих был какой-то текст, то всё гораздо проще, можно поставить курсор в конце введенного текста. А если пустое, то геморно добиться нормального начала ввода. Данные из этих полей потом попадают в БД, так вот просматривая БД обнаружил что там вконце каждой строки еще \r пишется. Может это из-за него? Я сейчас его начал обрезать перед записью в БД, до этого были какие-то непонятки. То строки не сравнивались между собой то еще чего-то. Последний раз редактировалось iNils; 28.11.2010 в 03:46. |
|
|||||
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
код покажите, как все это делаете
|
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
\r\n - нормальный перенос строки под виндой. В Unix'ах - это просто \n.
Про остальное не скажу - не сталкивался.
__________________
Загружаем картинки, минуя ошибки безопасности |
|
|||||
Та дохрена там кода.... Неохота вас утруждать длительным чтением и разбором. Если получится как-то нормально обрезать чтоб только нужное осталось - скину конечно.
Цитата:
Цитата:
Это рождает еще один вопрос - а как бы указать текстфилдам формат юникода? база в юникоде, амф тоже с юникодом работает. Сейчас я просто эти концы строк обрезаю, а если надо переносы то хтмл <p></p> ставлю (я использую хтмл-текст везде) //************************ полез пытаться код урезать до читаемых объемов... |
|
|||||
Насобирал исходники.
Вот это класс окна в котором всё происходит.
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; } } } } Есть еще один интересный класс: AdvTextField - он екстендит текстфилд, и делает работу с хтмлТекстом в разы проще. Вот его код. 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 - и делает все текстовые филды на панели вводимыми. Ну и вводить как было сказано в первом сообщении получается как-то проблематично - если до этого там был какой-то текст, то еще более-менее. Можно поставить курсор на уже введенный текст, а если поле пустое, то крайне геморно. Полагаю это из-за непечатаемого символа конца строки, и если я попадаю курсором на него то ничего не происходит, а если перед ним, то всё ок. |
|
|||||
Регистрация: Nov 2009
Сообщений: 16
|
Была похожая бяка. Решалось следующим образом: .htmlText не использовать вовсе, ибо работает с массой непредсказуемых глюков, типа левых переносов в конце строки. Всё форматирование только через .setTextFormat(...) - код более громоздкий но по крайней мере работает надёжно.
Если обязательно надо хранить в стринге всё форматирование, лучше использовать .getXMLText(...) и .insertXMLText(...) - представления флеша о XML весьма своеобразные, но это вытерпеть можно, ради отсутствия глюков. |
|
|||||
Цитата:
Но да, спасибо за подсказку, попробую. У меня класс адванседТекстФилд оверрайдит сеттер text. Возможно в этом причина. |
|
|||||
Регистрация: Nov 2009
Сообщений: 16
|
Маловероятно, хотя не рекомендуется оверрайдить set и оставлять встроенный get (правда, возможные при этом глюки - совсем из другой области - при сериализации объектов). Вообще, нет особого смысла оверрайдить встроенные свойства и методы. Объём от этого не уменьшится, только лишняя головная боль. А вдруг понадобится именно встроенный метод?
|
Часовой пояс GMT +4, время: 23:13. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|