March 25th, 2008 by graann

Константин Ковалев предложил более простой и изящный вариант решения проблемы затронутой мною в предыдущем посте.

Суть решения заключается в использовании метатега RemoteClass в классе сохраняемого объекта. Т.е registerClassAlias не требуется. Код ниже:

XML:

<mx:Application
  creationComplete="onCreationComplete()"
  xmlns:mx="http://www.adobe.com/2006/mxml"
  layout="vertical">
  <mx:Script>
    <![CDATA[
      import com.riapriority.tests.DataObject;
      
      private var so:SharedObject;
      private var dataObject:DataObject;
  
  
      private function onCreationComplete(): void
      {
        dataObject = new DataObject();
        so = SharedObject.getLocal ("test");
      }
  
  
      private function dataObjectGeneration (): void
      {
        dataObject.generate();
        ta.text += 'GENERATING: ' + dataObject.toString() + '\n';
      }
  
      private function saveLocalData(): void
      {
        so.data.DataObject = dataObject;
        so.flush();
        ta.text += 'SAVE: ' + dataObject.toString() + '\n';
      }
  
      private function loadLocalData(): void
      {
        so = SharedObject.getLocal('test');
        if(so.data.DataObject != null)
        {
          dataObject = so.data.DataObject as DataObject;
          ta.text += 'LOAD: ' + dataObject.toString() + '\n';
        }
        else
        {
          ta.text += 'LOAD: null\n';
        }
      }
    ]]>
  </mx:Script>
  
  <mx:Button
    label="Generate"
    click="{dataObjectGeneration()}"/>
  <mx:Button
    label="Save"
    click="{saveLocalData()}"/>
  <mx:Button
    label="Load"
    click="{loadLocalData()}"/>
  <mx:TextArea
    width="50%"
    height="50%"
    id="ta"/>
</mx:Application>

и код класса

  1. package com.riapriority.tests
  2. {
  3.         import mx.formatters.DateFormatter;
  4.        
  5.         [Bindable]
  6.         [RemoteClass(alias="com.riapriority.tests.DataObject")]
  7.         public class DataObject
  8.         {
  9.                 public var date: Date;
  10.                 public var random: String;
  11.  
  12.                 public function generate(): void
  13.                 {
  14.                         date = new Date();
  15.                         random = "" + Math.random() * 10000;
  16.                 }
  17.  
  18.                 public function toString():String
  19.                 {
  20.                         var df:DateFormatter = new DateFormatter ();
  21.                         df.formatString = "JJ:NN:SS DD/MM/YYYY";
  22.                         return "\n  date: " + df.format(date) + "\n  random: " + random;
  23.                 }
  24.         }
  25. }

[Bindable] здесь не обязателен, но как тонко выразился Константин,
класс без [Bindable], что штопор без бутылки :)

Upd: Работает только с публичными свойствами (касается так же вложенных объектов). Вложенные объекты так же должны быть снабжены метатегом RemoteClass.

Bookmark this article at

March 24th, 2008 by graann

Продолжу тему затронутую Александром Гаховым в статье Клонирование объектов утилитой ObjectUtil.copy.

Здесь я приведу пример использования registerClassAlias для восстановления объектов определенного класса из SharedObject. Суть проблемы заключалась в том, что помещенные в SharedObject экземпляры определенного класса при перезапуске возвращались, как экземпляры класса Object. Когда я столкнулась с этой проблемой, доступного для понимания примера мне нагуглить не удалось. Перед размещением же поста, я нашла вопрос по этой теме в ruFlex, однако приведенный там пример показался мне не вполне наглядным. Предлагаю вашему вниманию свой пример решения этой проблемы:

XML:

<mx:Application creationComplete="onCreationComplete()" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
  import src.DataObject;
  import flash.net.*;
  
  private var so: SharedObject;
  private var dataObject: DataObject;
 
  
  private function onCreationComplete(): void
  {
    dataObject=new DataObject();
    registerClassAlias('src.DataObject', DataObject);    
    so = SharedObject.getLocal("test");
  }
  
  
  private function dataObjectGeneration(): void
  {
    dataObject.generate();
    ta.htmlText+='GENERATION: '+dataObject.toString()+'\n';
  }
  
  private function saveLocalData(): void
  {
    so.data.DataObject=dataObject;
    so.flush();
    ta.htmlText+='SAVE: '+dataObject.toString()+'\n';
  }
  
  
  
  private function loadLocalData(): void
  {
    so = SharedObject.getLocal('test');
    if(so.data.DataObject!=null)
    {
      dataObject=so.data.DataObject as DataObject;
      ta.htmlText+='LOAD: '+dataObject.toString()+'\n';
    } else {
      ta.htmlText+='LOAD: null\n';
    }
  }
  
]]>
</mx:Script>
<mx:Button x="193" y="27" label="save" id="save_" click="{saveLocalData()}"/>
<mx:Button x="107" y="27" label="generate" id="generate" click="{dataObjectGeneration()}"/>
<mx:Button x="49" y="27" label="load" id="load_" click="{loadLocalData()}"/>
<mx:TextArea x="49" y="57" height="141" width="618" id="ta"/>
</mx:Application>

Собственно сам класс нашего объекта.

  1. ackage src
  2. {
  3.         import mx.formatters.DateFormatter;
  4.        
  5.         public class DataObject
  6.         {
  7.                 public var date: Date;
  8.                 public var random: String;
  9.                
  10.                 public function DataObject()
  11.                 {
  12.                        
  13.                 }
  14.                
  15.                 public function generate(): void
  16.                 {
  17.                         date=new Date();
  18.                         random=""+Math.random()*10000;
  19.                 }
  20.                
  21.                 public function toString():String
  22.                 {
  23.                         var df: DateFormatter=new DateFormatter();
  24.                         df.formatString="JJ:NN:SS DD/MM/YYYY";
  25.                         return "\n  date: "+df.format(date)+"\n  random: "+random;
  26.                 }
  27.         }
  28. }

Прошу прощения за подобное отображение mxml-ины. Если пример вас заинтересует скопируйте его. :)

Bookmark this article at

January 31st, 2008 by graann

Путь скинизации посредством css тернист и многотруден. Особенно если каждый стиль требуют собственных скинов для виджетов (иконок, кнопок и т.д). Предположим нам надо подгрузить картинку. Для примера создадим класс наследованный от UIComponent и требующий подгрузки картинки описанной в css. Назовем класс Example.as.

Стили для него описаны в одноименном блоке стиля. (вы разумеется знаете, что стили цепляются к одноименной компоненте автоматом и не требуют каких-то дополнительных директив?)

Казалось бы чего проще?…

XML:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="src.*">
    <!−− так конечно делать не надо, но для примера покатит :) с css будет так же!−−>
    <mx:Style>
        Example{image: Embed("graphics/image.png");}
    </mx:Style>
    <ns1:Example x="42" y="24"/>
</ns1:Example></mx:Application>
  1. package src
  2. {
  3.        import mx.core.UIComponent;
  4.        import mx.controls.Image;
  5.  
  6.        public class Example extends UIComponent
  7.        {
  8.                private var image: Image;
  9.                
  10.                public function Example()
  11.                {
  12.  
  13.                }
  14.                
  15.                override protected function createChildren(): void
  16.                {
  17.                        super.createChildren();
  18.                        image=new Image();
  19.                        image.source=getStyle("image");
  20.                        addChild(image);
  21.                }
  22.                
  23.        }
  24. }

И после компиляции картинку благополучно не видим. Почему? Потому, что по умолчанию ее размеры составляют 0 x 0. Для того чтобы она отобразилась корректно требуется задать ей реальные размеры, каковые нам любезно предоставляют свойства measuredWidth и measuredHeight. Однако актуальные значения ширины и высоты будут доступны только после вызова метода protected function measure(): void UIComponent, о котором доступна подробная информация в хелпе.

Ну и собственно результат:

  1. package src
  2. {
  3. import mx.core.UIComponent;
  4. import mx.controls.Image;
  5.  
  6. public class Example extends UIComponent
  7. {
  8.         private var image: Image;
  9.        
  10.         public function Example()
  11.         {
  12.         }
  13.                
  14.         override protected function createChildren(): void
  15.         {
  16.                 super.createChildren();
  17.                 image=new Image();
  18.                 image.source=getStyle("image");
  19.                 addChild(image);
  20.         }
  21.  
  22.         override protected function measure():void
  23.         {
  24.                 super.measure();
  25.                 image.setActualSize(image.measuredWidth, image.measuredHeight);
  26.         }
  27.        
  28. }

Следует отметить, что подобных проблем с размерами не возникает в mxml-e.

Bookmark this article at

September 7th, 2007 by graann September 6th, 2007 by graann

Сегодня у Константина Палыча день рождения!

Поздравляю!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Счастье у тебя уже есть, поэтому дальнейших творческих узбеков тебе, Костик, и чтобы твое здоровье тебе ни в чем не отказывало! :)

Bookmark this article at

August 16th, 2007 by graann

По ряду причин была вынуждена установить на свою рабочую машину Vista. Расскажу о тех проблемах, с которыми столкнулась в ходе установки flex builder2 под Vista. Сразу оговорюсь переходить на 3-й builder мы не стали т.к он бета и показался нам не стабильным.

Проблема раз. Попытка установить второй билдер под eclipse 3.3:

Проблема два. Вернее легкое неудобство. В процессе установки инсталятор отказался демонстрировать контролы. Просто не отображал. Устанавливать пришлось на автопилоте руководствуясь подсознанием. Установила. Честно признаюсь не с первого раза.

Update установила.

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

Установила subclips.

Последняя капля. Эклипс периодически вылетал с предупреждением следующего вида

В debugg-режиме с прерываниями он вылетал постоянно. Переставляла builder и java. Не помогло.

Bookmark this article at

August 16th, 2007 by graann

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

Bookmark this article at