<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>codeflex</title>
	<atom:link href="http://blog.codeflex.ru/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://blog.codeflex.ru</link>
	<description>блог на Wordpress о Flex, AIR и иже с ними</description>
	<pubDate>Fri, 14 Oct 2011 14:46:40 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<item>
		<title>Использование Google Protobuf: оберни и полетели.</title>
		<link>http://blog.codeflex.ru/?p=575</link>
		<comments>http://blog.codeflex.ru/?p=575#comments</comments>
		<pubDate>Fri, 14 Oct 2011 14:44:02 +0000</pubDate>
		<dc:creator>Ольга Корохина</dc:creator>
		
		<category><![CDATA[Новости]]></category>

		<category><![CDATA[Protobuf]]></category>

		<guid isPermaLink="false">http://blog.codeflex.ru/?p=575</guid>
		<description><![CDATA[Пост будет достаточно далёкий от Flex но зато на модную тему: будем использовать Google Protobuf.
На вопрос: &#8220;зачем?&#8221; ответ прост - мы хотим иметь возможность быстро подстраивать наше приложение (клиентскую часть сложной системы с бекендом на Java) под изменения протокола и не хотим при этом каждый раз плотно замарачиваться. Поэтому мы замарочимся один единственный раз - [...]]]></description>
			<content:encoded><![CDATA[<p>Пост будет достаточно далёкий от Flex но зато на модную тему: будем использовать Google Protobuf.<br />
На вопрос: &#8220;зачем?&#8221; ответ прост - мы хотим иметь возможность быстро подстраивать наше приложение (клиентскую часть сложной системы с бекендом на Java) под изменения протокола и не хотим при этом каждый раз плотно замарачиваться. Поэтому мы замарочимся один единственный раз - разберёмся что к чему, настроим всё, запустим, сгенерируем и научимся использовать.<br />
Основная идея - иметь единый файл с описанием протокола (объектов передаваемых по нему) и генерироть согласно ему код и для бекенда и для фронтенда. Корпорация добра обещает, что если мы всё сделаем правильно то у нас магическим образом объекты будут передаваться по низкоуровнему протоколу (у меня их даже два - TCP и http/WebSockets) будучи обёрнутыми в наш кастомный протокол протобафом.<br />
Для начала можно походить по интернету почитать что к чему, сходить на<a href="http://code.google.com/p/protobuf/downloads/list"> http://code.google.com/p/protobuf/downloads/list</a> скачать оттуда, посмотреть версию на джаве. Понять что всё просто: создать файл с описанием объёктов которые пересылаем по нашему протоколу и сгенерировать согласно этому описанию код. Добавить его в джава-проект, немного уличной магии и всё работает. Проникнуться и захотеть уметь генерировать код на AS3 так же легко и просто как это делается для джавы. Всё что нам для этого нужно - сходить на <a href="http://code.google.com/p/protoc-gen-as3/downloads/detail?name=protoc-gen-as3-1.0.0-rc5-bin.tar.gz&amp;can=2&amp;q=">http://code.google.com/p/protoc-gen-as3/downloads/detail?name=protoc-gen-as3-1.0.0-rc5-bin.tar.gz&amp;can=2&amp;q=</a> и скачать архив. В нём всё что нам нужно для того чтобы сгенерировать код на AS3 кроме, естественно, файла с описанием объектов. Но раз мы уже генерироли код для джавы он у нас уже есть. Тут я приведу сильно упрощённую версию моего файла trans.proto:<br />
<pre><code>
package ru.codeflex.test.protobuf.protocol;

option java_package = &quot;ru.codeflex.test.protobuf.protocol&quot;;
option java_outer_classname = &quot;Message&quot;;

/**
&nbsp;&nbsp; Frame - is a Protocol&#039;s transport packet, which is
&nbsp;&nbsp; used by Server and Client for network communication.
&nbsp;&nbsp; It consists of required Command code - command
&nbsp;&nbsp; and optional payload (multiple fields).
&nbsp;&nbsp; See available Commands description below for complete
&nbsp;&nbsp; information about associated payload messages.

&nbsp;&nbsp; Protobuf binary format does not provide build-in delimiters
&nbsp;&nbsp; for detection of message boundaries. It is responsibility
&nbsp;&nbsp; of target protocol - to delimit messages sent over the wire.

&nbsp;&nbsp; In our protocol Frames are of variable size, so for determination
&nbsp;&nbsp; of frame boundaries every Frame will have its length prepended
&nbsp;&nbsp; as first uint32 value. So complete data structure will be:

&nbsp;&nbsp; [uint32][Frame][uint32][Frame]...

&nbsp;&nbsp; uint32 - is a base 128 Varint. Variable lenth integer.

&nbsp;&nbsp; To learn more about Varint types visit official page
&nbsp;&nbsp; http://code.google.com/apis/protocolbuffers/docs/encoding.html#varints

*/
message Frame {
&nbsp;&nbsp; required Command command = 1;
&nbsp;&nbsp; // payload
&nbsp;&nbsp; optional Join join_message = 2;
&nbsp;&nbsp; optional JoinAcknowledge join_acknowledge_message = 3;
&nbsp;&nbsp; optional Error error_message = 7;
}

enum Command {

&nbsp;&nbsp; JOIN = 5;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Send by the client who wants to join an existing (valid session_id) session.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// If given session_id does not exist this message will be dropped silently.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// The first joining client will become the host.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Payload: -&gt; Join

&nbsp;&nbsp; JOIN_ACK = 3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Send by the server to joining client in case of success.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// If new client is being connected to an existing session
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Payload: &lt;- JoinAcknowledge
&nbsp;&nbsp; ERROR = 99;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Send by the server in case of errors detected on server.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// May be sent in response to any Client&#039;s command.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// When triggered by the clients the message is dropped silently.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Payload: &lt;- Error
}

// Client&#039;s role
enum Role {
&nbsp;&nbsp; PLAYER = 92;
&nbsp;&nbsp; // may be extended with additional roles in future
}

/**
 In order to successfully join the session, client must provide valid data:
 session_id&nbsp;&nbsp;- id of existing (game) session provided by gface|engine
 gface_token - valid token, given by&nbsp;&nbsp;gface|engine after successful authentication.
 Server will do additional check if provided token is enlisted as participant for given session_id
 and session has free slots. Otherwise it will reject Join request from client.
*/
message Join {
&nbsp;&nbsp; optional Role role = 1 [default = PLAYER];
&nbsp;&nbsp; required uint64 session_id = 2;
&nbsp;&nbsp; required string gface_token = 3;
}

/**
 Send by the server after a player has joined.
 isHost is &quot;true&quot; if this player is a host, &quot;false&quot; otherwise.
 The slot is the player slot which is a zero based index
 and lower than the max number of players (0 &lt;= slot &lt; maxNoPlayers).
 */
message JoinAcknowledge {
&nbsp;&nbsp; required uint32 slot = 1;
&nbsp;&nbsp; optional bool is_host = 2 [default = false];
}
/**
&nbsp;&nbsp;Error detected on server.
&nbsp;&nbsp;code - see error codes list for possible error codes.
&nbsp;&nbsp;msg - arbitrary message, describing occurred error.
*/
message Error {
&nbsp;&nbsp; optional uint32 code = 1;
&nbsp;&nbsp; optional string msg = 2;
}
</code></pre></p>
<p>uint32, uint64 - конвенции, при генерации по этому описанию кода в Джава uint64 например даёт Long, при генерации кода в AS3 почему-то мапится не на Number а на написанный разработчиками protoc-gen-as3 класс Uint64. Много странного вокруг нас <img src='http://blog.codeflex.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Для того чтобы получить по этому описанию код на Java нужно всего лишь запустить экзешник (для виндовой версии) или .sh файл скормив ему путь на наш trans.proto. Для того чтобы получить код на AS3 нужно запустить его же но с указанием дополнительных параметров плагина для генирации &#8211;plugin=protoc-gen-as3=protoc-gen-as3.bat и выходной папки для этого плагина &#8211;as3_out=as3. Я сделала generate_as3code.bat файл для того чтобы упростить всё это дело. К этому посту приаттачен архив со всем необходимым (generate_Javacode.bat для java) для генерации. Сорцы протобафа на Джаве можно взять со ссылки на гуглкод что я привела выше или позволить Мавену сделать это за вас, сорцы com.netease.protobuf.* я так же положила в архив к этому посту.<br />
Итак, будем считать что у нас всё есть - как же нам добавить этот код в наш проект на AS3 и использовать его? Пример: имеем флеш-клиент общающийся с сервером по TCP. Есть некий кастомный сокет ProtoBufSocket extends Socket в конструкторе которого добавлен листенер addEventListener(ProgressEvent.SOCKET_DATA, onData); onData - функция в которой мы читаем из сокета, разбираем прочитанное и как-то реагируем - выглядит так:</p>
<p><pre><code>
private function onData(_event:ProgressEvent):void
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var data:ByteArray = new ByteArray(); 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(this.bytesAvailable &gt; 0)readBytes(data);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var mess:Frame = new Frame();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mess.mergeDelimitedFrom(data);//length included! 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (mess.command == Command.GF_JOIN_ACK)//joined ok, accept 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//process somehow mess.joinAcknowledgeMessage
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (mess.command == Command.GF_ERROR)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//process somehow mess.errorMessage.msg
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//throw new Error(&quot;Undefined protocol command:&quot; + command);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;}
</code></pre><br />
В этой функции мы преобразовываем массив байтов в протобафовую &#8220;единицу&#8221; Frame. Для того чтобы записать в сокет нам нужно произвести обратную операцию - разобрать Frame на байты и послать по сокету. Это делаем в функции writeFrameToSocket:<br />
<pre><code>
public function writeFrameToSocket(frame:Frame):void{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!this.connected) return;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var buf:WritingBuffer = new WritingBuffer();&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.writeToBuffer(buf);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var t:ByteArray = new ByteArray();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf.toNormal(t)&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flushLoggedWW(t);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;}

private function flushLoggedWW(_buf:ByteArray):void{
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var logBuff:WritingBuffer = new WritingBuffer();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteUtils.write$TYPE_UINT32(logBuff, _buf.length); 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logBuff.writeBytes(_buf);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logBuff.position=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeBytes(logBuff);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flush();
&nbsp;&nbsp;&nbsp;&nbsp;}
</code></pre><br />
Пример того как можно сформировать и послать по сокету сообщение в инстанце-родителе:</p>
<p><pre><code>
private var serverConnection:ProtoBufSocket;
...
serverConnection = new ProtoBufSocket(_serverAddress, _serverPort, this);
...
var mess:Frame = new Frame();
mess.command = Command.GF_JOIN;
mess.joinMessage = new Join();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
mess.joinMessage.sessionId = UInt64.parseUInt64(gameSessionId.toString());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
mess.joinMessage.gfaceToken = &quot;here-some-token&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
serverConnection.writeFrameToSocket(mess);
</code></pre></p>
<p>На примере приведённого тут очень прстого протокола сложно оценить все преимущества использования протофа но поверьте, в условиях сложного протокола в большом и сложном проекте протобаф оправдан целиком и полностью.</p>
<p>P.S. Огромное спасибо сеньёру Алексею Макаренко за то что правильно пнул меня в направлении Google Protobuf.</p>
<p>Обещанный архив можно скачать <a href="http://codeflex.ru/classes/downloads/ru_codeflex_protobuf.zip">отсюда</a>.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d575').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d575" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://blog.codeflex.ru/?p=575&amp;submitHeadline=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+Google+Protobuf%3A+%D0%BE%D0%B1%D0%B5%D1%80%D0%BD%D0%B8+%D0%B8+%D0%BF%D0%BE%D0%BB%D0%B5%D1%82%D0%B5%D0%BB%D0%B8.&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://blog.codeflex.ru/?p=575&amp;title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+Google+Protobuf%3A+%D0%BE%D0%B1%D0%B5%D1%80%D0%BD%D0%B8+%D0%B8+%D0%BF%D0%BE%D0%BB%D0%B5%D1%82%D0%B5%D0%BB%D0%B8." rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://blog.codeflex.ru/?p=575&amp;title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+Google+Protobuf%3A+%D0%BE%D0%B1%D0%B5%D1%80%D0%BD%D0%B8+%D0%B8+%D0%BF%D0%BE%D0%BB%D0%B5%D1%82%D0%B5%D0%BB%D0%B8." rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://blog.codeflex.ru/?p=575" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://blog.codeflex.ru/?p=575&amp;title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+Google+Protobuf%3A+%D0%BE%D0%B1%D0%B5%D1%80%D0%BD%D0%B8+%D0%B8+%D0%BF%D0%BE%D0%BB%D0%B5%D1%82%D0%B5%D0%BB%D0%B8." rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://blog.codeflex.ru/?p=575&amp;T=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+Google+Protobuf%3A+%D0%BE%D0%B1%D0%B5%D1%80%D0%BD%D0%B8+%D0%B8+%D0%BF%D0%BE%D0%BB%D0%B5%D1%82%D0%B5%D0%BB%D0%B8." rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://blog.codeflex.ru/?p=575&amp;title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+Google+Protobuf%3A+%D0%BE%D0%B1%D0%B5%D1%80%D0%BD%D0%B8+%D0%B8+%D0%BF%D0%BE%D0%BB%D0%B5%D1%82%D0%B5%D0%BB%D0%B8." rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://blog.codeflex.ru/?p=575&amp;title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+Google+Protobuf%3A+%D0%BE%D0%B1%D0%B5%D1%80%D0%BD%D0%B8+%D0%B8+%D0%BF%D0%BE%D0%BB%D0%B5%D1%82%D0%B5%D0%BB%D0%B8." rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://blog.codeflex.ru/?p=575" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://blog.codeflex.ru/?p=575" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+Google+Protobuf%3A+%D0%BE%D0%B1%D0%B5%D1%80%D0%BD%D0%B8+%D0%B8+%D0%BF%D0%BE%D0%BB%D0%B5%D1%82%D0%B5%D0%BB%D0%B8.+@+http://blog.codeflex.ru/?p=575" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://blog.codeflex.ru/?p=575&amp;t=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+Google+Protobuf%3A+%D0%BE%D0%B1%D0%B5%D1%80%D0%BD%D0%B8+%D0%B8+%D0%BF%D0%BE%D0%BB%D0%B5%D1%82%D0%B5%D0%BB%D0%B8." rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d575').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
<script type="text/javascript">$$('div.d575').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); </script>]]></content:encoded>
			<wfw:commentRss>http://blog.codeflex.ru/?feed=rss2&amp;p=575</wfw:commentRss>
		</item>
		<item>
		<title>Фронтальная камера на смартфонах и планшетах: немного уличной магии</title>
		<link>http://blog.codeflex.ru/?p=566</link>
		<comments>http://blog.codeflex.ru/?p=566#comments</comments>
		<pubDate>Mon, 12 Sep 2011 16:39:32 +0000</pubDate>
		<dc:creator>Ольга Корохина</dc:creator>
		
		<category><![CDATA[bugs-n-workarounds]]></category>

		<guid isPermaLink="false">http://blog.codeflex.ru/?p=566</guid>
		<description><![CDATA[     Если вы занимаетесь разработкой на Flex под мобильные платформы вы уже знаете: если у смартофона/планшета 2 камеры то доступна из них одна, и как раз не фронтальная. Не могу даже предствить себе мощность потока космических поносных лучей полученных сотрудниками любимой нашей компании Adobe по этому поводу&#8230; лично я рассматривала массу [...]]]></description>
			<content:encoded><![CDATA[<p>     Если вы занимаетесь разработкой на Flex под мобильные платформы вы уже знаете: если у смартофона/планшета 2 камеры то доступна из них одна, и как раз не фронтальная. Не могу даже предствить себе мощность потока космических поносных лучей полученных сотрудниками любимой нашей компании Adobe по этому поводу&#8230; лично я рассматривала массу вариантов как это обойти. А счастье было так рядом <img src='http://blog.codeflex.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Итак, сегодня мы будем брать судьбу в свои руки - управлять камерами.<br />
      Первое что нам нужно - прочитать рецепт <a href="http://cookbooks.adobe.com/post_How_do_I_access_the_front_facing_camera_on_a_mobil-19312.html">http://cookbooks.adobe.com/post_How_do_I_access_the_front_facing_camera_on_a_mobil-19312.html</a> . Выглядит всё просто - думаешь а почему же у меня так не получилось? Ответ прост - потому что в рецепте используются классы которые &#8220;появятся&#8221; в 3-м эйре и 11-м плеере. Нас это не остановит, правда же? Мы идём в лабсы и качаем релиз кандидаты (это уже релиз кандидаты!) <a href="http://labs.adobe.com/technologies/flashplatformruntimes/air3/">http://labs.adobe.com/technologies/flashplatformruntimes/air3/</a> - это эйр и <a href="http://labs.adobe.com/technologies/flashplatformruntimes/flashplayer11/">http://labs.adobe.com/technologies/flashplatformruntimes/flashplayer11/</a> - плеер. Как их ставить не секрет: ставим плеер, ставим эйр, качаем эйровое сдк и разбаляем им свой 4.5.1 сдк на который настроен билдер (если ещё ни разу этого не делали - вот <a href="http://blogs.adobe.com/cantrell/archives/2011/08/how-to-use-the-air-3-beta-sdk.html">инструкция</a>).<br />
      Не забываем в дескрипшене приложения поменять старую версию Эйра на 3.0 и в аргументах компилятора добвляем  -swf-version=13. Стартуем. Ура! Всё собирается! Экспортируем в .apk и понимаем что что-то не так <img src='http://blog.codeflex.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Например для Андроида последняя релизная версия эйра 2.7 а никак не желанная 3.0. Попытки системы обновить эйр из меркета или из броузера ни к чему не приводят - 3.0 рантайма для мобильных платформ просто пока нет. Не всё потерянно - нужно просто научиться упаковывать рантайм и нужный кусок sdk вместе с приложением (как это делается при экспорте под iOS).<br />
     Для того чтобы сделать это правильно я советую немного отвлечься от этой статьи и почитать &#8220;классиков&#8221;:<br />
<a href="http://www.tricedesigns.com/2011/08/10/air-3-0-captive-runtime/">http://www.tricedesigns.com/2011/08/10/air-3-0-captive-runtime/</a><br />
<a href="http://help.adobe.com/en_US/air/build/WS901d38e593cd1bac1e63e3d128cdca935b-8000.html">http://help.adobe.com/en_US/air/build/WS901d38e593cd1bac1e63e3d128cdca935b-8000.html</a><br />
<a href="http://www.remotesynthesis.com/post.cfm/cool-stuff-with-the-flash-platform-8-19-2011">http://www.remotesynthesis.com/post.cfm/cool-stuff-with-the-flash-platform-8-19-2011</a></p>
<p>     Итого: общая идея собирать и подписывать .apk не билдером а напрямую adt- сборщиком из sdk указав ему в качестве таргета при сборке параметр apk-captive-runtime. Учитывая сколько раз вам прийдётся запустить его пока наконец вы не достигнете 11-го дана советую сразу сделать .bat файл для винды или .sh для макоси. Сегодня я сидела на винде поэтому пока у меня  есть только бат-файл, который лежит в корне моего проекта и у которого внутри следующее: </p>
<p><pre><code>
&quot;C:Program Files (x86)AdobeAdobe Flash Builder 4.5sdks4.5.1binadt.bat&quot; -package -target apk-captive-runtime -storetype pkcs12 -keystore ModularMVC.p12 bin-debug/nurse.apk VirtualNurse-pack.xml bin-debug/VirtualNurse.swf bin-debug/assets/* bin-debug/images/* data.db 
</code></pre></p>
<p>при выполнении запрашивается пароль сертификата- вводим его и нажимаем энтер.</p>
<p>     Много приятных минут я получила пытаясь понять где и как должен лежать файл с базой data.db. Указывала ему путь и так и эдак, клала его в ассетс&#8230;в итоге плюнула и положила в корень проекта - там же где лежит батник для сборки. В коде он используется так:</p>
<p><pre><code>static public var dbFileURL:String = &quot;data.db&quot;;
....
var dbFile:File = File.applicationDirectory;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
dbFile = dbFile.resolvePath(dbFileURL);</code></pre></p>
<p>на железке работает.<br />
     Так же вам потребуется немного изменить дескриптор приложения, поэтому советую скопировать текущий под другим именем и править в нём - дабы не поломать проект под билдер (у меня тут это файл VirtualNurse-pack.xml, лежит в корне как и батник для сборки и файл базы). Потребуется изменить:<br />
1) Изменить значения тегов &lt;id&gt;, &lt;filename&gt; и &lt;name&gt; на более удобоваримые;<br />
2) в блоке &lt;initialWindow&gt; в теге &lt;content&gt; приписать относительный путь к .swf файлу, у меня это bin-debug/VirtualNurse.swf<br />
3) поприписывать аналогично пути для иконок в блоке &lt;icon&gt; (у меня </p>
<p>&lt;image16&#215;16&gt;bin-debug/assets/nurseIcons/16.png&lt;/image16&#215;16&gt;</p>
<p> и т.д.)</p>
<p>     Собираем проект батником, получаем файл примерно на 7 Mb тяжелее предыдущей версии (рантайм теперь включён в приложение) и тестируем его на железке. Вуаля! Фронтальная камера заработала.</p>
<p>     P.S. Ждём когда эдобы зарелизят 3-й эйр для мобильных платформ и пересобираем приложение билдером без мерджа рантайма - лишние мегабайты должны уйти. Точной инсайдерской информации о том когда это случится у меня сейчас нет.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d566').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d566" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://blog.codeflex.ru/?p=566&amp;submitHeadline=%D0%A4%D1%80%D0%BE%D0%BD%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F+%D0%BA%D0%B0%D0%BC%D0%B5%D1%80%D0%B0+%D0%BD%D0%B0+%D1%81%D0%BC%D0%B0%D1%80%D1%82%D1%84%D0%BE%D0%BD%D0%B0%D1%85+%D0%B8+%D0%BF%D0%BB%D0%B0%D0%BD%D1%88%D0%B5%D1%82%D0%B0%D1%85%3A+%D0%BD%D0%B5%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE+%D1%83%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%B9+%D0%BC%D0%B0%D0%B3%D0%B8%D0%B8&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://blog.codeflex.ru/?p=566&amp;title=%D0%A4%D1%80%D0%BE%D0%BD%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F+%D0%BA%D0%B0%D0%BC%D0%B5%D1%80%D0%B0+%D0%BD%D0%B0+%D1%81%D0%BC%D0%B0%D1%80%D1%82%D1%84%D0%BE%D0%BD%D0%B0%D1%85+%D0%B8+%D0%BF%D0%BB%D0%B0%D0%BD%D1%88%D0%B5%D1%82%D0%B0%D1%85%3A+%D0%BD%D0%B5%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE+%D1%83%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%B9+%D0%BC%D0%B0%D0%B3%D0%B8%D0%B8" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://blog.codeflex.ru/?p=566&amp;title=%D0%A4%D1%80%D0%BE%D0%BD%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F+%D0%BA%D0%B0%D0%BC%D0%B5%D1%80%D0%B0+%D0%BD%D0%B0+%D1%81%D0%BC%D0%B0%D1%80%D1%82%D1%84%D0%BE%D0%BD%D0%B0%D1%85+%D0%B8+%D0%BF%D0%BB%D0%B0%D0%BD%D1%88%D0%B5%D1%82%D0%B0%D1%85%3A+%D0%BD%D0%B5%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE+%D1%83%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%B9+%D0%BC%D0%B0%D0%B3%D0%B8%D0%B8" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://blog.codeflex.ru/?p=566" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://blog.codeflex.ru/?p=566&amp;title=%D0%A4%D1%80%D0%BE%D0%BD%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F+%D0%BA%D0%B0%D0%BC%D0%B5%D1%80%D0%B0+%D0%BD%D0%B0+%D1%81%D0%BC%D0%B0%D1%80%D1%82%D1%84%D0%BE%D0%BD%D0%B0%D1%85+%D0%B8+%D0%BF%D0%BB%D0%B0%D0%BD%D1%88%D0%B5%D1%82%D0%B0%D1%85%3A+%D0%BD%D0%B5%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE+%D1%83%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%B9+%D0%BC%D0%B0%D0%B3%D0%B8%D0%B8" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://blog.codeflex.ru/?p=566&amp;T=%D0%A4%D1%80%D0%BE%D0%BD%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F+%D0%BA%D0%B0%D0%BC%D0%B5%D1%80%D0%B0+%D0%BD%D0%B0+%D1%81%D0%BC%D0%B0%D1%80%D1%82%D1%84%D0%BE%D0%BD%D0%B0%D1%85+%D0%B8+%D0%BF%D0%BB%D0%B0%D0%BD%D1%88%D0%B5%D1%82%D0%B0%D1%85%3A+%D0%BD%D0%B5%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE+%D1%83%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%B9+%D0%BC%D0%B0%D0%B3%D0%B8%D0%B8" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://blog.codeflex.ru/?p=566&amp;title=%D0%A4%D1%80%D0%BE%D0%BD%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F+%D0%BA%D0%B0%D0%BC%D0%B5%D1%80%D0%B0+%D0%BD%D0%B0+%D1%81%D0%BC%D0%B0%D1%80%D1%82%D1%84%D0%BE%D0%BD%D0%B0%D1%85+%D0%B8+%D0%BF%D0%BB%D0%B0%D0%BD%D1%88%D0%B5%D1%82%D0%B0%D1%85%3A+%D0%BD%D0%B5%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE+%D1%83%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%B9+%D0%BC%D0%B0%D0%B3%D0%B8%D0%B8" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://blog.codeflex.ru/?p=566&amp;title=%D0%A4%D1%80%D0%BE%D0%BD%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F+%D0%BA%D0%B0%D0%BC%D0%B5%D1%80%D0%B0+%D0%BD%D0%B0+%D1%81%D0%BC%D0%B0%D1%80%D1%82%D1%84%D0%BE%D0%BD%D0%B0%D1%85+%D0%B8+%D0%BF%D0%BB%D0%B0%D0%BD%D1%88%D0%B5%D1%82%D0%B0%D1%85%3A+%D0%BD%D0%B5%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE+%D1%83%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%B9+%D0%BC%D0%B0%D0%B3%D0%B8%D0%B8" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://blog.codeflex.ru/?p=566" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://blog.codeflex.ru/?p=566" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+%D0%A4%D1%80%D0%BE%D0%BD%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F+%D0%BA%D0%B0%D0%BC%D0%B5%D1%80%D0%B0+%D0%BD%D0%B0+%D1%81%D0%BC%D0%B0%D1%80%D1%82%D1%84%D0%BE%D0%BD%D0%B0%D1%85+%D0%B8+%D0%BF%D0%BB%D0%B0%D0%BD%D1%88%D0%B5%D1%82%D0%B0%D1%85%3A+%D0%BD%D0%B5%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE+%D1%83%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%B9+%D0%BC%D0%B0%D0%B3%D0%B8%D0%B8+@+http://blog.codeflex.ru/?p=566" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://blog.codeflex.ru/?p=566&amp;t=%D0%A4%D1%80%D0%BE%D0%BD%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F+%D0%BA%D0%B0%D0%BC%D0%B5%D1%80%D0%B0+%D0%BD%D0%B0+%D1%81%D0%BC%D0%B0%D1%80%D1%82%D1%84%D0%BE%D0%BD%D0%B0%D1%85+%D0%B8+%D0%BF%D0%BB%D0%B0%D0%BD%D1%88%D0%B5%D1%82%D0%B0%D1%85%3A+%D0%BD%D0%B5%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE+%D1%83%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%B9+%D0%BC%D0%B0%D0%B3%D0%B8%D0%B8" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d566').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
<script type="text/javascript">$$('div.d566').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); </script>]]></content:encoded>
			<wfw:commentRss>http://blog.codeflex.ru/?feed=rss2&amp;p=566</wfw:commentRss>
		</item>
		<item>
		<title>NumericStapper на героине: гимми мо!</title>
		<link>http://blog.codeflex.ru/?p=562</link>
		<comments>http://blog.codeflex.ru/?p=562#comments</comments>
		<pubDate>Mon, 29 Aug 2011 07:05:35 +0000</pubDate>
		<dc:creator>Ольга Корохина</dc:creator>
		
		<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://blog.codeflex.ru/?p=562</guid>
		<description><![CDATA[Продолжаем допиливать спарк-компоненты для использования в мобильный приложениях. Сегодня пилим NumericStapper.
Пилить его нужно в любом случае- кнопки &#8220;вверх-вниз&#8221; из коробки слишком маленькие для того чтобы тапать по ним пальцами, они отлично увеличиваются - но вот стрелочки-значки в них нет. Доктор прописывает кастомный скин.
Добавляем в файл стилей:
s&#124;NumericStepper{

&#160;&#160;skinClass: ClassReference(&#34;skins.CustomNumericStapperSkin&#34;);
}
CustomNumericStapperSkin.mxml выглядит так:

&#60;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&#62;
&#60;s:SparkSkin xmlns:fx=&#34;http://ns.adobe.com/mxml/2009&#34; xmlns:s=&#34;library://ns.adobe.com/flex/spark&#34;
&#160;&#160;&#160;&#160;&#160;&#160;xmlns:fb=&#34;http://ns.adobe.com/flashbuilder/2009&#34; minHeight=&#34;92&#34; minWidth=&#34;140&#34; [...]]]></description>
			<content:encoded><![CDATA[<p>Продолжаем допиливать спарк-компоненты для использования в мобильный приложениях. Сегодня пилим NumericStapper.<br />
Пилить его нужно в любом случае- кнопки &#8220;вверх-вниз&#8221; из коробки слишком маленькие для того чтобы тапать по ним пальцами, они отлично увеличиваются - но вот стрелочки-значки в них нет. Доктор прописывает кастомный скин.<br />
Добавляем в файл стилей:</p>
<p><pre><code>s|NumericStepper{

&nbsp;&nbsp;skinClass: ClassReference(&quot;skins.CustomNumericStapperSkin&quot;);
}</code></pre></p>
<p>CustomNumericStapperSkin.mxml выглядит так:</p>
<p><pre><code>
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;s:SparkSkin xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot; xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:fb=&quot;http://ns.adobe.com/flashbuilder/2009&quot; minHeight=&quot;92&quot; minWidth=&quot;140&quot; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alpha.disabled=&quot;0.5&quot;&gt;

&nbsp;&nbsp;&nbsp;&nbsp;&lt;fx:Metadata&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;![CDATA[ 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/** 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @copy spark.skins.spark.ApplicationSkin#hostComponent
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[HostComponent(&quot;spark.components.NumericStepper&quot;)]
&nbsp;&nbsp;&nbsp;&nbsp;]]&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/fx:Metadata&gt; 
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;fx:Script fb:purpose=&quot;styling&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Define the skin elements that should not be colorized. 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For numeric stepper, the skin itself is colorized but the individual parts are not. */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static private const exclusions:Array = [&quot;textDisplay&quot;, &quot;decrementButton&quot;, &quot;incrementButton&quot;];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @private
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;override public function get colorizeExclusions():Array {return exclusions;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @private
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;override protected function initializationComplete():void
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;useChromeColor = true;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.initializationComplete();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private var cornerRadiusChanged:Boolean;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private var borderStylesChanged:Boolean;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;@private
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;override protected function commitProperties():void
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.commitProperties();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (cornerRadiusChanged)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var cr:Number = getStyle(&quot;cornerRadius&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (incrementButton)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;incrementButton.setStyle(&quot;cornerRadius&quot;, cr);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (decrementButton)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decrementButton.setStyle(&quot;cornerRadius&quot;, cr);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cornerRadiusChanged = false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (borderStylesChanged)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textDisplay.setStyle(&quot;borderAlpha&quot;, getStyle(&quot;borderAlpha&quot;));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textDisplay.setStyle(&quot;borderColor&quot;, getStyle(&quot;borderColor&quot;));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textDisplay.setStyle(&quot;borderVisible&quot;, getStyle(&quot;borderVisible&quot;));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;borderStylesChanged = false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;@private
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;override public function styleChanged(styleProp:String):void
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var allStyles:Boolean = !styleProp || styleProp == &quot;styleName&quot;;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.styleChanged(styleProp);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (allStyles || styleProp == &quot;cornerRadius&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cornerRadiusChanged = true;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;invalidateProperties();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (allStyles || styleProp.indexOf(&quot;border&quot;) == 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;borderStylesChanged = true;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;invalidateProperties();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/fx:Script&gt;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:states&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:State name=&quot;normal&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:State name=&quot;disabled&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:states&gt;

&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:Button id=&quot;incrementButton&quot; right=&quot;0&quot; top=&quot;0&quot; height=&quot;50%&quot; tabEnabled=&quot;false&quot;&nbsp;&nbsp;minWidth=&quot;46&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;skinClass=&quot;skins.NumericStepperIncrementButtonSkin&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:Button id=&quot;decrementButton&quot; right=&quot;0&quot; bottom=&quot;0&quot; height=&quot;50%&quot; tabEnabled=&quot;false&quot;&nbsp;&nbsp;minWidth=&quot;46&quot; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;skinClass=&quot;skins.CustomNumericStepperDecrementButtonSkin&quot;&nbsp;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:TextInput id=&quot;textDisplay&quot; left=&quot;0&quot; top=&quot;0&quot; right=&quot;46&quot; bottom=&quot;0&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;skinClass=&quot;spark.skins.spark.NumericStepperTextInputSkin&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;/s:SparkSkin&gt;
</code></pre></p>
<p>Стандартные скины для кнопок поражают вображение способом рисования стрелок, например:</p>
<p><pre><code>&lt;s:Path horizontalCenter=&quot;0&quot; verticalCenter=&quot;0&quot; id=&quot;arrow&quot; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data=&quot;M 3.0 3.0 L 3.0 2.0 L 4.0 2.0 L 4.0 1.0 L 5.0 1.0 L 5.0 0.0 L 0.0 0.0 L 0.0 1.0 L 1.0 1.0 L 1.0 2.0 L 2.0 2.0 L 2.0 3.0 L 3.0 3.0&quot;&gt;</code></pre></p>
<p>Ноу комментс! Делаем свои:</p>
<p>CustomNumericStepperDecrementButtonSkin.mxml </p>
<p><pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;

&lt;s:SparkSkin xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot; xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:fb=&quot;http://ns.adobe.com/flashbuilder/2009&quot;&gt;
&nbsp;&nbsp;
&nbsp;&nbsp;&lt;fx:Metadata&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;![CDATA[ 
&nbsp;&nbsp;&nbsp;&nbsp;/** 
&nbsp;&nbsp;&nbsp;&nbsp;* @copy spark.skins.spark.ApplicationSkin#hostComponent
&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;[HostComponent(&quot;spark.components.Button&quot;)]
&nbsp;&nbsp;&nbsp;&nbsp;]]&gt;
&nbsp;&nbsp;&lt;/fx:Metadata&gt; 
&nbsp;&nbsp;
&nbsp;&nbsp;&lt;fx:Script fb:purpose=&quot;styling&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;/* Define the skin elements that should not be colorized. 
&nbsp;&nbsp;&nbsp;&nbsp;For NumericStepper buttons, the graphics are colorized but the arrow is not. */
&nbsp;&nbsp;&nbsp;&nbsp;static private const exclusions:Array = [&quot;arrow&quot;];
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp; * @private
&nbsp;&nbsp;&nbsp;&nbsp; */&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;override public function get colorizeExclusions():Array {return exclusions;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;/* Define the symbol fill items that should be colored by the &quot;symbolColor&quot; style. */
&nbsp;&nbsp;&nbsp;&nbsp;static private const symbols:Array = [&quot;arrowFill&quot;];
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp; * @private
&nbsp;&nbsp;&nbsp;&nbsp; */
&nbsp;&nbsp;&nbsp;&nbsp;override public function get symbolItems():Array {return symbols};
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp; * @private
&nbsp;&nbsp;&nbsp;&nbsp; */
&nbsp;&nbsp;&nbsp;&nbsp;override protected function initializationComplete():void
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;useChromeColor = true;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.initializationComplete();
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;@private
&nbsp;&nbsp;&nbsp;&nbsp; */
&nbsp;&nbsp;&nbsp;&nbsp;override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number) : void
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var cr:Number = getStyle(&quot;cornerRadius&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (cornerRadius != cr)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cornerRadius = cr;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fill.bottomRightRadiusX = cornerRadius;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;highlight.bottomRightRadiusX = cornerRadius;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.updateDisplayList(unscaledWidth, unscaledHeight);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;private var cornerRadius:Number = 2;
&nbsp;&nbsp;&lt;/fx:Script&gt;
&nbsp;&nbsp;
&nbsp;&nbsp;&lt;s:states&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:State name=&quot;up&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:State name=&quot;over&quot;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:State name=&quot;down&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:State name=&quot;disabled&quot; /&gt;
&nbsp;&nbsp;&lt;/s:states&gt;
&nbsp;&nbsp;
&nbsp;&nbsp;&lt;s:Group left=&quot;0&quot; top=&quot;0&quot; right=&quot;0&quot; bottom=&quot;0&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- border/fill --&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--- @private --&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:Rect id=&quot;fill&quot; left=&quot;0&quot; top=&quot;0&quot; right=&quot;0&quot; bottom=&quot;0&quot; width=&quot;18&quot; height=&quot;16&quot; bottomRightRadiusX=&quot;2&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:stroke&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:SolidColorStroke color=&quot;0x686868&quot; weight=&quot;1&quot;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:stroke&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:fill&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:LinearGradient rotation=&quot;90&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:GradientEntry color=&quot;0xE8E8E8&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color.over=&quot;0xC2C2C2&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color.down=&quot;0xAEB0B1&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:GradientEntry color=&quot;0xDFDFDF&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color.over=&quot;0xADAEAF&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color.down=&quot;0xA1A3A5&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:LinearGradient&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:fill&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:Rect&gt;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- highlight --&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--- @private --&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:Rect id=&quot;highlight&quot; left=&quot;1&quot; top=&quot;1&quot; right=&quot;1&quot; bottom=&quot;1&quot; bottomRightRadiusX=&quot;2&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:stroke&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:LinearGradientStroke rotation=&quot;90&quot; weight=&quot;1&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:GradientEntry color=&quot;0xFFFFFF&quot; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color.down=&quot;0x000000&quot; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alpha=&quot;0.55&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alpha.over=&quot;0.55&quot; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alpha.down=&quot;0.15&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:GradientEntry color=&quot;0xFFFFFF&quot; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color.down=&quot;0x000000&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alpha=&quot;0.2475&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alpha.over=&quot;0.2475&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alpha.down=&quot;0&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:LinearGradientStroke&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:stroke&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:Rect&gt;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- shadow --&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:Rect left=&quot;1&quot; top=&quot;2&quot; right=&quot;1&quot; height=&quot;1&quot; includeIn=&quot;down&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:fill&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:SolidColor color=&quot;0x000000&quot; alpha=&quot;0.07&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:fill&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:Rect&gt;
&nbsp;&nbsp;&lt;/s:Group&gt;
&nbsp;&nbsp;
&nbsp;&nbsp;&lt;!-- arrow --&gt;
&nbsp;&nbsp;&lt;!--- Defines the appearance of the down arrow. --&gt;
&nbsp;&nbsp;
&nbsp;&nbsp;&lt;s:Path horizontalCenter=&quot;0&quot; verticalCenter=&quot;0&quot; id=&quot;arrow&quot;&nbsp;&nbsp;scaleX=&quot;2&quot; scaleY=&quot;2&quot;
&nbsp;&nbsp;data=&quot;M 0.0 0.0 L 5.0 5.0 L 10.0 0.0 L 0.0 0.0&quot;&gt;
&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:fill&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--- @private
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Defines the down arrow&#039;s fill. The default color is 0x000000. The default alpha is .8. --&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:SolidColor id=&quot;arrowFill&quot; color=&quot;0&quot; alpha=&quot;0.8&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:fill&gt;
&nbsp;&nbsp;&lt;/s:Path&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;
&lt;/s:SparkSkin&gt;</code></pre></p>
<p>NumericStepperIncrementButtonSkin.mxml так:</p>
<p><pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;

&lt;s:SparkSkin xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot; xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:fb=&quot;http://ns.adobe.com/flashbuilder/2009&quot;&gt;
&nbsp;&nbsp;
&nbsp;&nbsp;&lt;fx:Metadata&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;![CDATA[ 
&nbsp;&nbsp;&nbsp;&nbsp;/** 
&nbsp;&nbsp;&nbsp;&nbsp;* @copy spark.skins.spark.ApplicationSkin#hostComponent
&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;[HostComponent(&quot;spark.components.Button&quot;)]
&nbsp;&nbsp;&nbsp;&nbsp;]]&gt;
&nbsp;&nbsp;&lt;/fx:Metadata&gt; 
&nbsp;&nbsp;
&nbsp;&nbsp;&lt;fx:Script fb:purpose=&quot;styling&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;/* Define the skin elements that should not be colorized. 
&nbsp;&nbsp;&nbsp;&nbsp;For NumericStepper buttons, the graphics are colorized but the arrow is not. */
&nbsp;&nbsp;&nbsp;&nbsp;static private const exclusions:Array = [&quot;arrow&quot;];
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp; * @private
&nbsp;&nbsp;&nbsp;&nbsp; */
&nbsp;&nbsp;&nbsp;&nbsp;override public function get colorizeExcmW62&#039;&amp;&amp;WGW&amp;W6^usions;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;/* Define the symbol fill items that should be colored by the &quot;symbolColor&quot; style. */
&nbsp;&nbsp;&nbsp;&nbsp;static private const symbols:Array = [&quot;arrowFill&quot;];
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;@private
&nbsp;&nbsp;&nbsp;&nbsp; */
&nbsp;&nbsp;&nbsp;&nbsp;override public function get symbolItems():Array {return symbols};
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp; * @private
&nbsp;&nbsp;&nbsp;&nbsp; */
&nbsp;&nbsp;&nbsp;&nbsp;override protected function initializationComplete():void
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;useChromeColor = true;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.initializationComplete();
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;@private
&nbsp;&nbsp;&nbsp;&nbsp; */
&nbsp;&nbsp;&nbsp;&nbsp;override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number) : void
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var cr:Number = getStyle(&quot;cornerRadius&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (cornerRadius != cr)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cornerRadius = cr;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fill.topRightRadiusX = cornerRadius;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;highlight.topRightRadiusX = cornerRadius;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.updateDisplayList(unscaledWidth, unscaledHeight);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;private var cornerRadius:Number = 2;
&nbsp;&nbsp;&lt;/fx:Script&gt;
&nbsp;&nbsp;
&nbsp;&nbsp;&lt;s:states&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:State name=&quot;up&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:State name=&quot;over&quot;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:State name=&quot;down&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:State name=&quot;disabled&quot; /&gt;
&nbsp;&nbsp;&lt;/s:states&gt;
&nbsp;&nbsp;
&nbsp;&nbsp;&lt;s:Group left=&quot;0&quot; top=&quot;0&quot; right=&quot;0&quot; bottom=&quot;0&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- border/fill --&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--- @private --&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:Rect id=&quot;fill&quot; left=&quot;0&quot; top=&quot;0&quot; right=&quot;0&quot; bottom=&quot;0&quot; width=&quot;18&quot; height=&quot;16&quot; topRightRadiusX=&quot;2&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:stroke&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:SolidColorStroke color=&quot;0x686868&quot; weight=&quot;1&quot;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:stroke&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:fill&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:LinearGradient rotation=&quot;90&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:GradientEntry color=&quot;0xFFFFFF&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color.over=&quot;0xC2C2C2&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color.down=&quot;0xAEB0B1&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:GradientEntry color=&quot;0xF0F0F0&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color.over=&quot;0xADAEAF&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color.down=&quot;0xA1A3A5&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:LinearGradient&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:fill&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:Rect&gt;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- highlight --&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--- @private --&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:Rect id=&quot;highlight&quot; left=&quot;1&quot; top=&quot;1&quot; right=&quot;1&quot; bottom=&quot;1&quot; topRightRadiusX=&quot;2&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:stroke&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:LinearGradientStroke rotation=&quot;90&quot; weight=&quot;1&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:GradientEntry color=&quot;0xFFFFFF&quot; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color.down=&quot;0x000000&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alpha.over=&quot;0.55&quot; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alpha.down=&quot;0.15&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:GradientEntry color=&quot;0xFFFFFF&quot; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color.down=&quot;0x000000&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alpha=&quot;0.45&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alpha.over=&quot;0.2475&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alpha.down=&quot;0&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:LinearGradientStroke&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:stroke&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:Rect&gt;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- shadow --&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:Rect left=&quot;1&quot; top=&quot;2&quot; right=&quot;1&quot; height=&quot;1&quot; incmVFT&amp;Fv#Р3fР36ƖD6&quot;6##&quot;#r&quot;Р3fР3&amp;V7C Р3w&amp;WРР&#039;&amp;rРFVfW2FRV&amp;6RbFRW&#039;&amp;rРР3F&amp;F6VFW##&quot;fW&#039;F66VFW##&quot;C&amp;&#039;&amp;r&quot;66U#&quot;&quot;66U#&quot; РFF$RRRR#Р3fР&amp;fFPРFVfW2FRW&#039;&amp;rw2fFRFVfVB6&quot;2FRFVfVB2Р36ƖD6&quot;C&amp;&#039;&amp;tf&quot;6##&quot;#&quot;Р3fР3F РУ37&amp;6</code></pre></p>
<p>Выглядит получше и тоже работает <img src='http://blog.codeflex.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d562').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d562" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://blog.codeflex.ru/?p=562&amp;submitHeadline=NumericStapper+%D0%BD%D0%B0+%D0%B3%D0%B5%D1%80%D0%BE%D0%B8%D0%BD%D0%B5%3A+%D0%B3%D0%B8%D0%BC%D0%BC%D0%B8+%D0%BC%D0%BE%21&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://blog.codeflex.ru/?p=562&amp;title=NumericStapper+%D0%BD%D0%B0+%D0%B3%D0%B5%D1%80%D0%BE%D0%B8%D0%BD%D0%B5%3A+%D0%B3%D0%B8%D0%BC%D0%BC%D0%B8+%D0%BC%D0%BE%21" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://blog.codeflex.ru/?p=562&amp;title=NumericStapper+%D0%BD%D0%B0+%D0%B3%D0%B5%D1%80%D0%BE%D0%B8%D0%BD%D0%B5%3A+%D0%B3%D0%B8%D0%BC%D0%BC%D0%B8+%D0%BC%D0%BE%21" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://blog.codeflex.ru/?p=562" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://blog.codeflex.ru/?p=562&amp;title=NumericStapper+%D0%BD%D0%B0+%D0%B3%D0%B5%D1%80%D0%BE%D0%B8%D0%BD%D0%B5%3A+%D0%B3%D0%B8%D0%BC%D0%BC%D0%B8+%D0%BC%D0%BE%21" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://blog.codeflex.ru/?p=562&amp;T=NumericStapper+%D0%BD%D0%B0+%D0%B3%D0%B5%D1%80%D0%BE%D0%B8%D0%BD%D0%B5%3A+%D0%B3%D0%B8%D0%BC%D0%BC%D0%B8+%D0%BC%D0%BE%21" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://blog.codeflex.ru/?p=562&amp;title=NumericStapper+%D0%BD%D0%B0+%D0%B3%D0%B5%D1%80%D0%BE%D0%B8%D0%BD%D0%B5%3A+%D0%B3%D0%B8%D0%BC%D0%BC%D0%B8+%D0%BC%D0%BE%21" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://blog.codeflex.ru/?p=562&amp;title=NumericStapper+%D0%BD%D0%B0+%D0%B3%D0%B5%D1%80%D0%BE%D0%B8%D0%BD%D0%B5%3A+%D0%B3%D0%B8%D0%BC%D0%BC%D0%B8+%D0%BC%D0%BE%21" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://blog.codeflex.ru/?p=562" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://blog.codeflex.ru/?p=562" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+NumericStapper+%D0%BD%D0%B0+%D0%B3%D0%B5%D1%80%D0%BE%D0%B8%D0%BD%D0%B5%3A+%D0%B3%D0%B8%D0%BC%D0%BC%D0%B8+%D0%BC%D0%BE%21+@+http://blog.codeflex.ru/?p=562" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://blog.codeflex.ru/?p=562&amp;t=NumericStapper+%D0%BD%D0%B0+%D0%B3%D0%B5%D1%80%D0%BE%D0%B8%D0%BD%D0%B5%3A+%D0%B3%D0%B8%D0%BC%D0%BC%D0%B8+%D0%BC%D0%BE%21" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d562').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
<script type="text/javascript">$$('div.d562').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); </script>]]></content:encoded>
			<wfw:commentRss>http://blog.codeflex.ru/?feed=rss2&amp;p=562</wfw:commentRss>
		</item>
		<item>
		<title>Чего не хватает для полного мобильного счастья: ComboBox своими руками.</title>
		<link>http://blog.codeflex.ru/?p=554</link>
		<comments>http://blog.codeflex.ru/?p=554#comments</comments>
		<pubDate>Fri, 26 Aug 2011 07:37:54 +0000</pubDate>
		<dc:creator>Ольга Корохина</dc:creator>
		
		<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://blog.codeflex.ru/?p=554</guid>
		<description><![CDATA[Как предупреждает горячо мною любимая компания Adobe в доках к спарк-компонентам, большинство из них не оптимизированно для использования в Hero. На свой страх и риск конечно можно их использовать - основательно обработав напильником. А можно &#8220;написать&#8221; свои. Сегодня мы будем делать второе - &#8220;писать&#8221; ComboBox.
Если вы уже пробовали использовать стандартные компоненты с выпадающими частями (DataField, [...]]]></description>
			<content:encoded><![CDATA[<p>Как предупреждает горячо мною любимая компания Adobe в доках к спарк-компонентам, большинство из них не оптимизированно для использования в Hero. На свой страх и риск конечно можно их использовать - основательно обработав напильником. А можно &#8220;написать&#8221; свои. Сегодня мы будем делать второе - &#8220;писать&#8221; ComboBox.<br />
Если вы уже пробовали использовать стандартные компоненты с выпадающими частями (DataField, ComboBox etc.), вы уже знаете что выпадающие запчасти выпадают где угодно - выше, ниже, левее-правее - но только не там где им положено. Можно пронаследоваться от этих компонентов и пытаться выяснить что в них не так, можно воспользоваться SkinnablePopUpContainer и собрать свой собственный компонент. Этим и займёмся.<br />
Нам нужно текстовое поле, реагирующее на щелчёк мыши:</p>
<p><pre><code>
pillDropDown = new TextInput();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pillDropDown.x = 120;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pillDropDown.y = 10;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pillDropDown.width = 300;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pillDropDown.height = 50;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addChild(pillDropDown);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pillDropDown.addEventListener(MouseEvent.CLICK, onMedClick);</code></pre></p>
<p>Хендлер:</p>
<p><pre><code>private function onMedClick(evt:Event):void{
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comboPopUp = new ListPopupWindow();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comboPopUp.dp = new ArrayList(DataBaseController.allDBData[DataBaseController.MEDS_TABLE_NAME]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comboPopUp.addEventListener(ComboEvent.COMBO_CLOSED,comboHandler);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comboPopUp.open(this,true);
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;}</code></pre></p>
<p>Класс для события:</p>
<p><pre><code>public class ComboEvent extends Event
&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;public static const COMBO_CLOSED:String = &quot;combo_closed&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;public var picked:Object;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;public function ComboEvent(type:String, picked:Object)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(type);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.picked = picked;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;}</code></pre></p>
<p>Сам ListPopupView выглядит так:</p>
<p><pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;s:SkinnablePopUpContainer xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; width=&quot;350&quot; height=&quot;400&quot; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; creationComplete=&quot;skinnablepopupcontainer1_creationCompleteHandler(event)&quot; xmlns:mx=&quot;library://ns.adobe.com/flex/mx&quot;&gt;
&nbsp;&nbsp;&lt;fx:Script&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;![CDATA[
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;import utils.ComboEvent;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;import mx.collections.ArrayList;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;import mx.events.FlexEvent;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;import mx.managers.PopUpManager;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;import spark.events.IndexChangeEvent;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[Bindable]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public var dp:ArrayList;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected function skinnablepopupcontainer1_creationCompleteHandler(event:FlexEvent):void
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PopUpManager.centerPopUp(this);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected function list_changeHandler(event:IndexChangeEvent):void
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dispatchEvent(new ComboEvent(ComboEvent.COMBO_CLOSED,list.selectedItem));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.close();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;]]&gt;
&nbsp;&nbsp;&lt;/fx:Script&gt;
&nbsp;&nbsp;&lt;fx:Declarations&gt;
&nbsp;&nbsp;&lt;/fx:Declarations&gt;
&nbsp;&nbsp;&lt;s:Group width=&quot;100%&quot; height=&quot;100%&quot; &gt;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:Rect id=&quot;rect2&quot; radiusX=&quot;8&quot; radiusY=&quot;8&quot; top=&quot;0&quot; right=&quot;0&quot; bottom=&quot;0&quot; left=&quot;0&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:fill&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:SolidColor color=&quot;0xeeeeee&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:fill&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:stroke&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:SolidColorStroke color=&quot;0x222222&quot; weight=&quot;2&quot;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:stroke&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:Rect&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:HGroup width=&quot;100%&quot; height=&quot;100%&quot; paddingBottom=&quot;5&quot; paddingLeft=&quot;5&quot; paddingRight=&quot;5&quot; paddingTop=&quot;5&quot; &gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:VGroup width=&quot;300&quot; height=&quot;400&quot; id=&quot;mainGroup&quot; &gt;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:List id=&quot;list&quot; width=&quot;100%&quot; dataProvider=&quot;{dp}&quot;&nbsp;&nbsp;labelField=&quot;title&quot; change=&quot;list_changeHandler(event)&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:VGroup&gt;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:VScrollBar viewport=&quot;{mainGroup}&quot; height=&quot;400&quot;&nbsp;&nbsp;visible=&quot;{mainGroup.contentHeight &gt; mainGroup.height}&quot; /&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:HGroup&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&lt;/s:Group&gt;
&lt;/s:SkinnablePopUpContainer&gt;</code></pre></p>
<p>И это работает <img src='http://blog.codeflex.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d554').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d554" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://blog.codeflex.ru/?p=554&amp;submitHeadline=%D0%A7%D0%B5%D0%B3%D0%BE+%D0%BD%D0%B5+%D1%85%D0%B2%D0%B0%D1%82%D0%B0%D0%B5%D1%82+%D0%B4%D0%BB%D1%8F+%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B3%D0%BE+%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE+%D1%81%D1%87%D0%B0%D1%81%D1%82%D1%8C%D1%8F%3A+ComboBox+%D1%81%D0%B2%D0%BE%D0%B8%D0%BC%D0%B8+%D1%80%D1%83%D0%BA%D0%B0%D0%BC%D0%B8.&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://blog.codeflex.ru/?p=554&amp;title=%D0%A7%D0%B5%D0%B3%D0%BE+%D0%BD%D0%B5+%D1%85%D0%B2%D0%B0%D1%82%D0%B0%D0%B5%D1%82+%D0%B4%D0%BB%D1%8F+%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B3%D0%BE+%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE+%D1%81%D1%87%D0%B0%D1%81%D1%82%D1%8C%D1%8F%3A+ComboBox+%D1%81%D0%B2%D0%BE%D0%B8%D0%BC%D0%B8+%D1%80%D1%83%D0%BA%D0%B0%D0%BC%D0%B8." rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://blog.codeflex.ru/?p=554&amp;title=%D0%A7%D0%B5%D0%B3%D0%BE+%D0%BD%D0%B5+%D1%85%D0%B2%D0%B0%D1%82%D0%B0%D0%B5%D1%82+%D0%B4%D0%BB%D1%8F+%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B3%D0%BE+%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE+%D1%81%D1%87%D0%B0%D1%81%D1%82%D1%8C%D1%8F%3A+ComboBox+%D1%81%D0%B2%D0%BE%D0%B8%D0%BC%D0%B8+%D1%80%D1%83%D0%BA%D0%B0%D0%BC%D0%B8." rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://blog.codeflex.ru/?p=554" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://blog.codeflex.ru/?p=554&amp;title=%D0%A7%D0%B5%D0%B3%D0%BE+%D0%BD%D0%B5+%D1%85%D0%B2%D0%B0%D1%82%D0%B0%D0%B5%D1%82+%D0%B4%D0%BB%D1%8F+%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B3%D0%BE+%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE+%D1%81%D1%87%D0%B0%D1%81%D1%82%D1%8C%D1%8F%3A+ComboBox+%D1%81%D0%B2%D0%BE%D0%B8%D0%BC%D0%B8+%D1%80%D1%83%D0%BA%D0%B0%D0%BC%D0%B8." rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://blog.codeflex.ru/?p=554&amp;T=%D0%A7%D0%B5%D0%B3%D0%BE+%D0%BD%D0%B5+%D1%85%D0%B2%D0%B0%D1%82%D0%B0%D0%B5%D1%82+%D0%B4%D0%BB%D1%8F+%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B3%D0%BE+%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE+%D1%81%D1%87%D0%B0%D1%81%D1%82%D1%8C%D1%8F%3A+ComboBox+%D1%81%D0%B2%D0%BE%D0%B8%D0%BC%D0%B8+%D1%80%D1%83%D0%BA%D0%B0%D0%BC%D0%B8." rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://blog.codeflex.ru/?p=554&amp;title=%D0%A7%D0%B5%D0%B3%D0%BE+%D0%BD%D0%B5+%D1%85%D0%B2%D0%B0%D1%82%D0%B0%D0%B5%D1%82+%D0%B4%D0%BB%D1%8F+%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B3%D0%BE+%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE+%D1%81%D1%87%D0%B0%D1%81%D1%82%D1%8C%D1%8F%3A+ComboBox+%D1%81%D0%B2%D0%BE%D0%B8%D0%BC%D0%B8+%D1%80%D1%83%D0%BA%D0%B0%D0%BC%D0%B8." rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://blog.codeflex.ru/?p=554&amp;title=%D0%A7%D0%B5%D0%B3%D0%BE+%D0%BD%D0%B5+%D1%85%D0%B2%D0%B0%D1%82%D0%B0%D0%B5%D1%82+%D0%B4%D0%BB%D1%8F+%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B3%D0%BE+%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE+%D1%81%D1%87%D0%B0%D1%81%D1%82%D1%8C%D1%8F%3A+ComboBox+%D1%81%D0%B2%D0%BE%D0%B8%D0%BC%D0%B8+%D1%80%D1%83%D0%BA%D0%B0%D0%BC%D0%B8." rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://blog.codeflex.ru/?p=554" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://blog.codeflex.ru/?p=554" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+%D0%A7%D0%B5%D0%B3%D0%BE+%D0%BD%D0%B5+%D1%85%D0%B2%D0%B0%D1%82%D0%B0%D0%B5%D1%82+%D0%B4%D0%BB%D1%8F+%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B3%D0%BE+%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE+%D1%81%D1%87%D0%B0%D1%81%D1%82%D1%8C%D1%8F%3A+ComboBox+%D1%81%D0%B2%D0%BE%D0%B8%D0%BC%D0%B8+%D1%80%D1%83%D0%BA%D0%B0%D0%BC%D0%B8.+@+http://blog.codeflex.ru/?p=554" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://blog.codeflex.ru/?p=554&amp;t=%D0%A7%D0%B5%D0%B3%D0%BE+%D0%BD%D0%B5+%D1%85%D0%B2%D0%B0%D1%82%D0%B0%D0%B5%D1%82+%D0%B4%D0%BB%D1%8F+%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B3%D0%BE+%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE+%D1%81%D1%87%D0%B0%D1%81%D1%82%D1%8C%D1%8F%3A+ComboBox+%D1%81%D0%B2%D0%BE%D0%B8%D0%BC%D0%B8+%D1%80%D1%83%D0%BA%D0%B0%D0%BC%D0%B8." rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d554').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
<script type="text/javascript">$$('div.d554').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); </script>]]></content:encoded>
			<wfw:commentRss>http://blog.codeflex.ru/?feed=rss2&amp;p=554</wfw:commentRss>
		</item>
		<item>
		<title>LCCS не для всех: VerifyError: Error #1014 и Flex SDK 4.5.1</title>
		<link>http://blog.codeflex.ru/?p=541</link>
		<comments>http://blog.codeflex.ru/?p=541#comments</comments>
		<pubDate>Thu, 21 Jul 2011 09:42:47 +0000</pubDate>
		<dc:creator>Ольга Корохина</dc:creator>
		
		<category><![CDATA[bugs-n-workarounds]]></category>

		<category><![CDATA[Android]]></category>

		<category><![CDATA[LCCS]]></category>

		<guid isPermaLink="false">http://blog.codeflex.ru/?p=541</guid>
		<description><![CDATA[В продолжение прошлого поста: ипользуем Abode LiveCircle Collaboration Service, страдаем, не сдаёмся и побеждаем.
Допустим у нас есть свежепоставленный Flash Builder 4.5 и мы хотим сделать видеочат для Android 3.0. Казалось бы чего уж проще - интернеты пестрят скринкастами, step-by-step инструкциями, видео тьюториталами по этому поводу. Бери и повторяй.
Вот я беру и повторяю: http://tv.adobe.com/watch/adc-presents/video-chat-with-livecycle-collaboration-services-lccs/.
Итак я создаю [...]]]></description>
			<content:encoded><![CDATA[<p>В продолжение прошлого поста: ипользуем Abode LiveCircle Collaboration Service, страдаем, не сдаёмся и побеждаем.<br />
Допустим у нас есть свежепоставленный Flash Builder 4.5 и мы хотим сделать видеочат для Android 3.0. Казалось бы чего уж проще - интернеты пестрят скринкастами, step-by-step инструкциями, видео тьюториталами по этому поводу. Бери и повторяй.<br />
Вот я беру и повторяю: <a href="http://tv.adobe.com/watch/adc-presents/video-chat-with-livecycle-collaboration-services-lccs/">http://tv.adobe.com/watch/adc-presents/video-chat-with-livecycle-collaboration-services-lccs/</a>.<br />
Итак я создаю мобильный проект на основе видов, только для Андроида.<br />
Устанавливаю менеджер сдк (шаги для того чтобы завести этот зверинец подробно описаны в <a href="http://www.adobe.com/devnet/flashplatform/services/collaboration.html">http://www.adobe.com/devnet/flashplatform/services/collaboration.html</a>), в нём выбираю lccs.swc для 10.2 плеера, подключаю её в проект.<br />
Довольно быстро оказывается, что для com.adobe.rtc.session.ConnectSessionContainer я не могу задать ширину и высоту да и вообще собрать не могу потому что билдер считает com.adobe.rtc.session.ConnectSessionContainer не визуальным копонентом. Смотрю в него - он наследник mx.containers.Canvas которого у меня, несмотря на подключенный неймспейс xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;, нет. Сначала я в силу лени создаю инстанц ConnectSessionContainer в листенере события creationComplete моего компонента и вкладываю его в некий UIComponent. Собрать я теперь могу - но получаю ошибку 1014, в точности как автор крика души на <a href="http://forums.adobe.com/message/3664748">http://forums.adobe.com/message/3664748</a> . Тут я наконец понимаю что всё плохо потому что у нас чего-то (почти всего) не хватает в пекадже mx в либах включённых в проект. Здорово что у меня 4.5 билдер, в Package Explorer открываю библиотечки SDK 4.5.1 и вижу, что в либе framework.swc в mx.containers имеем только errors и utilityClasses. Где же наш канвас, так нужный нам и SystemManager-у? Он в отдельной либе которая не включена в структуру мобильного проекта, sdks\4.5.1\frameworks\libs\mx\mx.swc . Подключаем её и всё чудестным образом заводится.<br />
Чем думал тот разработчик который принимал решение не включать устаревшие визуальные компоненты в мобильный проект ясно. Как ясно и чем думал неведомый мне (вероятно индусский?) рзработчик систем менеджера ожидающего именно канвас и ничего кроме канваса в 284-й строке. Одно мы можем знать наверняка: он сидит на винде и флексокодит в папку E:\dev\hero_private\fr ameworks\projects\framework\src\mx\managers\ . То-есть он уже наказан, нам остаётся только простить его <img src='http://blog.codeflex.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d541').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d541" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://blog.codeflex.ru/?p=541&amp;submitHeadline=LCCS+%D0%BD%D0%B5+%D0%B4%D0%BB%D1%8F+%D0%B2%D1%81%D0%B5%D1%85%3A+VerifyError%3A+Error+%231014+%D0%B8+Flex+SDK+4.5.1&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://blog.codeflex.ru/?p=541&amp;title=LCCS+%D0%BD%D0%B5+%D0%B4%D0%BB%D1%8F+%D0%B2%D1%81%D0%B5%D1%85%3A+VerifyError%3A+Error+%231014+%D0%B8+Flex+SDK+4.5.1" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://blog.codeflex.ru/?p=541&amp;title=LCCS+%D0%BD%D0%B5+%D0%B4%D0%BB%D1%8F+%D0%B2%D1%81%D0%B5%D1%85%3A+VerifyError%3A+Error+%231014+%D0%B8+Flex+SDK+4.5.1" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://blog.codeflex.ru/?p=541" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://blog.codeflex.ru/?p=541&amp;title=LCCS+%D0%BD%D0%B5+%D0%B4%D0%BB%D1%8F+%D0%B2%D1%81%D0%B5%D1%85%3A+VerifyError%3A+Error+%231014+%D0%B8+Flex+SDK+4.5.1" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://blog.codeflex.ru/?p=541&amp;T=LCCS+%D0%BD%D0%B5+%D0%B4%D0%BB%D1%8F+%D0%B2%D1%81%D0%B5%D1%85%3A+VerifyError%3A+Error+%231014+%D0%B8+Flex+SDK+4.5.1" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://blog.codeflex.ru/?p=541&amp;title=LCCS+%D0%BD%D0%B5+%D0%B4%D0%BB%D1%8F+%D0%B2%D1%81%D0%B5%D1%85%3A+VerifyError%3A+Error+%231014+%D0%B8+Flex+SDK+4.5.1" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://blog.codeflex.ru/?p=541&amp;title=LCCS+%D0%BD%D0%B5+%D0%B4%D0%BB%D1%8F+%D0%B2%D1%81%D0%B5%D1%85%3A+VerifyError%3A+Error+%231014+%D0%B8+Flex+SDK+4.5.1" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://blog.codeflex.ru/?p=541" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://blog.codeflex.ru/?p=541" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+LCCS+%D0%BD%D0%B5+%D0%B4%D0%BB%D1%8F+%D0%B2%D1%81%D0%B5%D1%85%3A+VerifyError%3A+Error+%231014+%D0%B8+Flex+SDK+4.5.1+@+http://blog.codeflex.ru/?p=541" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://blog.codeflex.ru/?p=541&amp;t=LCCS+%D0%BD%D0%B5+%D0%B4%D0%BB%D1%8F+%D0%B2%D1%81%D0%B5%D1%85%3A+VerifyError%3A+Error+%231014+%D0%B8+Flex+SDK+4.5.1" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d541').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
<script type="text/javascript">$$('div.d541').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); </script>]]></content:encoded>
			<wfw:commentRss>http://blog.codeflex.ru/?feed=rss2&amp;p=541</wfw:commentRss>
		</item>
		<item>
		<title>Не ищи Саида у сухого Арала: Repeater vs Flex 4.5.1</title>
		<link>http://blog.codeflex.ru/?p=537</link>
		<comments>http://blog.codeflex.ru/?p=537#comments</comments>
		<pubDate>Wed, 20 Jul 2011 14:39:29 +0000</pubDate>
		<dc:creator>Ольга Корохина</dc:creator>
		
		<category><![CDATA[Новости]]></category>

		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://blog.codeflex.ru/?p=537</guid>
		<description><![CDATA[Ура, мои потные ручёнки наконец дотянулись до мобильной разработки  Есть у меня задачка сделать прикладушку для Андроида на героине! И наконец будет о чём писать 
Прямо cейчас напишу о том как я искала и не находила репитер. Проблемма связанна с тем что в 4.5.1 пекадж mx какой-то уж вообще немилосердно обрезанный - только эрроры [...]]]></description>
			<content:encoded><![CDATA[<p>Ура, мои потные ручёнки наконец дотянулись до мобильной разработки <img src='http://blog.codeflex.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Есть у меня задачка сделать прикладушку для Андроида на героине! И наконец будет о чём писать <img src='http://blog.codeflex.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Прямо cейчас напишу о том как я искала и не находила репитер. Проблемма связанна с тем что в 4.5.1 пекадж mx какой-то уж вообще немилосердно обрезанный - только эрроры и ивенты, даже Canvas нету  и поэтому - сюрприз сюрприз - распрекрасные плюшечки для коллаборейшена через лив сёкл впринципе не работают ( я победила, ага - красиво сформулирую и напишу ).<br />
А сегодня о том что и как сейчас можно использовать в мире большого Флекса вместо олдскульного mx.core.Repeater. Модно сейчас использовать spark.components.DataGroup с каким-нибудь залихватским рендерером. Вот например так:</p>
<p><pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;s:Group&nbsp;&nbsp;xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot; creationComplete=&quot;group1_creationCompleteHandler(event)&quot;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:mx=&quot;library://ns.adobe.com/flex/mx&quot;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot; &gt;
&nbsp;&nbsp;&lt;fx:Script&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;![CDATA[
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;import mx.events.FlexEvent;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected function group1_creationCompleteHandler(event:FlexEvent):void
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catalogService.send();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;]]&gt;
&nbsp;&nbsp;&lt;/fx:Script&gt;
&nbsp;&nbsp;&lt;fx:Declarations&gt;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;mx:HTTPService id=&quot;catalogService&quot; url=&quot;assets/pills/catalog.xml&quot; resultFormat=&quot;e4x&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;mx:XMLListCollection id=&quot;pillsList&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;source=&quot;{catalogService.lastResult.pill}&quot;/&gt;
&nbsp;&nbsp;
&nbsp;&nbsp;&lt;/fx:Declarations&gt;
&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:DataGroup dataProvider=&quot;{pillsList}&quot; itemRenderer=&quot;components.pillslist.views.renderers.SinglePillRenderer&quot; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; verticalCenter=&quot;0&quot; horizontalCenter=&quot;0&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:layout&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:VerticalLayout/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:layout&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:DataGroup&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;
&lt;/s:Group&gt;</code></pre></p>
<p>Причём мы ж разрабатываем в 4.5 билдере и он нам сам помогает назначить/сделать класс рендерера. Мой рендерер тут прост - .as файл с классом SinglePillRenderer extends LabelItemRenderer у которого переопределён сеттер<br />
<pre><code>override public function set data(value:Object):void
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.data = value;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.label = value.quantity + &quot;. &quot; + value.title;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;} </code></pre></p>
<p>При создании рендерера  - ооо!!! 25 лет ничего подобного! Билдер предлагает нам воспользоваться шаблоном (я поленилась разбираться как добавлять-менеджить эти шаблоны и зависит ли их выбор от типа данных которые указанны как dataProvider для нашей DataGroup) &#8220;Icon item renderer for List&#8221; у которого в поле Decorator Class можно выбрать картинку или иконку. Этот &#8220;Декоратор&#8221; (зря они так назвали, смутили только моё сознание, мало общего с паттерном Decorator как по мне это имеет) будет красивенько заэмбеджин (жаль не импортируется в какую-нибудь папку assets)</p>
<p><code>decorator=&quot;@Embed(&#039;file:///C:/Documents and Settings/olgak/Desktop/1.jpg&#039;)&quot;</code></p>
<p>Автоматизация и прогресс на каждом шагу <img src='http://blog.codeflex.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d537').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d537" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://blog.codeflex.ru/?p=537&amp;submitHeadline=%D0%9D%D0%B5+%D0%B8%D1%89%D0%B8+%D0%A1%D0%B0%D0%B8%D0%B4%D0%B0+%D1%83+%D1%81%D1%83%D1%85%D0%BE%D0%B3%D0%BE+%D0%90%D1%80%D0%B0%D0%BB%D0%B0%3A+Repeater+vs+Flex+4.5.1&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://blog.codeflex.ru/?p=537&amp;title=%D0%9D%D0%B5+%D0%B8%D1%89%D0%B8+%D0%A1%D0%B0%D0%B8%D0%B4%D0%B0+%D1%83+%D1%81%D1%83%D1%85%D0%BE%D0%B3%D0%BE+%D0%90%D1%80%D0%B0%D0%BB%D0%B0%3A+Repeater+vs+Flex+4.5.1" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://blog.codeflex.ru/?p=537&amp;title=%D0%9D%D0%B5+%D0%B8%D1%89%D0%B8+%D0%A1%D0%B0%D0%B8%D0%B4%D0%B0+%D1%83+%D1%81%D1%83%D1%85%D0%BE%D0%B3%D0%BE+%D0%90%D1%80%D0%B0%D0%BB%D0%B0%3A+Repeater+vs+Flex+4.5.1" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://blog.codeflex.ru/?p=537" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://blog.codeflex.ru/?p=537&amp;title=%D0%9D%D0%B5+%D0%B8%D1%89%D0%B8+%D0%A1%D0%B0%D0%B8%D0%B4%D0%B0+%D1%83+%D1%81%D1%83%D1%85%D0%BE%D0%B3%D0%BE+%D0%90%D1%80%D0%B0%D0%BB%D0%B0%3A+Repeater+vs+Flex+4.5.1" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://blog.codeflex.ru/?p=537&amp;T=%D0%9D%D0%B5+%D0%B8%D1%89%D0%B8+%D0%A1%D0%B0%D0%B8%D0%B4%D0%B0+%D1%83+%D1%81%D1%83%D1%85%D0%BE%D0%B3%D0%BE+%D0%90%D1%80%D0%B0%D0%BB%D0%B0%3A+Repeater+vs+Flex+4.5.1" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://blog.codeflex.ru/?p=537&amp;title=%D0%9D%D0%B5+%D0%B8%D1%89%D0%B8+%D0%A1%D0%B0%D0%B8%D0%B4%D0%B0+%D1%83+%D1%81%D1%83%D1%85%D0%BE%D0%B3%D0%BE+%D0%90%D1%80%D0%B0%D0%BB%D0%B0%3A+Repeater+vs+Flex+4.5.1" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://blog.codeflex.ru/?p=537&amp;title=%D0%9D%D0%B5+%D0%B8%D1%89%D0%B8+%D0%A1%D0%B0%D0%B8%D0%B4%D0%B0+%D1%83+%D1%81%D1%83%D1%85%D0%BE%D0%B3%D0%BE+%D0%90%D1%80%D0%B0%D0%BB%D0%B0%3A+Repeater+vs+Flex+4.5.1" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://blog.codeflex.ru/?p=537" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://blog.codeflex.ru/?p=537" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+%D0%9D%D0%B5+%D0%B8%D1%89%D0%B8+%D0%A1%D0%B0%D0%B8%D0%B4%D0%B0+%D1%83+%D1%81%D1%83%D1%85%D0%BE%D0%B3%D0%BE+%D0%90%D1%80%D0%B0%D0%BB%D0%B0%3A+Repeater+vs+Flex+4.5.1+@+http://blog.codeflex.ru/?p=537" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://blog.codeflex.ru/?p=537&amp;t=%D0%9D%D0%B5+%D0%B8%D1%89%D0%B8+%D0%A1%D0%B0%D0%B8%D0%B4%D0%B0+%D1%83+%D1%81%D1%83%D1%85%D0%BE%D0%B3%D0%BE+%D0%90%D1%80%D0%B0%D0%BB%D0%B0%3A+Repeater+vs+Flex+4.5.1" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d537').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
<script type="text/javascript">$$('div.d537').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); </script>]]></content:encoded>
			<wfw:commentRss>http://blog.codeflex.ru/?feed=rss2&amp;p=537</wfw:commentRss>
		</item>
		<item>
		<title>Всё плохо</title>
		<link>http://blog.codeflex.ru/?p=535</link>
		<comments>http://blog.codeflex.ru/?p=535#comments</comments>
		<pubDate>Fri, 17 Jun 2011 12:14:27 +0000</pubDate>
		<dc:creator>Ольга Корохина</dc:creator>
		
		<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://blog.codeflex.ru/?p=535</guid>
		<description><![CDATA[нас стало на одну 0XFFFFFF меньше


Bookmark It
















Hide Sites



$$('div.d535').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); ]]></description>
			<content:encoded><![CDATA[<p>нас стало на одну 0XFFFFFF меньше</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d535').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d535" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://blog.codeflex.ru/?p=535&amp;submitHeadline=%D0%92%D1%81%D1%91+%D0%BF%D0%BB%D0%BE%D1%85%D0%BE&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://blog.codeflex.ru/?p=535&amp;title=%D0%92%D1%81%D1%91+%D0%BF%D0%BB%D0%BE%D1%85%D0%BE" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://blog.codeflex.ru/?p=535&amp;title=%D0%92%D1%81%D1%91+%D0%BF%D0%BB%D0%BE%D1%85%D0%BE" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://blog.codeflex.ru/?p=535" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://blog.codeflex.ru/?p=535&amp;title=%D0%92%D1%81%D1%91+%D0%BF%D0%BB%D0%BE%D1%85%D0%BE" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://blog.codeflex.ru/?p=535&amp;T=%D0%92%D1%81%D1%91+%D0%BF%D0%BB%D0%BE%D1%85%D0%BE" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://blog.codeflex.ru/?p=535&amp;title=%D0%92%D1%81%D1%91+%D0%BF%D0%BB%D0%BE%D1%85%D0%BE" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://blog.codeflex.ru/?p=535&amp;title=%D0%92%D1%81%D1%91+%D0%BF%D0%BB%D0%BE%D1%85%D0%BE" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://blog.codeflex.ru/?p=535" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://blog.codeflex.ru/?p=535" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+%D0%92%D1%81%D1%91+%D0%BF%D0%BB%D0%BE%D1%85%D0%BE+@+http://blog.codeflex.ru/?p=535" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://blog.codeflex.ru/?p=535&amp;t=%D0%92%D1%81%D1%91+%D0%BF%D0%BB%D0%BE%D1%85%D0%BE" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d535').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
<script type="text/javascript">$$('div.d535').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); </script>]]></content:encoded>
			<wfw:commentRss>http://blog.codeflex.ru/?feed=rss2&amp;p=535</wfw:commentRss>
		</item>
		<item>
		<title>XML XML-лю рознь: забавный баг или странная фича?</title>
		<link>http://blog.codeflex.ru/?p=519</link>
		<comments>http://blog.codeflex.ru/?p=519#comments</comments>
		<pubDate>Wed, 22 Dec 2010 09:03:06 +0000</pubDate>
		<dc:creator>Ольга Корохина</dc:creator>
		
		<category><![CDATA[bugs-n-workarounds]]></category>

		<guid isPermaLink="false">http://blog.codeflex.ru/?p=519</guid>
		<description><![CDATA[Вчера наступила на, выражаясь словами проф. Преображенского, просто космического масштаба глупость. Осталось выяснить свою или Adobe-разработчиков.
Задача крайне простая: есть некий класс в который добавляем метод для дампа данных инстанца в XML совершенно примитивного вида. Выглядит всё мирно:
private var internalXMLTemplate:XML = &#60;cmodelgesture id=&#34;100&#34;/&#62;;

public function get internalXML():XML{
&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;var&#160;&#160;res:XML = internalXMLTemplate;
&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;res.@timefromstart = timefromstart;
&#160;&#160;&#160;&#160;&#160;&#160;res.@scorethershold = scoreThershold;
&#160;&#160;&#160;&#160;&#160;&#160;res.@scorepoints = scorePoints;
&#160;&#160;&#160;&#160;&#160;&#160;res.@timetodo = timeToDo;
&#160;&#160;&#160;&#160;&#160;&#160;res.@limboId [...]]]></description>
			<content:encoded><![CDATA[<p>Вчера наступила на, выражаясь словами проф. Преображенского, просто космического масштаба глупость. Осталось выяснить свою или Adobe-разработчиков.<br />
Задача крайне простая: есть некий класс в который добавляем метод для дампа данных инстанца в XML совершенно примитивного вида. Выглядит всё мирно:<br />
<pre><code>private var internalXMLTemplate:XML = &lt;cmodelgesture id=&quot;100&quot;/&gt;;

public function get internalXML():XML{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;&nbsp;res:XML = internalXMLTemplate;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.@timefromstart = timefromstart;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.@scorethershold = scoreThershold;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.@scorepoints = scorePoints;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.@timetodo = timeToDo;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.@limboId = limboId;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for each (var star:Star in AllStars) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var starXml:XML = &lt;item/&gt;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;starXml.@x = star.x;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;starXml.@y = star.y;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;starXml.@order = star.order;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.appendChild(starXml);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.normalize();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return res;
&nbsp;&nbsp;&nbsp;&nbsp;}
</code></pre><br />
Казалось бы - что может быть понятнее. Есть некий &#8220;шаблон&#8221;, присваиваем некой переменной его значение и добавляем туда аттрибуты/чайлды. Но не тут то было! Вызвав эту функцию у экземпляра класса один раз мы получаем один набор , вызвав два - каждый из детей уже включён в res дважды, три раза- трижды. Ларчик открывается просто - хотя на локализацию маразма ушло непростительно много времени. Оказывается, мой терпеливый читатель, что тут имеет место быть присвоение ссылок и добавляя нечто в res мы тем самым добавляем это в &#8220;шаблон&#8221; internalXMLTemplate! Вёркэраунд просто и очевиден - заменяем </p>
<p><pre><code>var&nbsp;&nbsp;res:XML = internalXMLTemplate; 

на 

var&nbsp;&nbsp;res:XML =&nbsp;&nbsp;&lt;cmodelgesture id=&quot;100&quot;/&gt;;</code></pre></p>
<p>Не знаю, может так и должно быть, может это где-то описанно&#8230;. Чукча, как известно, не читатель - чукча писатель.</p>
<p>Пы Сы: Старшие товарищи тут меня совершенно справедливо стыдят, говоря что все объекты передаются по ссылке (согласна) и предлагая второй вёркэраунд:</p>
<p><code>private const internalXMLTemplate:XML = &lt;cmodelgesture id=&quot;100&quot;/&gt;;</code></p>
<p>Каюсь - блондинка <img src='http://blog.codeflex.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Но грабли явно из тех, коорые стоит знать в контексте их использования <img src='http://blog.codeflex.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d519').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d519" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://blog.codeflex.ru/?p=519&amp;submitHeadline=XML+XML-%D0%BB%D1%8E+%D1%80%D0%BE%D0%B7%D0%BD%D1%8C%3A+%D0%B7%D0%B0%D0%B1%D0%B0%D0%B2%D0%BD%D1%8B%D0%B9+%D0%B1%D0%B0%D0%B3+%D0%B8%D0%BB%D0%B8+%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F+%D1%84%D0%B8%D1%87%D0%B0%3F&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://blog.codeflex.ru/?p=519&amp;title=XML+XML-%D0%BB%D1%8E+%D1%80%D0%BE%D0%B7%D0%BD%D1%8C%3A+%D0%B7%D0%B0%D0%B1%D0%B0%D0%B2%D0%BD%D1%8B%D0%B9+%D0%B1%D0%B0%D0%B3+%D0%B8%D0%BB%D0%B8+%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F+%D1%84%D0%B8%D1%87%D0%B0%3F" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://blog.codeflex.ru/?p=519&amp;title=XML+XML-%D0%BB%D1%8E+%D1%80%D0%BE%D0%B7%D0%BD%D1%8C%3A+%D0%B7%D0%B0%D0%B1%D0%B0%D0%B2%D0%BD%D1%8B%D0%B9+%D0%B1%D0%B0%D0%B3+%D0%B8%D0%BB%D0%B8+%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F+%D1%84%D0%B8%D1%87%D0%B0%3F" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://blog.codeflex.ru/?p=519" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://blog.codeflex.ru/?p=519&amp;title=XML+XML-%D0%BB%D1%8E+%D1%80%D0%BE%D0%B7%D0%BD%D1%8C%3A+%D0%B7%D0%B0%D0%B1%D0%B0%D0%B2%D0%BD%D1%8B%D0%B9+%D0%B1%D0%B0%D0%B3+%D0%B8%D0%BB%D0%B8+%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F+%D1%84%D0%B8%D1%87%D0%B0%3F" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://blog.codeflex.ru/?p=519&amp;T=XML+XML-%D0%BB%D1%8E+%D1%80%D0%BE%D0%B7%D0%BD%D1%8C%3A+%D0%B7%D0%B0%D0%B1%D0%B0%D0%B2%D0%BD%D1%8B%D0%B9+%D0%B1%D0%B0%D0%B3+%D0%B8%D0%BB%D0%B8+%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F+%D1%84%D0%B8%D1%87%D0%B0%3F" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://blog.codeflex.ru/?p=519&amp;title=XML+XML-%D0%BB%D1%8E+%D1%80%D0%BE%D0%B7%D0%BD%D1%8C%3A+%D0%B7%D0%B0%D0%B1%D0%B0%D0%B2%D0%BD%D1%8B%D0%B9+%D0%B1%D0%B0%D0%B3+%D0%B8%D0%BB%D0%B8+%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F+%D1%84%D0%B8%D1%87%D0%B0%3F" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://blog.codeflex.ru/?p=519&amp;title=XML+XML-%D0%BB%D1%8E+%D1%80%D0%BE%D0%B7%D0%BD%D1%8C%3A+%D0%B7%D0%B0%D0%B1%D0%B0%D0%B2%D0%BD%D1%8B%D0%B9+%D0%B1%D0%B0%D0%B3+%D0%B8%D0%BB%D0%B8+%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F+%D1%84%D0%B8%D1%87%D0%B0%3F" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://blog.codeflex.ru/?p=519" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://blog.codeflex.ru/?p=519" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+XML+XML-%D0%BB%D1%8E+%D1%80%D0%BE%D0%B7%D0%BD%D1%8C%3A+%D0%B7%D0%B0%D0%B1%D0%B0%D0%B2%D0%BD%D1%8B%D0%B9+%D0%B1%D0%B0%D0%B3+%D0%B8%D0%BB%D0%B8+%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F+%D1%84%D0%B8%D1%87%D0%B0%3F+@+http://blog.codeflex.ru/?p=519" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://blog.codeflex.ru/?p=519&amp;t=XML+XML-%D0%BB%D1%8E+%D1%80%D0%BE%D0%B7%D0%BD%D1%8C%3A+%D0%B7%D0%B0%D0%B1%D0%B0%D0%B2%D0%BD%D1%8B%D0%B9+%D0%B1%D0%B0%D0%B3+%D0%B8%D0%BB%D0%B8+%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F+%D1%84%D0%B8%D1%87%D0%B0%3F" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d519').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
<script type="text/javascript">$$('div.d519').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); </script>]]></content:encoded>
			<wfw:commentRss>http://blog.codeflex.ru/?feed=rss2&amp;p=519</wfw:commentRss>
		</item>
		<item>
		<title>Большой Брат смотрит на тебя: тотальный контроль в AS-приложении.</title>
		<link>http://blog.codeflex.ru/?p=504</link>
		<comments>http://blog.codeflex.ru/?p=504#comments</comments>
		<pubDate>Wed, 20 Oct 2010 10:32:59 +0000</pubDate>
		<dc:creator>Ольга Корохина</dc:creator>
		
		<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://blog.codeflex.ru/?p=504</guid>
		<description><![CDATA[Бывает так что ну вот очень что-то нужно узнать - а никак не получается  Вот например у вас Flex проект во FlashDevelop и вообще всё плохо - нужно запускать это добро из-под Flash (потому то у вас инверсивная кинематика и вы ленивая блондинка&#8230; бывает). Нет жизни без дебага, трейсы маст дай! Добавьте к этому [...]]]></description>
			<content:encoded><![CDATA[<p>Бывает так что ну вот очень что-то нужно узнать - а никак не получается <img src='http://blog.codeflex.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Вот например у вас Flex проект во FlashDevelop и вообще всё плохо - нужно запускать это добро из-под Flash (потому то у вас инверсивная кинематика и вы ленивая блондинка&#8230; бывает). Нет жизни без дебага, трейсы маст дай! Добавьте к этому жуткое неудобство ни к ночи будь помянутого IDE и мысли о необходимости что-то менять очень быстро придут Вам в голову. Что можно изменить? Собственно об этом и пост. Что можно и должно сделать для улучшения уровня контроля над AS-приложеним на этапе разработки и отладки.</p>
<p>Во-первых можно воспользоваться незадокументированным  классом Flash.trace.Trace(). Почитать о нём можно в <a href="http://blog.pirrest.com/ru/2008/05/26/80/">Блохах</a> . Лежит он в playerglobal.swc и его &#8220;модель&#8221; выглядит следующим образом:<br />
<pre><code>
package flash.trace
{
&nbsp;&nbsp;public class Trace extends Object
&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;public static const FILE : *;
&nbsp;&nbsp;&nbsp;&nbsp;public static const LISTENER : *;
&nbsp;&nbsp;&nbsp;&nbsp;public static const METHODS : int;
&nbsp;&nbsp;&nbsp;&nbsp;public static const METHODS_AND_LINES : int;
&nbsp;&nbsp;&nbsp;&nbsp;public static const METHODS_AND_LINES_WITH_ARGS : int;
&nbsp;&nbsp;&nbsp;&nbsp;public static const METHODS_WITH_ARGS : int;
&nbsp;&nbsp;&nbsp;&nbsp;public static const OFF : int;

&nbsp;&nbsp;&nbsp;&nbsp;public static function getLevel (target:int = 2) : int;

&nbsp;&nbsp;&nbsp;&nbsp;public static function getListener () : Function;

&nbsp;&nbsp;&nbsp;&nbsp;public static function setLevel (l:int, target:int = 2) : *;

&nbsp;&nbsp;&nbsp;&nbsp;public static function setListener (f:Function) : *;

&nbsp;&nbsp;&nbsp;&nbsp;public function Trace ();
&nbsp;&nbsp;}
}
</code></pre><br />
Самый простой способ его применения - добавить строчку<br />
<pre><code>
Trace.setLevel(Trace.METHODS_WITH_ARGS, Trace.FILE);
</code></pre><br />
и наслаждаться в output откровениями вроде</p>
<blockquote><p>
89465075 AVMINF: MTHD flash.events::EventDispatcher/removeEventListener () @ 0&#215;29D508A0<br />
89465080 AVMINF: MTHD flash.display::MovieClip/gotoAndStop () @ 0&#215;29D56780<br />
&#8230;<br />
89465083 AVMINF: MTHD global$init ()<br />
89465083 AVMINF: MTHD flash.system::ApplicationDomain$cinit ()<br />
&#8230;<br />
89465084 AVMINF: MTHD flash.display::LoaderInfo/get parameters () @ 0&#215;29D56BE0<br />
89465084 AVMINF: MTHD flash.display::LoaderInfo/_getArgs () @ 0&#215;29D56F50<br />
89465084 AVMINF: MTHD flash.display::DisplayObject/get root () @ 0&#215;29D56AA0<br />
&#8230;<br />
89465086 AVMINF: MTHD flash.text::TextField/get text () @ 0&#215;29D56FD0<br />
89465086 AVMINF: MTHD flash.text::TextField/set text () @ 0&#215;29D57020<br />
&#8230;<br />
89465095 AVMINF: MTHD gface.network.TCPConnection::GFaceRedDwarfWrapper (&#8221;192.168.10.147&#8243;,40510,&#8221;default_test_session_for_limbo&#8221;,[]@10efae41,[]@10efa9a9,[]@24db2eb1,[]@24db28c9) @ 0&#215;29994CE0
</p></blockquote>
<p>Рискну предположить, что много цифр вначале это тайм стемп, AVMINF означает что-то вроде &#8220;информация эдоби виртуальной машины&#8221;, MTHD означает что был вызван метод. Затем идёт fully qualified имя класса в котором (или в экземпляре которого) был вызван метод, название метода (акцессоры обозначены соответствующе, что отдельно приятно!)  и аргумент(ы) с которым(и) метод был вызван. Если аргументы были переданы не по значению а по ссылке (как в случае с аргументами-массивами) - прошу убедиться- мы увидим адресс в памяти ([]@10efae41 и т.д.). Статические методы классов будут содержать $ (GameVO$/getInstance () - получаем инстанц синглтона). Играться с уровнем вывода и прочими штуками для класса Trace() можно до тех пор, пока лично Вам не станет удобно с ним работать.</p>
<p>Вторая вещь, которая может улучшить ваше настроение, описана в посте <a href="http://flash-ripper.com/tips/how-to-hook-all-flex-uicomponent-events">потрошителя</a>. Это отличная возможность ловить все события всех визуальных компонентов. Нам всего-то нужно написать функцию-хук (не знаю кому как а мне сразу Drupal кровавый в глазах встаёт) с 2-мя аргументами<br />
<pre><code>
 private function allEventsHook(evt:Event, uicomponent:Object):void
{}
</code></pre></p>
<p>и &#8220;повесить&#8221; её на dispatchEvent всех визуальных компонентов.</p>
<p><pre><code>
UIComponent.mx_internal::dispatchEventHook = allEventsHook;
</code></pre></p>
<p>Тут работает, насколько я понимаю, наше коллективное бессознательное- прототипирование. Мы добавляем (переопределяем, точнее) метод неймспейса mx_internal базового класса всех визуальных компонентов UIComponent. Какой конткретно объект будет передан в вашу функцию? Наследник UIComponent или сам UIComponent <img src='http://blog.codeflex.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Какие у него поля и методы - все знаем. Тут можно разгуляться - и имя вытрейсить и класс и вообще полную структуру пользуясь ObjectUtil.<br />
Справедливости ради хочу заметить, что дабы не нарушать задуманный разработчиками фреймвёрка workflow я перед таким переопределением хука сохраняю ссылку на старый и если он существует - вызываю его в переопределённой фукнции, то бишь</p>
<p><pre><code>
var oldHook:* = UIComponent.mx_internal::dispatchEventHook;
UIComponent.mx_internal::dispatchEventHook = allEventsHook;

private function allEventsHook(evt:Event, uicomponent:Object):void
{
oldHook.call(this, evt, uicomponent);

...

}
</code></pre><br />
Желаю приятной и контролируемой разработки!</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d504').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d504" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://blog.codeflex.ru/?p=504&amp;submitHeadline=%D0%91%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B9+%D0%91%D1%80%D0%B0%D1%82+%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B8%D1%82+%D0%BD%D0%B0+%D1%82%D0%B5%D0%B1%D1%8F%3A+%D1%82%D0%BE%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9+%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C+%D0%B2+AS-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8.&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://blog.codeflex.ru/?p=504&amp;title=%D0%91%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B9+%D0%91%D1%80%D0%B0%D1%82+%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B8%D1%82+%D0%BD%D0%B0+%D1%82%D0%B5%D0%B1%D1%8F%3A+%D1%82%D0%BE%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9+%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C+%D0%B2+AS-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8." rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://blog.codeflex.ru/?p=504&amp;title=%D0%91%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B9+%D0%91%D1%80%D0%B0%D1%82+%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B8%D1%82+%D0%BD%D0%B0+%D1%82%D0%B5%D0%B1%D1%8F%3A+%D1%82%D0%BE%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9+%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C+%D0%B2+AS-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8." rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://blog.codeflex.ru/?p=504" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://blog.codeflex.ru/?p=504&amp;title=%D0%91%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B9+%D0%91%D1%80%D0%B0%D1%82+%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B8%D1%82+%D0%BD%D0%B0+%D1%82%D0%B5%D0%B1%D1%8F%3A+%D1%82%D0%BE%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9+%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C+%D0%B2+AS-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8." rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://blog.codeflex.ru/?p=504&amp;T=%D0%91%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B9+%D0%91%D1%80%D0%B0%D1%82+%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B8%D1%82+%D0%BD%D0%B0+%D1%82%D0%B5%D0%B1%D1%8F%3A+%D1%82%D0%BE%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9+%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C+%D0%B2+AS-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8." rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://blog.codeflex.ru/?p=504&amp;title=%D0%91%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B9+%D0%91%D1%80%D0%B0%D1%82+%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B8%D1%82+%D0%BD%D0%B0+%D1%82%D0%B5%D0%B1%D1%8F%3A+%D1%82%D0%BE%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9+%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C+%D0%B2+AS-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8." rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://blog.codeflex.ru/?p=504&amp;title=%D0%91%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B9+%D0%91%D1%80%D0%B0%D1%82+%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B8%D1%82+%D0%BD%D0%B0+%D1%82%D0%B5%D0%B1%D1%8F%3A+%D1%82%D0%BE%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9+%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C+%D0%B2+AS-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8." rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://blog.codeflex.ru/?p=504" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://blog.codeflex.ru/?p=504" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+%D0%91%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B9+%D0%91%D1%80%D0%B0%D1%82+%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B8%D1%82+%D0%BD%D0%B0+%D1%82%D0%B5%D0%B1%D1%8F%3A+%D1%82%D0%BE%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9+%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C+%D0%B2+AS-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8.+@+http://blog.codeflex.ru/?p=504" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://blog.codeflex.ru/?p=504&amp;t=%D0%91%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B9+%D0%91%D1%80%D0%B0%D1%82+%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B8%D1%82+%D0%BD%D0%B0+%D1%82%D0%B5%D0%B1%D1%8F%3A+%D1%82%D0%BE%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9+%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C+%D0%B2+AS-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8." rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d504').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
<script type="text/javascript">$$('div.d504').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); </script>]]></content:encoded>
			<wfw:commentRss>http://blog.codeflex.ru/?feed=rss2&amp;p=504</wfw:commentRss>
		</item>
		<item>
		<title>Purclipse: MVC в каждый дом</title>
		<link>http://blog.codeflex.ru/?p=468</link>
		<comments>http://blog.codeflex.ru/?p=468#comments</comments>
		<pubDate>Tue, 12 Oct 2010 14:23:16 +0000</pubDate>
		<dc:creator>Ольга Корохина</dc:creator>
		
		<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://blog.codeflex.ru/?p=468</guid>
		<description><![CDATA[С порога хочу побрагодарить Михаила за возможность пощупать и оставить у себя ключи от плагина где 3 буквы лежат. Спасибо огромное! Пробовала один раз- понравилось!
Итак, эта статья- честное и правдивое описание моих опытов с плагином Purclipse,  упрощающего разработку в Eclipse с использованием микроархитектурного фреймвёрка PureMVC. Он действительно здорово делает то, зачем предназначен! В моём [...]]]></description>
			<content:encoded><![CDATA[<p>С порога хочу побрагодарить Михаила за возможность пощупать и оставить у себя ключи от плагина где 3 буквы лежат. Спасибо огромное! Пробовала один раз- понравилось!<br />
Итак, эта статья- честное и правдивое описание моих опытов с плагином <a href="http://www.slide.name/pureclipse/">Purclipse</a>,  упрощающего разработку в Eclipse с использованием микроархитектурного фреймвёрка <a href="http://puremvc.org/component/option,com_wrapper/Itemid,193/">PureMVC</a>. Он действительно здорово делает то, зачем предназначен! В моём текущем проекте я пользую <a href="http://trac.puremvc.org/PureMVC_AS3_MultiCore">multycore</a> порт для ActionScript 3. Проект эйровый, достаточно старый и разросся уже до неприличия. Поэтому перед тем как натравливать на него нового питомца я решила потренироваться на кошечках :).<br />
Итак, создаём проект с нуля (тут и далее считается, что вы установили purclipse):<br />
Создавать структуру проекта лучше в Project Explorer, в Package Explorer будет не так впечатляюще. Создаём новый проект, щёлкаем правой кнопкой по папке src, находим значок purclipse и выбираем Build MVC structure. Вуаля! Имеем структуру проекта. Так же здорово можно создать новую комманду (правда только наследника SimpleCommand, макро комманду делаем по старинке; учитывая, какая это редкость, это скорее плюс- экономит клики и сокращает нам время до радостной встречи с кодом), прокси и медиатор для выбранного компонента. Медиаторы будут созданны в пекадже view, что тоже мне понравилось (тот самый случай, когда дефолты рулят). Есть возможность выбирать тип (<a href="http://code.google.com/p/fabrication/">Fabrication</a> is used, MultyCore или дефолтовый).  В новорождённых медиаторах есть пустышки основных функций, handleNotification с кусочком закоменченного кода- эдакая изюминка. Я не использую фабрикейшен, поэтому не судите строго. Но для &#8220;обычного&#8221; MultyCore тут бы хотелось немного более интеллектуального поведения: вместе со структурой проекта в дефолтовом пекадже создаётся файл SrcConstants.as явно предназначенный для хранения всяких разных констант. Было бы здорово, если бы в стабы функций помещалась не некая абстрактная ApplicationConstants.SOME_NOTE, а константы из этого класса. Ну хоть чуть-чуть, ну хоть пока их не много. Или вот, например, добавлять ещё и шаблонный класс для ApplicationFacade. И при создании медиатора для компонентов анализировать их структуру (на наличие кнопок и прочего публичного добра) и  создавать листенеры-делегаты&#8230; <img src='http://blog.codeflex.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Шучу конечно, лучшее почти всегда враг хорошего.<br />
Так же вам придётся самостоятельно добавить в проект саму библиотеку с PureMVC.<br />
Как и было обещанно- пока всё нравится. Будем считать что эксперименты с кошками удались, переходим  к водным процедурам.<br />
Использование плагина в большом, неновом проекте так же легко и приятно- совершенно ничем не отличается от тестовых забегов. Села немножко поэкспериментировать- через пару часов обнаружила себя в глубоком дебаге <img src='http://blog.codeflex.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Как по мне- лучшая характиристика для плагина.<br />
Спасибо, ребята! Буду пользоваться и всем советую.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d468').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d468" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://blog.codeflex.ru/?p=468&amp;submitHeadline=Purclipse%3A+MVC+%D0%B2+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+%D0%B4%D0%BE%D0%BC&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://blog.codeflex.ru/?p=468&amp;title=Purclipse%3A+MVC+%D0%B2+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+%D0%B4%D0%BE%D0%BC" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://blog.codeflex.ru/?p=468&amp;title=Purclipse%3A+MVC+%D0%B2+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+%D0%B4%D0%BE%D0%BC" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://blog.codeflex.ru/?p=468" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://blog.codeflex.ru/?p=468&amp;title=Purclipse%3A+MVC+%D0%B2+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+%D0%B4%D0%BE%D0%BC" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://blog.codeflex.ru/?p=468&amp;T=Purclipse%3A+MVC+%D0%B2+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+%D0%B4%D0%BE%D0%BC" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://blog.codeflex.ru/?p=468&amp;title=Purclipse%3A+MVC+%D0%B2+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+%D0%B4%D0%BE%D0%BC" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://blog.codeflex.ru/?p=468&amp;title=Purclipse%3A+MVC+%D0%B2+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+%D0%B4%D0%BE%D0%BC" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://blog.codeflex.ru/?p=468" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://blog.codeflex.ru/?p=468" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Purclipse%3A+MVC+%D0%B2+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+%D0%B4%D0%BE%D0%BC+@+http://blog.codeflex.ru/?p=468" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://blog.codeflex.ru/?p=468&amp;t=Purclipse%3A+MVC+%D0%B2+%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9+%D0%B4%D0%BE%D0%BC" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.codeflex.ru/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d468').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
<script type="text/javascript">$$('div.d468').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); </script>]]></content:encoded>
			<wfw:commentRss>http://blog.codeflex.ru/?feed=rss2&amp;p=468</wfw:commentRss>
		</item>
	</channel>
</rss>

