Измените заголовки на сетке данных во флэш-памяти с AS3.0.Изменение содержимого в ячейках Datagrid для Marquee - PullRequest
0 голосов
/ 18 ноября 2010

Здравствуйте, коллеги-сценаристы,

Я пытался настроить компонент сетки данных. До сих пор я был в состоянии настроить ячейки, используя собственный cellRenderer. Я хотел бы изменить внешний вид заголовка, используя собственный headerRenderer, но из всех, которые я пытался сделать, не получается.

Это мой текущий код headerRenderer.

package { 
    import fl.controls.dataGridClasses.HeaderRenderer; 
    import flash.text.TextFormat; 
    import flash.filters.BevelFilter; 
    import flash.text.TextField;
    import flash.display.Sprite;

    public class PlayListHeaderRenderer extends HeaderRenderer { 
        public function PlayListHeaderRenderer() { 
            var format:TextFormat = new TextFormat("Arial", 12);
            format.color = 0xffff00;
            format.bold = true;
            var upSkinBg:Sprite = new Sprite();
            upSkinBg.graphics.lineStyle(0.1,0x999999);
            upSkinBg.graphics.beginFill(0x666666);
            upSkinBg.graphics.drawRect(0,0,10,10);
            upSkinBg.graphics.endFill();
            var downSkinBg:Sprite = new Sprite();
            downSkinBg.graphics.lineStyle(0.1,0x999999);
            downSkinBg.graphics.beginFill(0x0000cc);
            downSkinBg.graphics.drawRect(0,0,10,10);
            downSkinBg.graphics.endFill();
            var overSkinBg:Sprite = new Sprite();
            overSkinBg.graphics.lineStyle(0.1,0x999999);
            overSkinBg.graphics.beginFill(0x0000ff);
            overSkinBg.graphics.drawRect(0,0,10,10);
            overSkinBg.graphics.endFill();
            var selectedUpSkinBg:Sprite = new Sprite();
            selectedUpSkinBg.graphics.lineStyle(0.1,0x999999);
            selectedUpSkinBg.graphics.beginFill(0x0000cc);
            selectedUpSkinBg.graphics.drawRect(0,0,10,10);
            selectedUpSkinBg.graphics.endFill();
            var selectedDownSkinBg:Sprite = new Sprite();
            selectedDownSkinBg.graphics.lineStyle(0.1,0x999999);
            selectedDownSkinBg.graphics.beginFill(0x0000cc);
            selectedDownSkinBg.graphics.drawRect(0,0,10,10);
            selectedDownSkinBg.graphics.endFill();
            var selectedOverSkinBg:Sprite = new Sprite();
            selectedOverSkinBg.graphics.lineStyle(0.1,0x999999);
            selectedOverSkinBg.graphics.beginFill(0x0000ff);
            selectedOverSkinBg.graphics.drawRect(0,0,10,10);
            selectedOverSkinBg.graphics.endFill();
            setStyle("textFormat", format);
            setStyle("upSkin", upSkinBg);
            setStyle("downSkin", downSkinBg);
            setStyle("overSkin", overSkinBg);
            setStyle("selectedUpSkin", selectedUpSkinBg);
            setStyle("selectedDownSkin", selectedDownSkinBg);
            setStyle("selectedOverSkin", selectedOverSkinBg);
        } 
    }
}

Внутри моей настоящей программы я делаю что-то вроде:

dgPL.setStyle("headerRenderer", PlayListHeaderRenderer);

, чтобы попытаться установить класс headerRenderer, который я создал, на имя сетки данных dgPL. Но это не работает. Из того, что я нашел в Интернете, класс headerRenderer должен действовать точно так же, как и класс cellRenderer, при разработке и реализации. Я не могу найти примеров людей, использующих пользовательский класс headerRenderer, или примеров того, как его создать. Так что любая помощь будет полезна, если я сообщу, где я ошибся при разработке своего класса или внедрении его в свою программу.

Также я пытаюсь выяснить, как добавить Marquee к ячейкам той же таблицы данных, чтобы, если содержимое в ячейке было слишком длинным для размера ячейки, оно прокручивалось по ячейке, когда пользователь переворачивает список содержания данных. У меня возникли проблемы с выяснением того, как получить новую строку, назначенную для ячейки, без переопределения содержимого поставщика данных для этой конкретной строки в сетке данных.

Из моих поисков в Интернете я нашел способ создать выделение для textFields. Я не могу понять, как применить его к самой сетке данных.

Код для маркизы следующий:

var tf:TextField = new TextField();
tf.defaultTextFormat = dtf;
tf.text = dgPL.getItemAt(evt.rowIndex.toString()).Artist + "                    ";
tf.x = tf.y = 300;
addChild(tf);
var t:Timer = new Timer(200);
t.addEventListener(
    TimerEvent.TIMER,
    function(ev:TimerEvent): void
    {
        tf.text = tf.text.substr(1) + tf.text.charAt(0);
    }
);
t.start();

Прямо сейчас выделение работает, создавая textField и выполняя выделение таким образом, но это не самый эффективный способ сделать это вообще из-за проблем выравнивания при прокрутке содержимого в сетке данных.

Я знаю, как работает Marquee. Я просто не понимаю, как применить этот Marquee к самим ячейкам данных. Я знаю, как захватить содержимое моей ячейки без каких-либо проблем и как переопределить его для работы с выделением. Я просто не уверен, как назначить его обратно самой ячейке, не отменяя постоянно источник данных.

Любая помощь по любой из этих тем будет принята с благодарностью.

С уважением, Тим

1 Ответ

0 голосов
/ 20 ноября 2010

Для вашей первой проблемы.Вам нужно использовать Class, а не instance в качестве аргумента для setStyle.Поэтому вам нужно создать 4 класса на основе Sprite и передать их в setStyle.

Что касается ваших проблем с прокруткой текста, я предлагаю такой небольшой класс:

    package  {
    import fl.controls.listClasses.CellRenderer;
    import flash.events.MouseEvent;
    import flash.events.Event;

    public class ScrolledDataGridCell extends CellRenderer{

        private var mOver:Boolean=false;
        private var active:Boolean=false;
        public function ScrolledDataGridCell() {
            addEventListener(MouseEvent.ROLL_OVER,over);
            addEventListener(MouseEvent.ROLL_OUT,out);

        }
        private function over(e:Event):void{
            mOver=true;
            if(!active&&textField.maxScrollH>0){
                active=true;
                addEventListener(Event.ENTER_FRAME,frame);
            }
        }
        private function out(e:Event):void{
            mOver=false
        }

        private function frame(e:Event):void{
            if(mOver){
                textField.scrollH++;
            }else{ 
                if(textField.scrollH>0){
                    textField.scrollH--;
                }else{
                    if(active){
                        active=false;
                        removeEventListener(Event.ENTER_FRAME,frame);
                    }
                }
            }
        }
    }
}
...