logo
  • Home
  • Acerca
  • Autores
  • Faq
  • Rede
  Twitter   Feed-me! RSS!
Jan 26

Flex Drag Drop Component

Escrito por Felipe Borella em 1, 6, Adobe, app, AR, back, BI, Bindable, Botões, collection, Componente, DataProvider, demo, Drag And Drop, filtra, Flex, fonte, geo, ide, IE, if, label, layout, lista, Mate, MXML, O, on, Pessoal, pt, RIA, Ria’s Geral, Tema, tool, UI, XML @ 01 26th, 2011 | via http://www.fborella.com.br/blog/ | Sem comentários
Felipe Borella
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Olá Pessoal!

Depois de algum tempo estou mostrando um componente no qual uso seguidamente trata-se de duas listas para Drag and Drop, porém não posso disponibilizar o fonte ainda ( vou ver se eu posso hehe ) talvez se eu der uma enxugada nele eu poste ai para vcs leitores, mas para verificar como fica o fonte é mais ou menos isso abaixo.

Fonte:

xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
	xmlns:fborella="br.com.fborella.*" backgroundColor="white">
	<mx:Script>
		[CDATA[
			import mx.collections.ArrayCollection;
?
			[Bindable]
			public var disciplinas:ArrayCollection=
				new ArrayCollection(
				[{descrdisciplina: "PORTUGUES"},
				 {descrdisciplina: "MATEMATICA"},
				 {descrdisciplina: "CIÊNCIAS"},
				 {descrdisciplina: "HISTÓRIA"},
				 {descrdisciplina: "GEOGRAFIA"},
				 {descrdisciplina: "EDUCAÇÃO FÍSICA"},
				 {descrdisciplina: "ENSINO RELIGIOSO"},
				 {descrdisciplina: "FÍSICA"}]);
?
			[Bindable]
			public var droppedDisciplinas:ArrayCollection=
				new ArrayCollection(
				[{descrdisciplina: "QUÍMICA"},
				{descrdisciplina: "BIOLOGIA"}]);
		]]>
	mx:Script>
	<fborella:FList width="100%" height="100%" id="lista"
			dataProvider="{disciplinas}" tDataProvider="{droppedDisciplinas}"
			labelField="descrdisciplina" tLabelField="descrdisciplina"
			filtrarLabel="Todas Disciplinas" tFiltrarLabel="Disciplinas Associadas">
	fborella:FList>
mx:Application>

Demo:

Arraste, movimente os objetos com os botões etc, observe os tool tips que vai ajudar na navegação.

Até em breve
Comentem.

Felipe Borella

Jan 17

Dica Flex – Fixando a largura dos botões no Spark ButtonBar

Escrito por Pablo Souza em 1, 2009, 4, Adobe, app, AR, bar, botão, Botões, código, Componente, custom, DataProvider, Dica, efeito, Flex, Flex 4, ide, IE, layout, library, MXML, O, on, RIA, Ria’s Geral, spark, UI, XML @ 01 17th, 2011 | via http://rectius.com.br/blog | Sem comentários
Pablo Souza
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

A dica Flex de hoje mostra como fixar a largura dos botões do componente Spark ButtonBar no Flex 4. Para isso vamos apenas criar um layout customizado horizontal e setar as propriedades columnWidth e variableColumnWidth.

Veja o código a seguir:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
			   xmlns:s="library://ns.adobe.com/flex/spark"
			   xmlns:mx="library://ns.adobe.com/flex/mx">
	<s:ButtonBar horizontalCenter="0" verticalCenter="0">
		<s:layout>
			<s:HorizontalLayout columnWidth="80" variableColumnWidth="false" />
		s:layout>
		<s:dataProvider>
			<s:ArrayList source="[Botão 1, Botão Dois, Botão 3, Botão Número 4]" />
		s:dataProvider>
	s:ButtonBar>
?
s:Application>

Lembrando que se a propriedade variableColumnWidth estiver setada como true a propriedade columnWidth não terá efeito.

Espero que tenham gostado. Até a próxima!

Dez 30

Dica Flex – Disparando eventos customizados do ItemRenderer com Flex 4

Escrito por Pablo Souza em 1, 2009, Adobe, app, AR, BI, blog, boolean, botão, class, classe, classes, código, components, custom, DataGrid, DataProvider, demo, Dica, dispatch, dispatchEvent, event, EventListener, Evento, Eventos, events, exemplo, flash, Flex, for, function, handle, ide, IE, int, itemRenderer, label, library, lista, LOB, MXML, O, on, problema, problemas, pt, RIA, Ria’s Geral, spark, string, tag, TAT, UI, uint, XML, XP @ 12 30th, 2010 | via http://rectius.com.br/blog | Sem comentários
Pablo Souza
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Nossa dica Flex de hoje serve para aqueles que desejam acessar métodos ou propriedades do objeto application ou parent documents de dentro de um item renderer. O Flex nos oferece as seguintes formas de acesso:

mx.core.FlexGlobals.topLevelApplication: Retorna o objeto application principal, que pode ser do tipo spark.components.Application ou mx.core.Application.

mx.core.UIComponent.parentDocument: Retorna o parent document do objeto atual. Usado como alternativa ao exemplo que vamos mostrar em seguida.

mx.core.UIComponent.parentApplication: Retorna o objeto application onde o objeto atual está inserido.

Além das formas acima, uma alternativa mais elegante (e orientada a obejtos) para acessar métodos ou propriedades do parent document ou application é utilizarmos os eventos do Flex.

Imagine que temos uma aplicação que lista todos os seus usuários num datagrid. Em uma de suas colunas temos um item renderer com um botão que exclui esses usuários. Para tal precisaremos acessar um método no parent document, que no nosso exemplo será a própria application. Como vimos anteriormente podemos obter o objeto parent document através da propriedade mx.core.UIComponent.parentDocument e dessa forma chamar nosso método de exclusão. Esse método funciona corretamente, porém gera um grande acoplamento entre os objetos além de quebrar o encapsulamento das classes. Para resolvermos esses problemas vamos fazer com que ao clicar no botão excluir um evento bubble seja disparado e no objeto parent document vamos escutar o evento e então chamar o método de exclusão.

O trecho de código abaixo mostra nossa datagrid com o item renderer que possui o botão de exclusão:

1
2
3
4
5
6
7
8
    <mx:DataGrid id="dataGrid" dataProvider="{model}">
        <mx:columns>
            <mx:DataGridColumn headerText="Nome" dataField="nome" />
            <mx:DataGridColumn
                headerText="Ação" dataField="nome"
                itemRenderer="br.com.rectius.itemRendererExample.ButtonItemRenderer" />
        </mx:columns>
    </mx:DataGrid>

A seguir está o código do nosso item renderer. Repare que ao clicar no botão excluir estamos disparando um evento customizado:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="utf-8"?>
<s:MXDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
                          xmlns:s="library://ns.adobe.com/flex/spark"
                          xmlns:mx="library://ns.adobe.com/flex/mx"
                          focusEnabled="true">

    <fx:Metadata>
        [Event(name="ExcluirEvent",type="br.com.rectius.itemRendererExample.ExcluirEvent")]
    </fx:Metadata>

    <fx:Script>
        <![CDATA[
            import br.com.rectius.itemRendererExample.event.UsersEvent;

            protected function lblData_clickHandler(event:MouseEvent):void
            {
                var excluirEvent:UsersEvent = new UsersEvent(UsersEvent.EXCLUIR_EVENT, dataGridListData.label, true);
                dispatchEvent(excluirEvent);
            }
        ]]>
    </fx:Script>

    <s:Button id="lblData" top="0" left="0" right="0" bottom="0"
              label="Excluir" click="lblData_clickHandler(event)" />

</s:MXDataGridItemRenderer>

A tag Metadata expõe ao parent document o evento customizado do botão excluir:

1
2
3
    <fx:Metadata>
        [Event(name="ExcluirEvent",type="br.com.rectius.itemRendererExample.ExcluirEvent")]
    </fx:Metadata>

Isso nos possibilitou escutar o evento “ExcluirEvent” no parent document:

1
2
3
4
            protected function application1_initializeHandler(event:FlexEvent):void
            {
                dataGrid.addEventListener(UsersEvent.EXCLUIR_EVENT, excluirHandler);
            }

Abaixo você pode ver o evento que criamos para encapsular o usuário a ser excluído. Nesse exemplo estamos setando na propriedade data do nosso evento UsersEvent uma string com o nome do usuário, porém num cenário real poderíamos enviar o ID do usuário, um Value Object que armazenaria todas as propriedades do usuário clicado, ou qualquer outro objeto conveniente para sua situação:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package br.com.rectius.itemRendererExample.event
{
    import flash.events.DataEvent;

    public class UsersEvent extends DataEvent
    {
        public static var EXCLUIR_EVENT:String = "ExcluirEvent";

        public function UsersEvent(type:String, data:String="", bubbles:Boolean=false, cancelable:Boolean=false)
        {
            super(type, bubbles, cancelable, data);
        }
    }
}

Esperam que tenham gostado. Baixem aqui o projeto de exemplo.

Até a proxima!

Dez 28

Flex4 – Usando data binding bidirecional com XMLList

Escrito por Pablo Souza em 1, 2009, 4, Adobe, Air, app, AR, bar, BI, blog, class, comunidade, Data Binding, DataProvider, Desenvolvedor, desenvolvedores, exemplo, Flex, Flex 3, Flex 4, fonte, for, ide, IE, if, int, label, layout, library, menu, MXML, O, on, Ria’s Geral, spark, tag, TextInput, UI, utils, Ved, wow, XML, XMLList @ 12 28th, 2010 | via http://rectius.com.br/blog | Sem comentários
Pablo Souza
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Eu já falei na semana passada sobre o Data Binding bidirecional, e hoje volto a falar devido a algumas dúvidas que se tornaram recorrentes em fóruns da comunidade de desenvolvedores Flex. Essa funcionalidade foi uma das coisas que simplificaram as coisas no Flex 4, basicamente permitindo que você utilize uma propriedade tanto como fonte quanto como destino para um determinado valor.

No Flex 3 tinhamos a possibilidade de fazer binding bidirecional usando o método mx.binding.utils.BindingUtils.bindProperty() ou a tag mx:binding. Porém no Flex 4 a nova notação @{property} simplificou a sintaxe. Vale lembrar que o uso do data binding no Flex vem com um alto custo de performance, portanto sempre analise suas necessidades antes de sair utilizando-o por todo lado em sua aplicação.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx">

    <fx:Declarations>

        <fx:XMLList id="meuMenu">
            <menuitem label="@{txtItemMenu.text}"/>
            <menuitem label="Item 02"/>
        </fx:XMLList>

    </fx:Declarations>

    <s:layout>
        <s:VerticalLayout horizontalAlign="center" verticalAlign="middle" gap="10"/>
    </s:layout>

    <mx:MenuBar labelField="@label" dataProvider="{meuMenu}" />

    <s:TextInput id="txtItemMenu" text="Item 01" />

</s:Application>

Espero que tenham gostado. Baixe aqui o projeto de exemplo.

Até a próxima!

Nov 3

[ Adobe Flex ] Mudando o estilo visual dos Charts

Escrito por Erko Bridee em 1, 2009, 4, 6, action, Actionscript, Actionscript3, Adobe, Adobe Air, Adobe Flex, Air, api, app, AR, Artigo, as3, AUG, auto, back, bar, BI, Bindable, blog, browser, case, class, classe, classes, código, collection, Componente, Componentes, control, Controls, DataProvider, efeito, Estilo, exemplo, filter, Flex, Flex 3, Flexmania, for, framework, function, Google, Gráfico, html, ide, IE, if, image, int, Java, Java Magazine, Javascript, label, layout, live, MEF, mg, MXML, Number, O, on, Oracle, padrão, pt, Ria’s Geral, string, Stroke, Swiz Framework, TAT, try, UI, uint, Ved, web, XML, XMLList, XP @ 11 3rd, 2010 | via http://blog.erkobridee.com | Sem comentários
Erko Bridee
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »



Algo legal no Flex é que eles nos disponibiliza gráficos, porém, sinceramente o estilo padrão dos gráficos com cores sólidas não me agrada muito, ao meu ver cansa os olhos, então resolvi mudar as cores solidas para um padrão em degrade, para suavizar as cores…

 

Obs.: tendo em mente que os componentes dos gráficos ainda são os mesmos no Flex 3 e 4 os códigos mxml a seguir serão do Flex 3.

 

Começando pelo gráfico de barras, para ter o seguinte resultado precisei:

column-chart

Código MXML:

?View Code ACTIONSCRIPT3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
        layout="vertical"
        verticalAlign="middle"
        backgroundColor="white">
 
    <mx:Script>
        <![CDATA[
        	import code.StyleColumnChart;
 
            import mx.charts.chartClasses.IAxis;
 
            private function linearAxis_labelFunc(item:Object, prevValue:Object, axis:IAxis):String {
                return currencyFormatter.format(item);
            }
 
            private function categoryAxis_labelFunc(item:Object, prevValue:Object, axis:CategoryAxis, categoryItem:Object):String {
                var datNum:Number = Date.parse(item);
                var tempDate:Date = new Date(datNum);
                return dateFormatter.format(tempDate).toUpperCase();
            }
        ]]>
    </mx:Script>
 
    <mx:DateFormatter id="dateFormatter" formatString="DD" />
    <mx:CurrencyFormatter id="currencyFormatter" precision="2" />
 
    <mx:XMLListCollection id="dp">
        <mx:source>
            <mx:XMLList>
                <quote date="8/1/2007" open="40.29" close="39.58" />
                <quote date="8/2/2007" open="39.4" close="39.52" />
                <quote date="8/3/2007" open="39.47" close="38.75" />
                <quote date="8/6/2007" open="38.71" close="39.38" />
                <quote date="8/7/2007" open="39.08" close="39.42" />
                <quote date="8/8/2007" open="39.61" close="40.23" />
                <quote date="8/9/2007" open="39.9" close="40.75" />
                <quote date="8/10/2007" open="41.3" close="41.06" />
                <quote date="8/13/2007" open="41" close="40.83" />
                <quote date="8/14/2007" open="41.01" close="40.41" />
                <quote date="8/15/2007" open="40.22" close="40.18" />
                <quote date="8/16/2007" open="39.83" close="39.96" />
                <quote date="8/17/2007" open="40.18" close="40.32" />
                <quote date="8/20/2007" open="40.55" close="40.74" />
                <quote date="8/21/2007" open="40.41" close="40.13" />
                <quote date="8/22/2007" open="40.4" close="40.77" />
                <quote date="8/23/2007" open="40.82" close="40.6" />
                <quote date="8/24/2007" open="40.5" close="40.41" />
                <quote date="8/27/2007" open="40.38" close="40.81" />
            </mx:XMLList>
        </mx:source>
    </mx:XMLListCollection>
 
    <mx:ColumnChart id="columnChart"
            showDataTips="true"
            dataProvider="{dp}"
            width="100%"
            height="100%">
 
        <!-- vertical axis -->
        <mx:verticalAxis>
            <mx:LinearAxis baseAtZero="false"
                    labelFunction="linearAxis_labelFunc" />
        </mx:verticalAxis>
 
        <!-- horizontal axis -->
        <mx:horizontalAxis>
            <mx:CategoryAxis id="ca"
                    categoryField="@date"
                    title="August 2007"
                    labelFunction="categoryAxis_labelFunc" />
        </mx:horizontalAxis>
 
        <!-- horizontal axis renderer -->
        <mx:horizontalAxisRenderers>
            <mx:AxisRenderer axis="{ca}"
                    canDropLabels="true" />
        </mx:horizontalAxisRenderers>
 
        <!-- series -->
        <mx:series>
            <mx:ColumnSeries
            		displayName="Open"
                    xField="@date"
                    yField="@open"
                    fill="{StyleColumnChart.orangeLinearGradient}"
                    stroke="{StyleColumnChart.orangeStroke}">
            </mx:ColumnSeries>
            <mx:ColumnSeries
            		displayName="Close"
                    xField="@date"
                    yField="@close"
                    fill="{StyleColumnChart.blueLinearGradient}"
                    stroke="{StyleColumnChart.blueStroke}">
            </mx:ColumnSeries>
        </mx:series>
 
        <!-- series filters -->
        <mx:seriesFilters>
            <mx:Array />
        </mx:seriesFilters>
    </mx:ColumnChart>
</mx:Application>

Obs.: esse código acima reaproveitei do respectivo post do blog.flexexamples.com

Código da classe AS3 para gerar o efeito visual:

?View Code ACTIONSCRIPT3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package code
{
	import mx.graphics.GradientEntry;
	import mx.graphics.LinearGradient;
	import mx.graphics.Stroke;
 
	[Bindable]
	public class StyleColumnChart
	{
		public function StyleColumnChart() {}
 
		//----------------------------------------------------------------------
		// @BEGIN: LinearGradient color
 
		public static function linearGradientColor(colorDark:uint, colorLight:uint):LinearGradient {
			var linearGradient:LinearGradient = new LinearGradient();
			var arr:Array = [];
			arr.push(new GradientEntry(colorDark, 0.0, 0.8));
			arr.push(new GradientEntry(colorLight, 1.0, 0.6));
			linearGradient.entries = arr;
			return linearGradient;
		}
 
		public static function get redLinearGradient():LinearGradient {
			return linearGradientColor(0x990000,0xEE0000);
		}
 
		public static function get greenLinearGradient():LinearGradient {
			return linearGradientColor(0x008B00,0x00FF00);
		}
 
		public static function get blueLinearGradient():LinearGradient {
			return linearGradientColor(0x0066FF,0x00CCFF);
		}
 
		public static function get yellowLinearGradient():LinearGradient {
			return linearGradientColor(0xCAC333, 0xF5F30E);
		}
 
		public static function get orangeLinearGradient():LinearGradient {
			return linearGradientColor(0xFC9C00, 0xFCC048);
		}
 
		// @END: LinearGradient color
		//----------------------------------------------------------------------
		// @BEGIN: stroke color
 
		public static function strokeColor(color:uint):Stroke {
			return new Stroke(color,1);
		}
 
		public static function get redStroke():Stroke {
			return strokeColor(0x990000);
		}
 
		public static function get greenStroke():Stroke {
			return strokeColor(0x008B00);
		}
 
		public static function get blueStroke():Stroke {
			return strokeColor(0x0066FF);
		}
 
		public static function get yellowStroke():Stroke {
			return strokeColor(0xCAC333);
		}
 
		public static function get orangeStroke():Stroke {
			return strokeColor(0xFC9C00);
		}
 
		// @END: stroke color
		//----------------------------------------------------------------------
	}
}

A seguir segue um exemplo para gráfico de pizza:

pie-chart

Código MXML:

?View Code ACTIONSCRIPT3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
  <mx:Script>
    <![CDATA[
     import mx.collections.ArrayCollection;
 
     import code.StylePieChart;
 
     [Bindable]
     public var expenses:ArrayCollection = new ArrayCollection([
        {Data:"IN", Value:2000},
        {Data:"OUT", Value:1000}
     ]);
 
    ]]>
  </mx:Script>
 
  <mx:Panel title="Pie Chart">
 
     <mx:PieChart id="myChart"
        dataProvider="{expenses}"
        showDataTips="true">
        <mx:series>
           <mx:PieSeries
                field="Value"
                nameField="Data"
                labelPosition="callout"
                fills="{StylePieChart.inOutFills}"/>
        </mx:series>
     </mx:PieChart>
 
     <mx:Legend dataProvider="{myChart}"/>
 
  </mx:Panel>
 
</mx:Application>

Código da classe AS3 para gerar o efeito visual:

?View Code ACTIONSCRIPT3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package code
{
	import mx.graphics.GradientEntry;
	import mx.graphics.RadialGradient;
	import mx.graphics.SolidColor;
 
	[Bindable]
	public class StylePieChart
	{
		public function StylePieChart()	{}
 
		//----------------------------------------------------------------------
 
		public static function get inOutFills():Array {
			var gradients:Array = new Array();
 
			var fill:RadialGradient = null;
			var g1:GradientEntry = null;
			var g2:GradientEntry = null;
 
			fill = new RadialGradient();
			g1 = new GradientEntry(0xCC3640);
			g2 = new GradientEntry(0x990000);
			fill.entries = [g1,g2];
			gradients.splice(-1,0,fill);
 
			fill = new RadialGradient();
			g1 = new GradientEntry(0x30BB32);
			g2 = new GradientEntry(0x009900);
			fill.entries = [g1,g2];
			gradients.splice(-1,0,fill);
 
			return gradients;
		}
 
		//----------------------------------------------------------------------
	}
}

Para achar as cores utilizei os itens descritos neste post: [Adobe AIR] Color Browser


Veja também:

  • [Flex & AIR] Swiz Framework – meus primeiros passos
  • Java Magazine 68 : Artigo sobre Adobe Flex e AIR
  • s:TextArea – recuperando um texto selecionado
  • [Flex & AIR] Swiz Framework + Presentation Model : Exemplo de Projeto
  • FlexMania 2010 – Adobe Flex + Oracle WebLogic 10.x
Ago 25

Capturando uma imagem na WebCam e salvando no servidor

Escrito por Daniel Schmitz em 1, 2009, 4, 6, Adobe, AMF, amfphp, apache, app, AR, arte, Artigo, BI, botão, bug, class, classe, código, código fonte, Componente, control, Controls, DataProvider, demo, err, erro, error, event, events, Exemplos, firefox, flash, Flex, fonte, for, Formação, function, Gravação, ide, IE, if, image, imagens, int, itemRenderer, label, layout, library, lista, Messaging, mg, MXML, O, on, padrão, PHP, pt, Remoting, RIA, Ria’s Geral, RoR, server, servidor, spark, string, Teste, UI, uint, web, WebCam, XML @ 08 25th, 2010 | via http://flex.etc.br | 1 comentário
Daniel Schmitz
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Seguindo o artigo anterior, iremos agora utilizar o Flex em conjunto com o PHP para salvar as imagens no servidor. A conexão entre o Flex e o PHP será realizada pelo AMFPHP.

Este artigo teve uma grande ajuda do Bruno Santana, que nos mandou o código sobre a gravação do arquivo pela webcam.

Pré requisitos

  • Wamp Server instalado
  • Biblioteca AMFPHP – http://www.amfphp.org/ 

 

Passos iniciais

  • Cria a pasta c:wampwwwFlexFoto
  • Crie o projeto FlexFoto. Atenção na parte de definição do Output Folder:

image 

e

image

  • Copie a pasta amfphp do zip para c:wampwwwFlexFoto
  • O esquema de pastas fica como na figura a seguir:

image

Agora vamos configurar o services-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<services-config>
    <services>
        <service id="amf-service"
            class="flex.messaging.services.RemotingService"
            messageTypes="flex.messaging.messages.RemotingMessage">
            <destination id="amf">
                <channels>
                    <channel ref="amf-endpoint"/>
                </channels>
                <properties>
                    <source>*</source>
                </properties>
            </destination>
        </service>
    </services>
    <channels>
        <channel-definition id="amf-endpoint"
            class="mx.messaging.channels.AMFChannel">
            <endpoint uri="amfphp/gateway.php"
                class="flex.messaging.endpoints.AMFEndpoint"/>
        </channel-definition>
    </channels>
</services-config>

E configuramos o services-config.xml nas propriedades do projeto Flex:

image

Agora vamos fazer um teste de conexão. Crie a seguinte classe: HelloWorld.php em www/FlexFoto/amfphp/services

<?php
class HelloWorld
{
  function Say()
  {
    return "Hello World from amfphp";
  }
}

E no Flex, adicione o seguinte código:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
		   xmlns:s="library://ns.adobe.com/flex/spark"
		   xmlns:mx="library://ns.adobe.com/flex/mx"
		   minWidth="955" minHeight="600">

<fx:Declarations>
	<s:RemoteObject id="HelloWorld"
	                   destination="amf" source="HelloWorld">
		<s:method name="Say" result="OnSayResult(event)"/>
	</s:RemoteObject>
</fx:Declarations>

<fx:Script>
	<![CDATA[
		import mx.controls.Alert;
		import mx.rpc.events.ResultEvent;

		protected function OnSayResult(e:ResultEvent):void
		{
			mx.controls.Alert.show(e.result.toString());
		}
	]]>
</fx:Script>

<s:Button label="Hello World">
	<s:click>
		<![CDATA[
		HelloWorld.Say();
		]]>
	</s:click>
</s:Button>

</s:Application>

Teste a aplicação. Veja inicialmente se a aplicação abre com o endereço "localhost" e não "c:….". Clique no botão e verifique se a mensagem "Hello World from AMFPHP" surgir. Se for algum erro, você precisa investigar o erro através da mensagem de erro padrão do log de erros do wamp (c:wamplogsapache_error.php). Se não achou nada, use o Firefox+Firebug+Flashbug ou então use o Charles Proxy(http://www.charlesproxy.com/)

Configurando a WebCam

Esta parte é tranquila, já que vimos isso no artigo anterior. Apague o “hello world” do teste de conexão e faça:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
			   xmlns:s="library://ns.adobe.com/flex/spark"
			   xmlns:mx="library://ns.adobe.com/flex/mx"
			   minWidth="955" minHeight="600">

	<fx:Declarations>
		<s:RemoteObject id="Foto"
		               destination="amf" source="Foto">

		</s:RemoteObject>
	</fx:Declarations>

	<mx:VideoDisplay id="webcam"
				 	 width="160" height="120"
					 top="100"
					 left="100"
					 >
		<mx:creationComplete>
			<![CDATA[
				webcam.attachCamera(Camera.getCamera());
			]]>
		</mx:creationComplete>

	</mx:VideoDisplay>

	<s:Button label="Salvar!!" top="50" left="150">

	</s:Button>

</s:Application>

Salvando a imagem no servidor

Até aqui apenas exibimos a câmera e o botão salvar. Vamos agora dar a funcionalidade necessária para enviar a imagem da WebCam para o servidor. Crie o arquivo Foto.php na pasta services, com o seguinte conteúdo:

<?php
class Foto
{
 function __construct()
 {

 }

 function Save($fotoAsString)
 {
	//obtém um id unico para o arquivo
	$nomeArquivo = uniqid();

	//configura o nome do arquivo
	$nomeImagem = "imagem/{$nomeArquivo}.jpg";

	//abre o arquivo. A opção w vai criá-lo, caso nao exista
	$arquivo = fopen($nomeImagem, 'w');

	//escreve no arquivo
	fwrite($arquivo, base64_decode($fotoAsString));

	return "ok";

 }
}

Aqui, criamos no método Save uma rotina para salvar a imagem no disco. Isso é feito graças a transformação da foto em string e na sua volta, pelo método base64_decode.

Exibindo as imagens gravadas no Flex

Assim que a foto é gravada, a reqisição feita pelo Flex volta, com um "ok". Então podemos usar outra rotina para ler todas as imagens e apresentá-las no flex:

<s:List
	id="exibirImagens"
	top="10"
	left="150"
	right="10"
	bottom="10"
	width="530"
	height="400"
	>
	<s:layout>
		<s:TileLayout
			requestedColumnCount="5"
			requestedRowCount="8"
			horizontalGap="2"
			verticalGap="2"/>
	</s:layout>
	<s:itemRenderer>
		<fx:Component>
			<mx:Image source="{data}" />
		</fx:Component>
	</s:itemRenderer>
</s:List>

No código acima, criamos uma lista do tipo tile, cujo o itemrenderer é um componente do tipo image.

Para preencher esta lista, usamos o seguinte código:

protected function OnGetAll(event:ResultEvent):void
{
	exibirImagens.dataProvider = new ArrayList((event.result as Array));
}

Ou seja, sempre que chamamos o método GetAll, o php se encarrega de obter uma lista de imagens e retorná-la para o Flex. Com esta lista preenchemos o dataProvider da lista de imagens que possui o itemRenderer.

Para finalizar, o codigo php do método GetAll():

function GetAll()
{
	//http://snipplr.com/view/742/read-images-of-directory/
	$folder = opendir("imagem");
	$pic_types = array("jpg");
	$index = array();

	while ($file = readdir ($folder)) {
		if(in_array(substr(strtolower($file), strrpos($file,".") + 1),$pic_types))
		{
			array_push($index,"amfphp/services/imagem/$file");
		}
	}
	closedir($folder);	

	return $index;
}

O código php lê o diretório e retorna uma array com o caminho completo da imagem.

O resultado final é visto na tela abaixo:

image

Código fonte

Ago 13

Agrupando dados com AdvancedDataGrid + dica importante

Escrito por Daniel Schmitz em 1, 4, 6, Adobe, Air, app, AR, arte, Artigo, Banco de Dados, bar, BI, Bindable, código, collection, control, dados, DataGrid, DataProvider, demo, Dica, DRE, err, exemplo, Exemplos, Flex, for, gc, ide, IE, if, image, Java, layout, Mate, mg, MXML, O, on, PHP, pt, refresh, RIA, Ria’s Geral, servidor, tag, UI, usabilidade, XML, Zend Framework @ 08 13th, 2010 | via http://flex.etc.br | Sem comentários
Daniel Schmitz
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Este artigo surgiu da dúvida do leitor Henrique Felipe, que desejava usar o AdvancedDataGrid para agrupar dados entre o relacionamento Pessoas e Telefones.

Para facilitar, vou abstrair a parte da conexão com o PHP e do banco de dados, e vamos supor que ele retorne um array de dados conforme o código a seguir:

<fx:Script>
<![CDATA[

protected var dados:Object;

]]>
</fx:Script>

<s:creationComplete>
<![CDATA[
this.dados = Object([{nome:'fulano1',
	  telefones:[{numero:'001'},{numero:'002'},{numero:'003'}]},

	{nome:'fulano2',
	  telefones:[{numero:'004'},{numero:'005'},{numero:'006'}]},

	{nome:'fulano3',
	  telefones:[{numero:'007'},{numero:'008'},{numero:'009'}]}]);
]]>
</s:creationComplete>

Agora que criamos um Array de dados, podemos criar o AdvancedDataGrid e agrupá-lo por nome, veja:

<mx:AdvancedDataGrid x="38" y="37" id="adg1">
	<mx:dataProvider>
		<mx:HierarchicalData source="{dados}"
			childrenField="telefones"/>
	</mx:dataProvider>
	<mx:columns>
		<mx:AdvancedDataGridColumn
			headerText="Nome"
			dataField="nome"/>

		<mx:AdvancedDataGridColumn
			headerText="Telefone"
			dataField="numero"/>
	</mx:columns>
</mx:AdvancedDataGrid>

E o resultado é exibido na imagem a seguir:

01

Ok, até ai tudo bem. Agora vem a grande dica! O AdvancedDataGrid possui uma particularidade em sua forma de agrupar dados que está relacionado em como os dados estão organizados. No exemplo anterior, tinhamos um Array de pessoas e a propriedade telefones era um outro array, de telefones. Ou seja, os dados já estavam agrupados e por isso não existe a necessidade de agrupá-los novamente. Por isso não criamos o mx:Grouping conforme é visto na maioria dos exemplos. Ao invés do grouping, usamos mx:HierarchicalData  para representar os dados, pois eles já estão agrupados. É necessário apenas informar qual será a propriedade que conterá o grupo, no nosso caso telefones.

Quando os dados não estão agrupados, então temos que usar o grouping, conforme o exemplo a seguir (retirado da adobe):

<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">

<mx:Script>
<![CDATA[
	import mx.collections.ArrayCollection;

	[Bindable]
private var dpFlat:ArrayCollection = new ArrayCollection([
{Region:"Southwest", Territory:"Arizona",
	Territory_Rep:"Barbara Jennings", Actual:38865, Estimate:40000},
{Region:"Southwest", Territory:"Arizona",
	Territory_Rep:"Dana Binn", Actual:29885, Estimate:30000},
{Region:"Southwest", Territory:"Central California",
	Territory_Rep:"Joe Smith", Actual:29134, Estimate:30000},
{Region:"Southwest", Territory:"Nevada",
	Territory_Rep:"Bethany Pittman", Actual:52888, Estimate:45000},
{Region:"Southwest", Territory:"Northern California",
	Territory_Rep:"Lauren Ipsum", Actual:38805, Estimate:40000},
{Region:"Southwest", Territory:"Northern California",
	Territory_Rep:"T.R. Smith", Actual:55498, Estimate:40000},
{Region:"Southwest", Territory:"Southern California",
	Territory_Rep:"Alice Treu", Actual:44985, Estimate:45000},
{Region:"Southwest", Territory:"Southern California",
	Territory_Rep:"Jane Grove", Actual:44913, Estimate:45000}
	]);
]]>
</mx:Script>

<mx:Panel title="AdvancedDataGrid Control Example"
	  height="75%" width="75%" layout="horizontal"
	  paddingTop="10" paddingBottom="10"
          paddingLeft="10" paddingRight="10">

<mx:AdvancedDataGrid id="myADG"
					 width="100%" height="100%"
					 initialize="gc.refresh();">
	<mx:dataProvider>
		<mx:GroupingCollection id="gc" source="{dpFlat}">
	 	 <mx:grouping>
		 	<mx:Grouping>
		 	  <mx:GroupingField name="Region"/>
			  <mx:GroupingField name="Territory"/>
			</mx:Grouping>
		  </mx:grouping>
		</mx:GroupingCollection>
	</mx:dataProvider>        

	<mx:columns>
	 <mx:AdvancedDataGridColumn dataField="Region"/>
	 <mx:AdvancedDataGridColumn dataField="Territory"/>
	 <mx:AdvancedDataGridColumn dataField="Territory_Rep"
					   headerText="Territory Rep"/>
	 <mx:AdvancedDataGridColumn dataField="Actual"/>
	 <mx:AdvancedDataGridColumn dataField="Estimate"/>
	</mx:columns>
</mx:AdvancedDataGrid>
</mx:Panel>

</mx:Application>

Neste exemplo, os dados não estão agrupos, e por isso usamos:

<mx:dataProvider>
		<mx:GroupingCollection id="gc" source="{dpFlat}">
	 	 <mx:grouping>
		 	<mx:Grouping>
		 	  <mx:GroupingField name="Region"/>
			  <mx:GroupingField name="Territory"/>
			</mx:Grouping>
		  </mx:grouping>
		</mx:GroupingCollection>
	</mx:dataProvider>

Então fica a dica: antes de preencher os dados do AdovancedDataGrid, veja qual será a forma ideal de preenchimento de dados, para
agrupar corretamente os mesmos.

E qual a melhor forma? Trazer os dados agrupados ou deixar o AdvancedDataGrid agrupá-los? Depende! Ao trazer os dados agrupados,
você ganha em performance, principalmente se forem muitos dados. Ao agrupar os dados dinamicamente, você ganha em usabilidade, pois pode
reagrupar os dados de formas diferentes, sem a necessidade de refazer uma conexão no servidor.

Jul 23

Usando banco de dados local com Adobe AIR

Escrito por Leonardo França em 1, 2.0, 2009, 4, 6, abas, action, Actionscript, Actionscript 3.0, Actionscript3, Adobe, Adobe Air, Air, AIR 2.0, api, app, AR, auto, back, Banco de Dados, bar, BI, catch, class, classe, dados, DataGrid, DataProvider, DRE, email, err, erro, error, event, EventListener, events, exemplo, filter, flash, Flex, for, function, Google, html, ide, IE, if, image, int, Java, Javascript, label, library, lite, live, mg, MXML, mysql, O, on, override, PHP, pt, quick, RIA, Ria’s Geral, RoR, server, spark, SQL Server, SQLite, state, string, tag, TAT, Tema, TextInput, try, UI, utils, Ved, window, XML @ 07 23rd, 2010 | via http://www.leonardofranca.com.br | Sem comentários
Leonardo França
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »



Muitas vezes necessitamos que nosso sistema possa armazenar dados localmente, sem a necessidade de um banco de dados robusto como um MySQL ou um SQL Server, ou mesmo que os dados possam ser armazenados localmente para uma posterior sincronização com um banco de dados remoto. O Adobe AIR oferece a possibilidade de se trabalhar com banco de dados localmente, seu banco é baseado no banco de dados SQLite, o mais usado para esse tipo de necessidade por ser bem rapido e fácil de se trabalhar. Foi adicionado suporte a transação no Adobe AIR 2.0.
Vamos a um exemplo simples, comecemos com a classe SQLConnection, ela sera responsável pela conexão com nosso banco local, por ela também é que definimos se o banco de dados será usado apenas em memoria ou se será criado um arquivo local(extensão .db).

PLAIN TEXT
ACTIONSCRIPT3:

  1. conn = new SQLConnection();
  2. try
  3.             {
  4.                 conn.open(dbFile);//conn.open(null) passe null para o banco ser criado somente em memoria
  5.             }
  6.             catch(err:Error)
  7.             {
  8.                 trace(ObjectUtil.toString(err));
  9.                 return;
  10.             }

Nesse caso, estou criando um arquivo local para o banco de dados. dbFile é uma instancia da classe File:

PLAIN TEXT
ACTIONSCRIPT3:

  1. dbFile = File.applicationStorageDirectory.resolvePath("dbFile.db");

Tendo nosso banco criado, agora criaremos nossa tabela para armazenagem dos dados. Usaremos a classe SQLStatement.

PLAIN TEXT
ACTIONSCRIPT3:

  1. createStmt = new SQLStatement();
  2.             createStmt.sqlConnection = conn;

Passaremos a SQL por String para criar a tabela para em seguida ser executada pelo AIR:

PLAIN TEXT
ACTIONSCRIPT3:

  1. var sql:String = "";
  2.             sql += "CREATE TABLE IF NOT EXISTS contato (";
  3.             sql += "    id  INTEGER PRIMARY KEY AUTOINCREMENT,";
  4.             sql += "    nome    TEXT,";
  5.             sql += "    email   TEXT";
  6.             sql += ")";
  7. createStmt.text = sql;
  8. try
  9.             {
  10.                 createStmt.execute();
  11.             }
  12.             catch(error:SQLError)
  13.             {
  14.                 trace("CREATE TABLE error:", error);
  15.                 trace("error.message:", error.message);
  16.                 trace("error.details:", error.details);
  17.                 return void;
  18.             }

Temos nosso banco e tabelas criadas, vamos criar um formulario para inserir alguns dados no banco:

PLAIN TEXT
ACTIONSCRIPT3:

  1. insertStmt = new SQLStatement();
  2.             insertStmt.sqlConnection = conn;
  3.             var sql:String = "";
  4.             sql += "INSERT INTO contatos (nome, email) ";
  5.             sql += "VALUES (‘"+txtNome.text+"’, ‘"+txtEmail.text+"’)";
  6.             insertStmt.text = sql;
  7.            
  8.             try
  9.             {
  10.                 insertStmt.execute();
  11.             }
  12.             catch (error:SQLError)
  13.             {
  14.                 trace("INSERT error:", error);
  15.                 trace("error.message:", error.message);
  16.                 trace("error.details:", error.details);
  17.                 return void;
  18.             }

Agora basta criar o método para executará o select

PLAIN TEXT
ACTIONSCRIPT3:

  1. selectStmt = new SQLStatement();
  2.             selectStmt.sqlConnection = conn;
  3.             var sql:String = "SELECT id, nome, email FROM contatos";
  4.             selectStmt.text = sql;
  5.            
  6.             try
  7.             {
  8.                 selectStmt.execute();
  9.             }
  10.             catch (error:SQLError)
  11.             {
  12.                 trace("SELECT error:", error);
  13.                 trace("error.message:", error.message);
  14.                 trace("error.details:", error.details);
  15.                 return;
  16.             }
  17.            
  18.             var result:SQLResult = selectStmt.getResult();
  19.             dg.dataProvider = result.data;

Segue o codigo completo:

PLAIN TEXT
MXML:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
  3.                        xmlns:s="library://ns.adobe.com/flex/spark"
  4.                        xmlns:mx="library://ns.adobe.com/flex/mx">
  5.     <fx:Script>
  6.         <![CDATA[
  7.             import flash.data.SQLConnection;
  8.             import flash.data.SQLResult;
  9.             import flash.data.SQLStatement;
  10.             import flash.errors.SQLError;
  11.             import flash.events.MouseEvent;
  12.             import flash.filesystem.File;
  13.            
  14.             import mx.utils.ObjectUtil;
  15.            
  16.             private var conn:SQLConnection;
  17.             private var dbFile:File;
  18.             private var createStmt:SQLStatement;
  19.             private var createStatusStmt:SQLStatement;
  20.             private var insertStmt:SQLStatement;
  21.             private var selectStmt:SQLStatement;
  22.            
  23.             override protected function childrenCreated():void
  24.             {
  25.                 super.childrenCreated();
  26.                
  27.                 dbFile = File.applicationStorageDirectory.resolvePath("dbContatos.db");
  28.                 conn = new SQLConnection();
  29.                
  30.                 try
  31.                 {
  32.                     conn.open(dbFile);
  33.                 }
  34.                 catch(err:Error)
  35.                 {
  36.                     trace(ObjectUtil.toString(err));
  37.                     return;
  38.                 }
  39.                
  40.                 createTable();
  41.                
  42.                 btnInsert.addEventListener(MouseEvent.CLICK,addData);
  43.             }
  44.            
  45.             private function createTable():void
  46.             {
  47.                 createStmt = new SQLStatement();
  48.                 createStmt.sqlConnection = conn;
  49.                
  50.                 var sql:String = "";
  51.                 sql += "CREATE TABLE IF NOT EXISTS contatos (";
  52.                 sql += "    id  INTEGER PRIMARY KEY AUTOINCREMENT,";
  53.                 sql += "    nome    TEXT,";
  54.                 sql += "    email   TEXT";
  55.                 sql += ")";
  56.                 createStmt.text = sql;
  57.                
  58.                 try
  59.                 {
  60.                     createStmt.execute();
  61.                 }
  62.                 catch(error:SQLError)
  63.                 {
  64.                     trace("CREATE TABLE error:", error);
  65.                     trace("error.message:", error.message);
  66.                     trace("error.details:", error.details);
  67.                     return void;
  68.                 }
  69.                
  70.                 getData();
  71.             }
  72.            
  73.             private function addData(evt:MouseEvent=null):void
  74.             {
  75.                 insertStmt = new SQLStatement();
  76.                 insertStmt.sqlConnection = conn;
  77.                 var sql:String = "";
  78.                 sql += "INSERT INTO contatos (nome, email) ";
  79.                 sql += "VALUES (‘"+txtNome.text+"’, ‘"+txtEmail.text+"’)";
  80.                 insertStmt.text = sql;
  81.                
  82.                 try
  83.                 {
  84.                     insertStmt.execute();
  85.                 }
  86.                 catch (error:SQLError)
  87.                 {
  88.                     trace("INSERT error:", error);
  89.                     trace("error.message:", error.message);
  90.                     trace("error.details:", error.details);
  91.                     return void;
  92.                 }
  93.                 getData();
  94.             }
  95.            
  96.             private function getData():void
  97.             {
  98.                 selectStmt = new SQLStatement();
  99.                 selectStmt.sqlConnection = conn;
  100.                 var sql:String = "SELECT id, nome, email FROM contatos";
  101.                 selectStmt.text = sql;
  102.                
  103.                 try
  104.                 {
  105.                     selectStmt.execute();
  106.                 }
  107.                 catch (error:SQLError)
  108.                 {
  109.                     trace("SELECT error:", error);
  110.                     trace("error.message:", error.message);
  111.                     trace("error.details:", error.details);
  112.                     return;
  113.                 }
  114.                
  115.                 var result:SQLResult = selectStmt.getResult();
  116.                 dg.dataProvider = result.data;
  117.             }
  118.  
  119.         ]]>
  120.     </fx:Script>
  121.     <fx:Declarations>
  122.         <!– Place non-visual elements (e.g., services, value objects) here –>
  123.     </fx:Declarations>
  124.     <s:Group width="100%" height="100%">
  125.         <mx:ViewStack x="0" y="68" id="viewstack1" width="100%" height="198" creationPolicy="all">
  126.             <s:NavigatorContent label="Registros" width="100%" height="100%">
  127.                 <mx:DataGrid id="dg" x="18" y="30" width="100%" height="100%">
  128.                     <mx:columns>
  129.                         <mx:DataGridColumn headerText="ID" width="25" dataField="id"/>
  130.                         <mx:DataGridColumn headerText="Nome" width="200" dataField="nome"/>
  131.                         <mx:DataGridColumn headerText="Email" width="200" dataField="email"/>
  132.                     </mx:columns>
  133.                 </mx:DataGrid>
  134.             </s:NavigatorContent>
  135.             <s:NavigatorContent label="Inserir Registro" width="100%" height="100%">
  136.                 <s:Label x="10" y="10" text="Inserir Registro"/>
  137.                 <mx:Form x="10" y="34" width="100%" height="100%">
  138.                     <mx:FormItem label="Nome:">
  139.                         <s:TextInput id="txtNome"/>
  140.                     </mx:FormItem>
  141.                     <mx:FormItem label="Email:">
  142.                         <s:TextInput id="txtEmail"/>
  143.                     </mx:FormItem>
  144.                     <mx:FormItem>
  145.                         <s:Button id="btnInsert" label="Inserir"/>
  146.                     </mx:FormItem>
  147.                 </mx:Form>
  148.             </s:NavigatorContent>
  149.         </mx:ViewStack>
  150.         <mx:LinkBar x="0" y="35" dataProvider="{viewstack1}">
  151.         </mx:LinkBar>
  152.     </s:Group>
  153. </s:WindowedApplication>

Mais:
more:
Quick Start: Working asynchronously with a local SQL database (Flex)
Quick Start: Working asynchronously with a local SQL database (Flash)
Quick Start: Working asynchronously with a local SQL database (HTML)
Quick Start: Working synchronously with a local SQL database (Flex)
Quick Start: Working synchronously with a local SQL database (Flash)
Quick Start: Working synchronously with a local SQL database (HTML)

Jun 30

Modelo Generico Flex

Escrito por Felipe Borella em 1, 6, Adobe, app, AR, bar, BI, Bindable, boolean, class, código, collection, control, DataProvider, exemplo, Flex, for, Formação, function, ide, IE, int, label, layout, lista, MXML, novidade, Novidades, O, on, pt, RIA, Ria’s Geral, string, TAT, TextInput, UI, window, XML @ 06 30th, 2010 | via http://www.fborella.com.br/blog/ | Sem comentários
Felipe Borella
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Bom Dia!

Agora que acabou o semestre da faculdade ( rumo a formação agora ultimo graças a Deus, mas novidades virão, porque não outra faculdade, sim eu tenho força de vontade e vou atras dos meus objetivos ). Resolvi criar um exemplo de Model que sempre utilizo nas minhas telas… vou postar o código e você ai que copiar fique a vontade para utilizar sua mente e poder fazer a sua necessiodade

Model:

package br.com.fborella.generic
{
	import mx.collections.ArrayCollection;
	import mx.containers.TitleWindow;
	import mx.managers.PopUpManager;
?
	[Bindable]
	public class Model
	{
		public function Model():void
		{
?
		}
		public var lista:ArrayCollection=new ArrayCollection();
		public var editando:Boolean;
		public var filtro:String;
		public var opcoesOrdem:ArrayCollection=new ArrayCollection();
		public var ordemSelecionada:int;
		public var tituloTela:String;
		public var msg:String;
	}
}

Ordem:

package br.com.fborella.generic
{
	[Bindable]
	public class Ordem
	{
		public var atributo:String;
		public var rotulo:String;
?
		public function Ordem(atrib:String, rotul:String)
		{
			this.atributo=atrib;
			this.rotulo=rotul;
		}
	}
}

Funcionamento na view:

xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="350"
	height="250" creationComplete="init()" title="{model.tituloTela}">
	<mx:Script>
		[CDATA[
			import br.com.fborella.generic.Ordem;
			import br.com.fborella.generic.Model;
?
			[Bindable]
			private var model:Model;
			private function init():void
			{
				model=new Model;
				model.tituloTela="Exemplo de Modelo";
				model.opcoesOrdem.addItem(new Ordem('id', 'Código'));
				model.opcoesOrdem.addItem(new Ordem('nome', 'Nome'));
				model.ordemSelecionada=1;
				model.editando=false;
			}
?
			private function incluir():void
			{
				model.editando=true;
				focusManager.setFocus(txtNome);
			}
?
			private function cancelar():void
			{
				model.editando=false;
			}
		]]>
	mx:Script>
	<mx:Form width="100%" height="100%">
		<mx:FormItem label="Id">
			<mx:TextInput id="txtId" width="50" editable="false" enabled="false"/>
		mx:FormItem>
		<mx:FormItem label="Nome" required="true">
			<mx:TextInput id="txtNome" enabled="{model.editando}" width="250"/>
		mx:FormItem>
		<mx:FormItem label="Data" required="true">
			<mx:DateField id="txtData" enabled="{model.editando}" width="120"/>
		mx:FormItem>
		<mx:Spacer height="100%"/>
		<mx:ApplicationControlBar width="100%">
			<mx:Button label="Incluir" width="80" click="incluir()"/>
			<mx:Button label="Cancelar" width="80" click="cancelar()"/>
			<mx:ComboBox dataProvider="{model.opcoesOrdem}" labelField="rotulo"/>
		mx:ApplicationControlBar>
	mx:Form>
mx:TitleWindow>

Qualuqer duvida entre em contato…

Felipe

Jun 22

CRUD com Flex e ZendAMF – Parte 3

Escrito por Daniel Schmitz em 1, 4, 6, AMF, AR, arte, BI, botão, class, código, comunicação, control, Controls, CRUD, dados, DataGrid, DataProvider, email, event, events, Flex, Flex 4, for, Formulário, function, ide, IE, int, label, O, on, PHP, Projetos, pt, RIA, Ria’s Geral, string, tag, Teste, Tutorial, UI, uint, zend, zendAMF @ 06 22nd, 2010 | via http://flex.etc.br | Sem comentários
Daniel Schmitz
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Nesta 3a parte do tutorial iremos exibir os dados que estão sendo gravados no formulário para inserir pessoas.

Outras partes do tutorial:

  • Parte 1 – Preparando o ambiente, criando os projetos Flex e PHP, testando a conexão
  • Parte 2 – Inserindo dados com ZendAmf e Flex

 

Agora vamos exibir os dados que foram adicionados na parte 2. Precisamos criar um dataGrid com as colunas nome e email, e fazer a comunicação com o PHP para obter os dados. O Datagrid é feito através do seguinte código:

<mx:DataGrid id="dg" width="400" height="200" top="50" left="10">
 <mx:columns>
	<mx:DataGridColumn dataField="id" visible="false"/>
	<mx:DataGridColumn dataField="nome" headerText="Nome"/>
	<mx:DataGridColumn dataField="email" headerText="Email"/>
 </mx:columns>
 <mx:creationComplete>
	<![CDATA[
	GetAll();
	]]>
 </mx:creationComplete>
</mx:DataGrid>

Veja que chamamos o método GetAll no CreationComplete do DataGrid. Este método está descrito a seguir:

<fx:Declarations>
 <mx:RemoteObject id="RemotePessoas"
				 destination="zend"
				 source="Pessoas">

	<mx:method name="TesteConexao"
			   result="OnTestConexaoOk(event)"/>

	<mx:method name="GetAll"
			   result="OnGetAll(event)"/>

 </mx:RemoteObject>
</fx:Declarations>

<fx:Script>
<![CDATA[
	import forms.PessoaForm;

	import mx.controls.Alert;
	import mx.managers.PopUpManager;
	import mx.rpc.events.ResultEvent;

	public function OnTestConexaoOk(event:ResultEvent):void
	{
		Alert.show(event.result.toString());
	}

	public function GetAll():void
	{
		RemotePessoas.GetAll();
	}

	protected function OnGetAll(event:ResultEvent):void
	{
		dg.dataProvider = event.result;
	}

]]>
</fx:Script>

O método GetAll() irá chamar o método GetAll() do php, que está descrito a seguir:

<?php
include("base.php");

class Pessoas extends Base
{
	function __construct()
	{
		parent::__construct();
	}

	function TesteConexao()
	{
		return "OK";
	}

	function Inserir($nome,$email)
	{
		$data = array('nome'=>$nome,'email'=>$email);
		$this->db->insert('pessoas',$data);
		return $this->db->lastInsertId();
	}

	function GetAll()
	{
		return $this->db->fetchAll("select * from pessoas");
	}

}

O método GetAll() do PHP usa a instância de db para realizar um select, através do método fetchAll. O resultado de fetchAll é retornado pelo php e o método OnGetAll no flex é executado, onde setamos o dataprovider do DataGrid. Para finalizar, precisamos criar um botão que irá atualizar o dataGrid. Isso é facilmente feito pelo código a seguir:

<s:Button label="Atualizar" top="10" left="150">
 <s:click>
  <![CDATA[
  GetAll();
  ]]>
 </s:click>
</s:Button>

« Entradas anteriores | Entradas recentes »

ACERCA

O que é o RedeRIA ?

O redeRIA não é nada mais que um agregador de feed's que disponibiliza o conteudo de varios blogs e autores ao redor do mundo RIA, actualmente agregamos mais de 2791 entradas vindas de 53 blogs especializados em ria’s, pelo que só fica a ganhar em assinar o feed ou seguir a comunidade no twitter.

Se acha que o seu blog ou um blog de um amigo é interessante e util para os leitores o redeRIA, faça a sua submissão aqui.

Feed: assine já
Twitter: siga-nos

GOOGLE

Votação


Deveria o RedeRia agregar conteúdo em inglês?
Ver Resultados

AUTORES


Eduardo KrausAlexandre TadashiBindableCognitiva SoluçõesDaniel LopesDaniel SchmitzDanielPedrinhaDClick TeamEbercomEdgard DavidsonElvis FernandesErko BrideeFabiel PrestesFábio Batista da SilvaFabio da SilvaFabriccio BernardesFelipe BorellaFlavia MoreiraGabriel VersalliniGabriela T. PerryIgor MusardoJanderson CardosoJoão AugustoJose Carlos FielKelps SousaLeonardo FrançaLucas MarçalLuis MessiasLuiz TarabalMario JuniorMário SantosMauro MartinsPablo SouzaPedro ClaudioreneRia BrazilriaPTRicardo CerqueiraRobson FernandesRodrigo Pereira FragaSaintBrSamuelFacchinelloSergio SouzaSilva DeveloperStefan HorochovecTech CaffeTecinforThiago BuenoVedVinícius SandimWillian ManoXAML Cast

PUBLICIDADE








Powered by Wordpress & msdevstudio.com