← All posts tagged Flex

yzh44yzh
Flex Забавная хрень: делаем в swf-модуле
protected var log : ILogger = Log.getLogger("Whiteboard");

загружаем модуль в основное приложение, и имеем
ERROR ModuleLoader : TypeError: Error #1034: Type Coercion failed: cannot convert mx.styles::StyleManagerImpl@aff09f39 to mx.styles.IStyleManager2.
at mx.styles::StyleManager$/get impl()[C:\autobuild\3.5.0\frameworks\projects\framework\src\mx\styles\StyleManager.as:78]
at mx.styles::StyleManager$/getStyleDeclaration()[C:\autobuild\3.5.0\frameworks\projects\framework\src\mx\styles\StyleManager.as:187]
at Whiteboard/http://www.adobe.com/2006/flex/mx/internal::_Whiteboard_StylesInit()[/home/yura/IdeaProjects/flashcoms/client_apps/cwhiteboard/src/Whiteboard.mxml:0]
at Whiteboard()[/home/yura/IdeaProjects/flashcoms/client_apps/cwhiteboard/src/Whiteboard.mxml:30]
at _Whiteboard_mx_core_FlexModuleFactory/create()

Вот интересно, каким боком logger мешает StyleManager? Забавные такие эти Адобы
yzh44yzh
Flex Erlang Вот пишу паралельно клиентскую и сервеную часть, и замечаю такую вещь: в клиентской части нужно постоянно перемещаться между файлами, создавать новые, туда-сюда прыгать. В серверной части открыл один файл и пишешь в нем.

В клиентской части возможности IDEA нужно юзать на полную катушку. В серверной части хватает минимального знания Emacs :)
yzh44yzh
Flex внезапно оказывается, что свойство value не срабатывает
<s:VSlider id="slVolume"
minimum="0" maximum="1" value="0.5" stepSize="0.1"/>
показывает value=1

делаю так
<s:VSlider id="slVolume" creationComplete="{slVolume.value = 0.5 }"
minimum="0" maximum="1" stepSize="0.1"/>
тогда работает
yzh44yzh
Flex А кто мне подскажет, как корректно удалить элемент из ArrayCollection? Мы находим индекс элемента в коллекции, пытаемся вызывать removeItemAt и получаем RangeError
var index : int = findUserIndex(user.id);
if(index != -1)
{
users.removeItemAt(index);
Похоже это бывает, если на коллекцию наложен фильтр. Причем index здесь больше 0 и меньше collection.length

Пока заткнул хаком
var index : int = findUserIndex(user.id);
if(index != -1)
{
try
{
users.removeItemAt(index);
}
catch(e : RangeError)
{
users.source.splice(index);
}
и полезу в сорцы ArrayCollection :)
yzh44yzh
Flex Ну вот, дошло дело до monkey patching, ибо логика, которую мне нужно было переопределить, была приватная, и наследованием никак было не обойти.
yzh44yzh
Flex Ересь продолжается. Вместо
width="100%" height="100%"
пишем
fill="true"

соотвественно трейт:
public function set fill(value : Boolean)
{
if(value)
{
percentWidth = 100;
percentHeight = 100;
}
else
{
percentWidth = NaN;
percentHeight = NaN;
}
}

примешиваем
public class VG extends VGroup
{
include "padd.as";
include "fill.as";
}

и можно примешать еще в 100500 других компонентов
yzh44yzh
Flex Есть такая проблема с алертом: допустим, вы активно набираете какой-то текст в флекс приложении (чатитесь). И в этот момент вылетает Алерт, чего-то предлагает (разрешить юзеру Васе Пупкину видеть вашу веб-камеру). Ну и этот Алерт забирает на себя фокус. Через долю секунды вы замечаете этот алерт, но текст в это время продолжаете печатать. И при этом наверняка нажимаете space. И тем самым сабмитите дефолтную кнопку на алерте. И он закрывается, и Вася Пупкин смотрит вашу веб-камеру, а вы даже не успели разглядеть, что там было, в алерте.

Что б придумать? Пока у меня мысль работает в направлении — найти в исходниках флекса, где кнопка сабмитится по space и подменить класс с этой логикой в своем проекте. Пусть сабмититься только по Enter, а не по Space.

Но это хреновый вариант :(
yzh44yzh
air Flex внезапно выяснилось, что в AIR такая фигня не работает
navigateToURL(new URLRequest(registerSettings.registerUrl), '_blank');

а нужна такая фигня
var urlReq = new air.URLRequest(registerSettings.registerUrl);
air.navigateToURL(urlReq, "_blank");

беда в том, что второй вариант у меня не компилируеются, нет таких объектов.

Юзаю артефакт:
<dependency>
<groupId>com.adobe.flex.framework</groupId>
<artifactId>air-framework</artifactId>
<version>3.5.0.12683</version>
<type>pom</type>
</dependency>

кто-нибудь знает, в какой версии появились air.URLRequest и air.navigateToURL?
yzh44yzh
Flex Еще один индикатор обилия слишком кастомных компонентов. Часто ли у вас в коде встречается такое?
protected override function createChildren():void
{
super.createChildren();

holder = new Sprite();
rawChildren.addChild(holder);
}
yzh44yzh
Flex Опять вернуть с этому Event.clone Все-таки хочется так извернуться, чтобы и рыбку съесть, и лишний код не написать :) Вот чего придумал:

class MyBaseEvent extends Event
{
public override function clone() : void
{
throw new Error('Event.clone not implemented');
}
}

class CustomEvent extends MyBaseEvent
{
// stuff here
}
yzh44yzh
Flex Мы тут в чате BAFPUG обсуждаем, нужно ли реализовывать clone в кастомных событиях. Адоб нас пугает страшными карами, если мы не будем этого делать. Но оказалось, что многие этого не делают. И я этого не делаю, и ни раз ни сталкивался ни с какими проблемами.

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

Вопрос важный, ибо реализовывать clone в каждом кастомном событии — это довольно дорого (в смысле траты времени на написание оного кода). И мне нужны весомые аргументы, чтобы начать это делать.
yzh44yzh
Flex Сегодня обнаружил проблему, которая меня опечалила. Оказывается попапы, созданные стандартным PopUpManager, дают неприятные побочные эффекты. Достаточно открыть любой попап, и получаем глюки с выделением текста.

например, создаем такой попап:
<?xml version="1.0" ?>
<mx:Canvas
xmlns:mx="http://www.adobe.com/2006/mxml"
width="100" height="100"
backgroundColor="0xff0000">

<mx:Label text="Test Popup"/>

</mx:Canvas>

И такое приложение:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml">

<mx:Script><![CDATA[
import mx.managers.PopUpManager;

]]></mx:Script>

<mx:Label text="Hello World. Try to select this text." selectable="true"/>
<mx:Button label="Popup" click="PopUpManager.createPopUp(this, TestPopup);"/>

</mx:Application>

Компилируем, запускаем. Пробуем выделить текст — все ок. Жмем батон, открывается попап. Пробуем выделить тот же текст. Жмем мышь, двигаем — ничего. Отпускаем. Жмем второй раз в любом месте — выделяется текст от начала текста до места, где мы кликнули. Отпускаем. Жмем третий раз, и только тут нормально работает выделение.

Это проявляется при любом открытом попапе.

Данный побочный эффект не единственный, есть и другие.
Печаль :(
yzh44yzh
opensource Flex bigbluebutton.org — видеоконференция, удаленное обучение. Близко к тому, чем мы собираемся заняться в недалеком будущем.

Flex, Red5, причем open source. Не припомню других open source flex проектов, которые были бы конечным продуктом, а не либами или фреймворками.

В общем, я просто обязан зашиться в их исходники и как следует там полазить.
yzh44yzh
Flex (sdk 3.5) Есть небольшая проблемка. В container есть verticalScrollBar, а в нем scrollThumb. У этого thumb есть minHeight, но не такая, какая нам нужна. Нам по дизайну нужно немного больше, а то ломается графика. Мы не нашли нормального способа изменить этот minHeight и временно используем такой хак:

public class FxUtils
{
static public function PatchScrollBar(container : Container, scrollThumbMinHeight : int = 20) : void
{
if(!container.verticalScrollBar) return;

for(var i : uint = 0; i < container.verticalScrollBar.numChildren; i++)
{
var thumb : ScrollThumb = container.verticalScrollBar.getChildAt(i) as ScrollThumb;
if(thumb && thumb.explicitMinHeight != scrollThumbMinHeight)
thumb.explicitMinHeight = scrollThumbMinHeight;
}
}
}

<MyCustomComponent
xmlns:mx="http://www.adobe.com/2006/mxml"
updateComplete="FxUtils.PatchScrollBar(this)">

Очевидно, что это не учень удобный вариант. Во-первых FxUtils.PatchScrollBar приходится вызывать для каждого компонента, где у нас есть scrollbar. Во-вторых, это нельзя сделать один раз на creationComplete, потому что scrollbar создается не сразу, отложено, когда он нужен. В какой момент он создастся мы не знаем, поэтому приходится вызывать патч на каждый updateComplete.

Может у кого-нибудь есть вариант получше?
yzh44yzh
Flex вот хреново, что resourceManager.getString('bundle', 'prop') генерирует исключение, если нужных bundle или prop нету. Мне бы нужно, чтобы просто возвращал пустую сроку. Придется все-таки обертку делать, и изменять все вхождения оного кода (а их много) :(