<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1638565336393713256</id><updated>2012-01-28T19:47:12.648-04:30</updated><category term='boton'/><category term='ejemplo'/><category term='Image'/><category term='seguridad'/><category term='hosting'/><category term='adobe'/><category term='itemrenderer'/><category term='sessiones'/><category term='haccordion'/><category term='drag and drop'/><category term='Flash'/><category term='librerias'/><category term='panel'/><category term='css'/><category term='recursos'/><category term='animation'/><category term='video'/><category term='layout'/><category term='Jquery'/><category term='actionscript'/><category term='herencia'/><category term='displayobject'/><category term='flex builder'/><category term='arraycollection'/><category term='titlewindow'/><category term='patrones de diseño'/><category term='checkbox'/><category term='soap'/><category term='php'/><category term='desarrollo web'/><category term='Javascript'/><category term='example'/><category term='tutorial'/><category term='msql'/><category term='button'/><category term='flex'/><category term='contador'/><category term='listbase'/><category term='webservice'/><category term='rest'/><category term='seo'/><category term='posicionamiento en buscadores'/><category term='datagrid'/><category term='radioButton'/><category term='Cairngorm'/><category term='numericStepper'/><category term='instalacion'/><category term='componentes'/><category term='tiempo de carga de una web'/><category term='eventos'/><category term='httpservice'/><category term='itemEditor'/><category term='hola mundo'/><category term='metadata'/><category term='binding'/><title type='text'>Internet Developing</title><subtitle type='html'>Noticias, tecnologias, desarrollos, ejemplos y tutoriales sobre el desarrollo de herramientas para la web.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>56</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-1706282832997903522</id><published>2011-05-26T10:12:00.003-04:30</published><updated>2011-05-26T10:27:33.113-04:30</updated><title type='text'>Porque no he escrito mas en este blog - Parte I: Mi infancia</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/-fsmC2FEoGV4/Td5p-TWyWnI/AAAAAAAAAUc/JPoRICcXk6M/s1600/iniciativa%255B1%255D.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 316px;" src="http://4.bp.blogspot.com/-fsmC2FEoGV4/Td5p-TWyWnI/AAAAAAAAAUc/JPoRICcXk6M/s400/iniciativa%255B1%255D.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5611038704818870898" /&gt;&lt;/a&gt;&lt;br /&gt;Sé que he abandonado bastante este blog, y una de las razones es que hace 1 ano y medio decidí renunciar a mi trabajo como desarrollador en Cinet Solutions y emprender mi propio negocio.&lt;br /&gt;&lt;br /&gt;Han pasado muchas cosas, ha sido una experiencia increíble, llena de muchos aprendizajes y emociones y quiero compartir un poco con ustedes como es mi vida como emprendedor hoy en día para ver si los motivo un poco a hacer lo mismo.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Cuando te encanta la tecnología, y la vives dentro de tus venas en tu día a día, sucede un efecto muy similar al de Neo en Matrix, no ves problemas sino soluciones tecnológicas. Es increíble como la cotidianidad se convierte en una maquina de ideas, no hay un momento donde no estés pensando "Que excelente seria que se pudiera esto, o esto otro".&lt;br /&gt;&lt;br /&gt;Todo empezó en mi 8vo grado del colegio cuando tenía 13 anos, que logre utilizar Microsoft Front Page para crear mi primera pagina web. De que era la pagina? Obviamente de Dragón Ball! eso era lo que me encantaba, estaba enamorado de Bulma y quería ser como Vegeta! Me pasaba todo el día subiendo imágenes de Dragon Ball a mi pagina y deseando que alguien la leyera. En ese momento había un boom de servicios gratuitos de hosting como geocities.com y lycoos.com, todos te permitían hostear tu pagina gratis con la condición de que dejaras banners de publicidad en el site.&lt;br /&gt;&lt;br /&gt;Luego de crear miles de páginas y de copiarme otras miles (hice 2 páginas de dragon ball, una de shakira, una de limp bizkit y hasta una de un concurso de haloween que la pagina fortunecity.com estaba publicitando (no llegue ni a los primeros 100 puestos) decidí hacer una página para la gente de mi colegio y cree promo2003stc.tk: Que increíble la acogida de la pagina, me convertí en una mini-celebridad en todo el colegio, incluso en los niveles de mas abajo, todo el mundo me veía como "El chamo que creo la pagina web de los de quinto año".&lt;br /&gt;&lt;br /&gt;Para ese entonces ya tenía 16 años, la pagina permitía subir las fotos de la promoción, tenia encuestas de los mas sexys, encuestas de los mas simpáticos, una sección de anécdotas (en esos momentos uno se está graduando y entra una melancolía), una sección de caricaturas y montajes, etc. En fin, era una mini red social, aunque en ese momento nadie sabía lo que era ese término, y facebook y Hi5 no habían dado señales de vida en Venezuela.&lt;br /&gt;&lt;br /&gt;Con esa pagina comprobé una vez más mi pasión por la tecnología y me sirvió para estar REALMENTE CLARO de que era lo que quería estudiar (tenia dudas entre ser guitarrista/músico o ingeniero informático) y empecé mis estudios en ingeniería informática en la UCAB (Universidad Católica Andrés Bello) de Venezuela.&lt;br /&gt;&lt;br /&gt;Empecé la universidad y empezó mi verdadero emprendimiento! Continuo en un próximo post, déjenme sus comentarios! Y siganme en &lt;a href="http://www.poclu.com/alejandro"&gt;www.Poclu.com/alejandro&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-1706282832997903522?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/1706282832997903522/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2011/05/porque-no-he-escrito-mas-en-este-blog.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/1706282832997903522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/1706282832997903522'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2011/05/porque-no-he-escrito-mas-en-este-blog.html' title='Porque no he escrito mas en este blog - Parte I: Mi infancia'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-fsmC2FEoGV4/Td5p-TWyWnI/AAAAAAAAAUc/JPoRICcXk6M/s72-c/iniciativa%255B1%255D.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-3128110838068519005</id><published>2011-05-01T16:53:00.002-04:30</published><updated>2011-05-01T16:56:42.097-04:30</updated><title type='text'>Sobre emprendimiento en la web 2.0</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/-W1fZgxuRXy8/Tb3P6Nte_qI/AAAAAAAAAUU/DDKz3o5CaE0/s1600/young_entrepreneur.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 317px; height: 400px;" src="http://2.bp.blogspot.com/-W1fZgxuRXy8/Tb3P6Nte_qI/AAAAAAAAAUU/DDKz3o5CaE0/s400/young_entrepreneur.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5601862110538563234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif, Arial, Verdana; font-size: 15px; line-height: 17px; "&gt;Emprender en la web 2.0 tiene sus caracteristicas muy particulares que lo hacen muy diferente al emprendimiento tradicional:&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif, Arial, Verdana; font-size: 15px; line-height: 17px; "&gt;&lt;br /&gt;1. Facil desarrollo: Si bien hacer una red social de calidad a nivel tecnico es un reto, lograr pasar de nada a una version beta se puede lograr en muy poco tiempo (en semanas) y con poco esfuerzo. Utilizar las ultimas tenologias (frameworks) puede ser una buena estrategia para acelerar este proceso de desarrollo.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif, Arial, Verdana; font-size: 15px; line-height: 17px; "&gt;&lt;br /&gt;2. Rapido feedback: Una vez que la version beta esta lista, obtener feedback de los usuarios es muy sencillo gracias a la viralidad de las redes sociales e internet. Hay que tener herramientas para interactuar con los usuarios y saber cuales deben ser los proximos cambios para lograr ese ansiado "product-market fit".&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif, Arial, Verdana; font-size: 15px; line-height: 17px; "&gt;&lt;br /&gt;3. Iteraciones cortas: Carlos R Villanueva construllo la UCV completa sin caminos, cuando le preguntaron porque, dijo que esperaria a que la gente caminara por el monte, y cuando el paso de la gente crearan caminos de tierra, el construiria los caminos por esos recorridos. El mismo principio aplica aqui, no trates de construir una mega-aplicacion, sal con una version beta muy limitada y deja que los usuarios te digan hacia donde dirigirte. Ve soltando las funcionalidades que te pidan en tiempos cortos.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif, Arial, Verdana; font-size: 15px; line-height: 17px; "&gt;&lt;br /&gt;4. Atraer primeros usuarios: Es uno de los grandes desafios,este articulo de mashable (http://on.mash.to/lcmJ8E) explica como lo lograron las grandes redes sociales de hoy en dia.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif, Arial, Verdana; font-size: 15px; line-height: 17px; "&gt;&lt;br /&gt;5. Monetizar: Ganar dinero es otro de los retos, este tema lo dejo para mi post de los proximos dias.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-3128110838068519005?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/3128110838068519005/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2011/05/sobre-emprendimiento-en-la-web-20.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/3128110838068519005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/3128110838068519005'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2011/05/sobre-emprendimiento-en-la-web-20.html' title='Sobre emprendimiento en la web 2.0'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-W1fZgxuRXy8/Tb3P6Nte_qI/AAAAAAAAAUU/DDKz3o5CaE0/s72-c/young_entrepreneur.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-8306580571995107413</id><published>2010-08-06T00:34:00.002-04:30</published><updated>2010-08-06T00:41:20.833-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='seo'/><category scheme='http://www.blogger.com/atom/ns#' term='posicionamiento en buscadores'/><title type='text'>Posicionamiento en buscadores - Inscripcion en directorios de páginas</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_8AfDk4OYg00/TFuZMnrlVcI/AAAAAAAAAT4/GN0AHW3Mi7g/s1600/dmoz2%5B1%5D.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 124px; height: 124px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/TFuZMnrlVcI/AAAAAAAAAT4/GN0AHW3Mi7g/s400/dmoz2%5B1%5D.gif" alt="" id="BLOGGER_PHOTO_ID_5502159811852457410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Cuando google salió, su gran y recolucionario método de indexación se debió a una técnica fundamental, google decidió tomar los vínculos (links) que existían entre las paginas como una recomendación, es decir, si mi blog tiene un enlace hacia tu blog, entonces, quiere decir que yo considero que tu blog es bueno. Otro factor a tomar en cuenta es la importancia que tiene esa página que me está recomendado, no es lo mismo que la página del periódico New York times tenga un vinculo hacia tu pagina a que el bloginternetdeveloping.blogspot.com, por supuesto que la del NY Times es más importante, lamentablemente para mi . &lt;span class="fullpost"&gt;Para entender mejor esto pueden revisar la figura 1.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_8AfDk4OYg00/TFuYmo4quoI/AAAAAAAAATw/27qqq4OD7G0/s1600/links.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 224px;" src="http://2.bp.blogspot.com/_8AfDk4OYg00/TFuYmo4quoI/AAAAAAAAATw/27qqq4OD7G0/s400/links.png" alt="" id="BLOGGER_PHOTO_ID_5502159159340743298" border="0" /&gt;&lt;/a&gt;Figura 1&lt;br /&gt;&lt;/div&gt;&lt;meta equiv="Content-Type" content="text/html; charset=utf-8"&gt;&lt;meta name="ProgId" content="Word.Document"&gt;&lt;meta name="Generator" content="Microsoft Word 12"&gt;&lt;meta name="Originator" content="Microsoft Word 12"&gt;&lt;link rel="File-List" href="file:///C:%5CDOCUME%7E1%5COwner%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;o:officedocumentsettings&gt;   &lt;o:relyonvml/&gt;   &lt;o:allowpng/&gt;  &lt;/o:OfficeDocumentSettings&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;link rel="themeData" href="file:///C:%5CDOCUME%7E1%5COwner%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"&gt;&lt;link rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5COwner%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:trackmoves/&gt;   &lt;w:trackformatting/&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:donotpromoteqf/&gt;   &lt;w:lidthemeother&gt;EN-US&lt;/w:LidThemeOther&gt;   &lt;w:lidthemeasian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:lidthemecomplexscript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:splitpgbreakandparamark/&gt;    &lt;w:dontvertaligncellwithsp/&gt;    &lt;w:dontbreakconstrainedforcedtables/&gt;    &lt;w:dontvertalignintxbx/&gt;    &lt;w:word11kerningpairs/&gt;    &lt;w:cachedcolbalance/&gt;   &lt;/w:Compatibility&gt;   &lt;m:mathpr&gt;    &lt;m:mathfont val="Cambria Math"&gt;    &lt;m:brkbin val="before"&gt;    &lt;m:brkbinsub val="&amp;#45;-"&gt;    &lt;m:smallfrac val="off"&gt;    &lt;m:dispdef/&gt;    &lt;m:lmargin val="0"&gt;    &lt;m:rmargin val="0"&gt;    &lt;m:defjc val="centerGroup"&gt;    &lt;m:wrapindent val="1440"&gt;    &lt;m:intlim val="subSup"&gt;    &lt;m:narylim val="undOvr"&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"&gt;   &lt;w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"&gt;   &lt;w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 1"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 2"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 3"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 4"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 5"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 6"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 7"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 8"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 9"&gt;   &lt;w:lsdexception locked="false" priority="35" qformat="true" name="caption"&gt;   &lt;w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"&gt;   &lt;w:lsdexception locked="false" priority="1" name="Default Paragraph Font"&gt;   &lt;w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"&gt;   &lt;w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"&gt;   &lt;w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"&gt;   &lt;w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Revision"&gt;   &lt;w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"&gt;   &lt;w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"&gt;   &lt;w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"&gt;   &lt;w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"&gt;   &lt;w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"&gt;   &lt;w:lsdexception locked="false" priority="37" name="Bibliography"&gt;   &lt;w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Font Definitions */  @font-face 	{font-family:"Cambria Math"; 	panose-1:2 4 5 3 5 4 6 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:roman; 	mso-font-pitch:variable; 	mso-font-signature:-1610611985 1107304683 0 0 159 0;} @font-face 	{font-family:Calibri; 	panose-1:2 15 5 2 2 2 4 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-1610611985 1073750139 0 0 159 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin-top:0cm; 	margin-right:0cm; 	margin-bottom:10.0pt; 	margin-left:0cm; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} a:link, span.MsoHyperlink 	{mso-style-priority:99; 	color:blue; 	text-decoration:underline; 	text-underline:single;} a:visited, span.MsoHyperlinkFollowed 	{mso-style-noshow:yes; 	mso-style-priority:99; 	color:purple; 	mso-themecolor:followedhyperlink; 	text-decoration:underline; 	text-underline:single;} span.apple-style-span 	{mso-style-name:apple-style-span; 	mso-style-unhide:no;} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} .MsoPapDefault 	{mso-style-type:export-only; 	margin-bottom:10.0pt; 	line-height:115%;} @page WordSection1 	{size:612.0pt 792.0pt; 	margin:72.0pt 72.0pt 72.0pt 72.0pt; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.WordSection1 	{page:WordSection1;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Table Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin-top:0cm; 	mso-para-margin-right:0cm; 	mso-para-margin-bottom:10.0pt; 	mso-para-margin-left:0cm; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;p style="text-align: center;" class="MsoNormal"&gt;&lt;a href="http://es.wikipedia.org/wiki/PageRank"&gt;&lt;span style="" lang="ES"&gt;Page Rank&lt;/span&gt;&lt;/a&gt;&lt;span style="" lang="ES"&gt; : &lt;/span&gt;&lt;span class="apple-style-span"&gt;&lt;span style="line-height: 115%;font-family:&amp;quot;;font-size:9pt;"  lang="ES" &gt;PageRank (PR) es un valor numérico que representa la importancia que una página web tiene en Internet.&lt;/span&gt;&lt;/span&gt;&lt;span style="" lang="ES"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;Cuando uno quiere subir de posición a una página web que no es muy conocida, es probable que tampoco tenga ningún link o vinculo que apunte hacia esa página, entonces, ¿Cómo podemos empezar a obtener vínculos hacia nuestra web? Es muy sencillo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Inscríbanla en todos los directorios de páginas que existen en internet&lt;/span&gt; (O por lo menos en los más importantes, es decir, aquellos directorios que estén mejor posicionados en google). El directorio web gratuito y software libre más importante del mundo es &lt;a href="http://www.dmoz.org/"&gt;http://www.dmoz.org/&lt;/a&gt;, tiene un Page Rank de 7 y para poder ser incluido en ese directorio debes pasar por unas estrictas normas y validaciones por parte de sus editores.&lt;br /&gt;&lt;br /&gt;Mi recomendación es que busquen la mayor cantidad de directorios posibles y se inscriban en todos, es una tarea fastidiosa, pero será muy reconfortante cuando vean su página subir puestos en google rápidamente.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-8306580571995107413?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/8306580571995107413/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2010/08/posicionamiento-en-buscadores_3129.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/8306580571995107413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/8306580571995107413'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2010/08/posicionamiento-en-buscadores_3129.html' title='Posicionamiento en buscadores - Inscripcion en directorios de páginas'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_8AfDk4OYg00/TFuZMnrlVcI/AAAAAAAAAT4/GN0AHW3Mi7g/s72-c/dmoz2%5B1%5D.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-6121538714042453475</id><published>2010-08-06T00:15:00.005-04:30</published><updated>2010-08-06T00:33:20.502-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='seo'/><category scheme='http://www.blogger.com/atom/ns#' term='posicionamiento en buscadores'/><title type='text'>Posicionamiento en buscadores - Utilizacion de etiquetas h1, h2, Strong, etc.</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/TFuW4MOhf3I/AAAAAAAAATo/xZthfdUzPmk/s1600/etiquetas.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 129px;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/TFuW4MOhf3I/AAAAAAAAATo/xZthfdUzPmk/s400/etiquetas.png" alt="" id="BLOGGER_PHOTO_ID_5502157261862174578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Durante los inicios del diseño web, las etiquetas h1, h2 era muy utilizadas para representar títulos y subtítulos de las paginas, esto se debía a que le colocaban un formato al texto que estos elementos HTML tienen un comportamiento especifico, ideal para resaltar textos. Por ejemplo, la etiqueta h1 lo que hace es hace muy grande y negrito el texto que esta contenido dentro de ella.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Hoy en día con la utilización de estilos CSS podemos sobre-escribir el comportamiento natural de una h1 y colocarlo del tamaño, color y forma que deseemos, sin embargo, google sigue considerando los textos que se encuentren dentro de las etiquetas h1, h2, h3, etc. Como los textos más importantes de la pagina, los que resumen en cierta manera todo el contenido de la pagina (Los títulos, subtítulos, etc.).&lt;br /&gt;&lt;br /&gt;Aprovechandonos de estos conocimientos sobre los buscadores, es muy recomendable mantener esa conducta estandar que la comunidad adopto inicialmente, cada vez que veamos un titulo debemos colocarlo dentro de una etiquera h (h1,h2,h3,h4 o h5), despues si queremos le damos el estilo (color, tamaño, grosor, etc.) que queramos.&lt;br /&gt;&lt;br /&gt;La etiqueta &amp;lt;strong&amp;gt; tambien es entendida por google para resaltar una palabra clave dentro de la pagina, solo que en menor medida que las etiquetas h.&lt;br /&gt;&lt;br /&gt;Es importante recalcar que no debemos abusar tampoco de estas etiquetas, ya que se puede perder el sentido de la importancia del texto, si colocamos todos nuestros textos dentro de una etiqueta &amp;lt;strong&amp;gt; o &amp;lt;h1&amp;gt; no estamos logrando nada porque google no sabe cuales son los terminos mas importantes, seria como cuando leemos todo un texto en mayuscula, puede aturdirnos y al todo ser importante, en realidad, nada es importante.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-6121538714042453475?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/6121538714042453475/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2010/08/posicionamiento-en-buscadores_06.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/6121538714042453475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/6121538714042453475'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2010/08/posicionamiento-en-buscadores_06.html' title='Posicionamiento en buscadores - Utilizacion de etiquetas h1, h2, Strong, etc.'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_8AfDk4OYg00/TFuW4MOhf3I/AAAAAAAAATo/xZthfdUzPmk/s72-c/etiquetas.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-631442239422008430</id><published>2010-08-05T01:02:00.008-04:30</published><updated>2010-08-06T00:11:54.032-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='seo'/><category scheme='http://www.blogger.com/atom/ns#' term='tiempo de carga de una web'/><title type='text'>Posicionamiento en buscadores - Tiempo de carga de una pagina web</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8AfDk4OYg00/TFuSiZHxjpI/AAAAAAAAATY/j3rr9G7adEc/s1600/mp3-clock.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 136px; height: 200px;" src="http://4.bp.blogspot.com/_8AfDk4OYg00/TFuSiZHxjpI/AAAAAAAAATY/j3rr9G7adEc/s200/mp3-clock.jpg" alt="" id="BLOGGER_PHOTO_ID_5502152489319894674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Esta es un área muy técnica que debe ser atendida con mucha paciencia por parte del desarrollador, pero cada vez vale más la pena tomarla en cuenta porque según el nuevo motor de google llamado&lt;a href="http://www.genbeta.com/buscadores/google-estrena-oficialmente-su-nuevo-algoritmo-caffeine"&gt; Caffeine&lt;/a&gt; este es uno de los factores más importantes al momento de posicionar la pagina en el buscador.&lt;br /&gt;&lt;br /&gt;Hay miles de factores que perjudican el tiempo de visualización promedio de una página web: Que tan pesadas son las imágenes y recursos, la cantidad de peticiones que hace la pagina, la cantidad de scripts externos que se importan, la velocidad del servidor, la presencia de consultas a la BD muy pesadas, etc.&lt;br /&gt;&lt;br /&gt;Podríamos estar todo el día nombrando cosas, pero como hay muchos artículos que hablan sobre optimización de consultas SQL, hosting de servidores, etc. Yo les voy a mencionar solo algunos tips que no parecen tan obvios, pero pueden ayudar bastante a disminuir el tiempo de carga de tu página.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Bajar el tamaño y calidad de todas tus imágenes de la pagina (Y utilizar la menor cantidad posible).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Comprimir códigos CSS y Javascript:&lt;/span&gt; Comprimir los códigos tiene como inmediata consecuencia lógica que pesen muchísimo menos, y por lo tanto que sean mucho mas rápidos de descargar. Para hacer esto hay un programa muy recomendado llamado &lt;a href="http://developer.yahoo.com/yui/compressor/"&gt;YUI Compresor&lt;/a&gt;, este programa con un algoritmo logra eliminar todos los espacios en blanco, códigos que sobran, etc. De una página web. &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Unificar tus imágenes en una sola: &lt;/span&gt;Una de las metas para hacer más veloz la carga de tu pagina es reducir el número de request que se hacen antes de cargarla o justo al momento de cargarla, si uno tiene 5 imágenes diferentes en una misma página web, es posible unificarlas en una sola imágenes y hacer 5 request a la misma imagen, entonces, como el navegador tiene memoria cache, en realidad solo pide la imagen al servidor la primera vez y de ahí en adelante la carga directamente desde la cache. Para poder poner todo en una sola imagen, deben recorrer la imagen con una propiedad llamada backround-position: 0px 0px; (Primero el movimiento de la posición en X y luego en Y). Por ejemplo ,a siguiente imagen de la figura 1:&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238);"&gt;&lt;img src="http://1.bp.blogspot.com/_8AfDk4OYg00/TFpNu2fhxEI/AAAAAAAAATA/u_n4o_l06qE/s200/iconos-funciones.png" alt="" id="BLOGGER_PHOTO_ID_5501795362083554370" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 96px;" border="0" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238);"&gt;Figura 1&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt; Tiene 12 imágenes azules diferentes, donde cada una explica algún punto de la herramienta http://www.tucondominio.com.&lt;br /&gt;&lt;br /&gt;Para optimizar esto debemos realizar una sola imagen que vamos recorriendo con el &lt;a href="http://htmlhelp.com/es/reference/css/color-background/background-position.html"&gt;backgroundposition &lt;/a&gt;y se le pone el width y height necesario para que la imagen deseada se vea correctamente.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8AfDk4OYg00/TFpQk5Kc97I/AAAAAAAAATQ/hMcP_VvlDdE/s1600/download.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 156px;" src="http://4.bp.blogspot.com/_8AfDk4OYg00/TFpQk5Kc97I/AAAAAAAAATQ/hMcP_VvlDdE/s200/download.jpg" alt="" id="BLOGGER_PHOTO_ID_5501798489536657330" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Figura 2&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;El codigo css para lograr una pagina web como la mostrada en la figura 2 es el siguiente:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;.functionTitle{ font-size: 16px;font-weight: bold; padding: 0; margin: 0px;}&lt;br /&gt;#content{ position: relative;display: block;}&lt;br /&gt;#content ul{padding: 0; margin: 0;}&lt;br /&gt;#content li{display: inline-table;width: 350px; margin: 0;margin-left: 50px;padding: 0; font-size: 12px;}&lt;br /&gt;div#calendario{ position: relative; background: url('../../images/tucondominio/iconos-funciones.png');&lt;br /&gt;float: left;width: 60px;background-position: 0px 0px;height: 80px; margin-right: 30px;}&lt;br /&gt;div#balances{position: relative;background: url('../../images/tucondominio/iconos-funciones.png'); float: left;&lt;br /&gt;width: 60px;background-position: 60px 0px;height: 80px; margin-right: 30px;}&lt;br /&gt;div#votaciones{position: relative;background: url('../../images/tucondominio/iconos-funciones.png'); float: left;&lt;br /&gt;width: 60px;background-position: 182px 0px; height: 80px;margin-right: 30px;}&lt;br /&gt;div#peticiones{position: relative;background: url('../../images/tucondominio/iconos-funciones.png'); float: left;&lt;br /&gt;width: 60px;background-position: 243px 0px; height: 80px;margin-right: 30px;}&lt;br /&gt;div#servicios{position: relative;background: url('../../images/tucondominio/iconos-funciones.png'); float: left;&lt;br /&gt;width: 60px;background-position: 60px 90px; height: 80px;margin-right: 30px;}&lt;br /&gt;div#condominio{ position: relative; background: url('../../images/tucondominio/iconos-funciones.png');&lt;br /&gt;float: left;width: 60px;background-position: 182px 90px;height: 80px;margin-right: 30px;}&lt;br /&gt;div#reglamentos{position: relative; background: url('../../images/tucondominio/iconos-funciones.png');&lt;br /&gt;float: left;width: 60px;background-position: 243px 90px;height: 80px;margin-right: 30px;}&lt;br /&gt;div#edificio{ position: relative; background: url('../../images/tucondominio/iconos-funciones.png');float: left;&lt;br /&gt;width: 60px;background-position: -60px 0px; height: 80px;margin-right: 30px;}&lt;br /&gt;div#espacios&lt;br /&gt;{position: relative;background: url('../../images/tucondominio/iconos-funciones.png');float: left;&lt;br /&gt;width: 60px;background-position: 1px -80px; height: 80px;margin-right: 30px;}&lt;br /&gt;div#cartelera&lt;br /&gt;{ position: relative; background: url('../../images/tucondominio/iconos-funciones.png'); float: left;&lt;br /&gt;width: 60px;background-position: -60px -80px;height: 80px;margin-right: 30px;}&lt;br /&gt;div#asociacion&lt;br /&gt;{ position: relative; background: url('../../images/tucondominio/iconos-funciones.png'); float: left;&lt;br /&gt;width: 60px; background-position: 121px 88px;height: 80px;margin-right: 30px;}&lt;br /&gt;div#perfil{ position: relative;background: url('../../images/tucondominio/iconos-funciones.png');float: left;&lt;br /&gt;width: 60px;background-position: 121px 0px; height: 80px;margin-right: 30px;}&lt;br /&gt;h2{ color: #F0BC60; font-size: 20px;text-transform: uppercase;&lt;br /&gt;background: url(../../images/tucondominio/imagenes-contacto.png) no-repeat; background-position: 0px 18px;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Carga lazy-load de imagenes con JQuery:&lt;/span&gt; Jquery es una librería o framework para Javascript que permite programar funcionalidades geniales con unas pocas líneas de código, uno de los “plugins” o componentes que se han desarrollado hasta el momento es llamado laztload. Este plugin permite cargar solo las imágenes de una página web que están siendo visualizadas por el navegador, es decir, si la pagina es muy larga y tiene imágenes por todo el sitio, entonces este plugin no cargará las imágenes si no haz llegado a esa parte de la pagina (haciendo scroll). Esto reduce los tiempos de carga por aunque no haz cargado muchas imágenes, google Jura que ya la pagina termino de visualizarse y lo da por terminado. El mejor ejemplo de lazyload lo consigues en la página web &lt;a href="http://www.mashable.com/"&gt;http://www.mashable.com&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Para revisar el tiempo de caga de una web les recomiento &lt;a href="http://www.selfseo.com/website_speed_test.php"&gt;esta herramienta&lt;/a&gt; gratuita.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-631442239422008430?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/631442239422008430/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2010/08/posicionamiento-en-buscadores-tiempo-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/631442239422008430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/631442239422008430'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2010/08/posicionamiento-en-buscadores-tiempo-de.html' title='Posicionamiento en buscadores - Tiempo de carga de una pagina web'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_8AfDk4OYg00/TFuSiZHxjpI/AAAAAAAAATY/j3rr9G7adEc/s72-c/mp3-clock.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-2088891805740076889</id><published>2010-08-05T00:58:00.005-04:30</published><updated>2010-08-06T00:09:36.459-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo web'/><category scheme='http://www.blogger.com/atom/ns#' term='seo'/><category scheme='http://www.blogger.com/atom/ns#' term='posicionamiento en buscadores'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Posicionamiento en buscadores - Maquetacion</title><content type='html'>&lt;div&gt;Una vez que tenemos los &lt;a href="http://internetdeveloping.blogspot.com/2010/08/posicionamiento-en-buscadores-url.html"&gt;URL amigables&lt;/a&gt; implementados debemos elaborar nuestras páginas utilizando &lt;a href="http://internetdeveloping.blogspot.com/2009/09/tutorial-basico-de-css.html"&gt;CSS&lt;/a&gt;, debemos EVITAR la utilización de tablas en la gran mayoria de nuestros diseños.&lt;a href="http://internetdeveloping.blogspot.com/2009/09/tutorial-basico-de-css.html"&gt; CSS es una tecnología&lt;/a&gt; utilizada para visualizar (maquetar, dar format, colorear, etc.) de una mejor manera.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cuando google o cualquier otro buscador entra en tu pagina, no está interesado en saber si es estéticamente agradable, si es usable, ni nada por el estilo, lo único que a un buscador le importa cuando entra a tu pagina es el contenido (de que se trata la pagina, de que habla.). Cuando el robot de un buscador (por ejemplo el &lt;a href="http://es.wikipedia.org/wiki/Googlebot"&gt;googlebot de GOOGLE&lt;/a&gt;) entra en tu página, lo  primero que hace es limpiar todos los CSS que encuentre para concentrarse únicamente en el contenido de la página. Por esta razón la utilización de tablas te perjudica porque las tablas no son ignoradas por los robots de los buscadores, sino que más bien son consideradas parte del contenido, lo que perjudica el posicionamiento de tu página en los buscadores.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;Es importante acotar que si bien las tablas no son amigables a los buscadores, toadvía son una tecnologia importante y útil para ciertas ocaciones, y tienen propiedades tales como &lt;span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: arial,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: small;"&gt;&lt;span class="Apple-style-span" style="line-height: 15px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;h3 class="r" style="margin: 0px; padding: 0px; font-size: medium; font-weight: normal; display: inline;"&gt;&lt;a href="http://www.idocs.com/tags/tables/_THEAD.html" class="l" onmousedown="return clk(this.href,'','','','1','vRoVHSsdJGsw77RORNFuag','0CBkQFjAA')" style="color: rgb(17, 17, 204); cursor: pointer;"&gt;&lt;em style="font-weight: bold; font-style: normal;"&gt;THEAD&lt;/em&gt;,&lt;span class="Apple-converted-space"&gt; &lt;/span&gt;&lt;em style="font-weight: bold; font-style: normal;"&gt;TBODY&lt;/em&gt;, TFOOT&lt;/a&gt;&lt;/h3&gt; que pueden resultar muy prácticas.&lt;span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: arial,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: small;"&gt;&lt;span class="Apple-style-span" style="line-height: 15px;"&gt;&lt;button class="ws" title="" style="border-width: 0px; background-image: url(http://www.google.co.ve/images/srpr/nav_logo14.png); cursor: pointer; display: inline; margin-right: 3px; height: 14px; vertical-align: 0px; width: 14px; margin-left: 5px; opacity: 0.5; background-position: -117px -117px;"&gt;&lt;/button&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Para entender más sobre maquetación en css les dejo &lt;a href="http://internetdeveloping.blogspot.com/2009/09/tutorial-basico-de-css.html"&gt;este tutorial&lt;/a&gt; que he realizado hace algún tiempo que explica los&lt;a href="http://internetdeveloping.blogspot.com/2009/09/tutorial-basico-de-css.html"&gt; conceptos basicos de CSS&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-2088891805740076889?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/2088891805740076889/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2010/08/posicionamiento-en-buscadores.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/2088891805740076889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/2088891805740076889'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2010/08/posicionamiento-en-buscadores.html' title='Posicionamiento en buscadores - Maquetacion'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-602007498096185160</id><published>2010-08-03T23:59:00.005-04:30</published><updated>2010-08-04T00:18:05.338-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo web'/><category scheme='http://www.blogger.com/atom/ns#' term='seo'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='posicionamiento en buscadores'/><title type='text'>Posicionamiento en buscadores - URL amigable (Frendly URL)</title><content type='html'>&lt;p class="MsoListParagraphCxSpFirst" style="text-indent: -18pt;"&gt;&lt;span lang="ES"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;¿Qué es el paso de variables por URL? Es una tecnica muy utilizada por todos los desarrollares, frameworks y entornos de desarrollo web que existen en la acutalidad. El protocolo HTTP cuenta con una serie de metodos basicos para garantizar el funcionamiento de una pagina web, uno de ellos es el metodo GET, que sirve para obtener valores de variables a partir de un URL, de esta manera si yo tengo una pagina web con una direccion (URL) como la siguiente:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpFirst" style="text-align: center; text-indent: -18pt;"&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div style="text-align: center; font-weight: bold;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;http://www.mipagina.com/intex.php?&lt;span style="color: rgb(153, 0, 0);"&gt;idioma&lt;/span&gt;=es&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpFirst" style="text-indent: -18pt;"&gt;Puedo obtener el valor de la variable "idioma" en cualquier momento, y cambiar dinamicamente, en funcion del valor de esa variable, para imprimir el valor de la variable "idioma" en el lenguaje de programacion php no hace falta mas que la siguiente linea de codigo:&lt;/p&gt;&lt;p class="MsoListParagraphCxSpFirst" style="text-indent: -18pt; text-align: center;"&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: rgb(102, 0, 0); font-weight: bold;"&gt;echo $_GET["idioma"];&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;span lang="ES"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Es muy t&lt;/span&gt;&lt;/span&gt;&lt;span lang="ES"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;ípico de u&lt;/span&gt;&lt;/span&gt;n programador utilizar el paso de variables por url, haciendo que este url se vuelva difícil de leer para un usuario O BUSCADOR. &lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Por ejemplo: En mi pagina &lt;a href="http://www.recetasdecocteles.com/"&gt;&lt;span style="" lang="ES"&gt;http://www.recetasdecocteles.com/&lt;/span&gt;&lt;/a&gt;&lt;span style="" lang="ES"&gt; para ver los detalles de un coctel se puede ir a cualquiera de los siguientes URL’s:&lt;/span&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; text-indent: -18pt;"&gt;&lt;span style=";font-family:Calibri;"  lang="ES"&gt;&lt;span style=""&gt;a.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.recetasdecocteles.com/coctel.php?id_coctel=6"&gt;&lt;span style="" lang="ES"&gt;http://www.recetasdecocteles.com/coctel.php?id_coctel=&lt;span style="color: rgb(102, 0, 0); font-weight: bold;"&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="" lang="ES"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="margin-left: 72pt; text-indent: -18pt;"&gt;&lt;span style=";font-family:Calibri;"  lang="ES"&gt;&lt;span style=""&gt;b.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.recetasdecocteles.com/coctel/6/Cosmopolitan"&gt;&lt;span style="" lang="ES"&gt;http://www.recetasdecocteles.com/coctel/&lt;span style="color: rgb(102, 0, 0); font-weight: bold;"&gt;6&lt;/span&gt;/Cosmopolitan&lt;/span&gt;&lt;/a&gt;&lt;span style="" lang="ES"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="" lang="ES"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast"&gt;&lt;span style="" lang="ES"&gt;¿Notan la diferencia? ¿Si verdad? El primero de estos URL´s esta hecho a la antigua, es evidente para cualquier programador que el desarrollador hace un $_GET[“id_coctel”] para obtener el id del coctel que se desea mostrar, pero, ¿Qué pasa con el buscador? Ni siquiera sabe que coctel es el que tiene id=6, y el usuario final.. Menos!&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpLast"&gt;&lt;span style="" lang="ES"&gt;Para solucionar eso debemos implementar URL´s como el segundo de estos ejemplos que acabo de dar, de esta manera tanto el buscador como el usuario final sabrán que ese url lleva directo a los detalles del coctel “Cosmopolitan”.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpLast"&gt;Uno de los principales factores tomados en cuenta por un buscador a la hora de indexar una pagina web, es el contenido de su titulo, si la palabra "Cosmopolitan" esta en el titulo de una de tus paginas, entonces google probablemente te indexe mucho mejor cuando los usuarios coloquen "Cosmopolitan" en google.&lt;/p&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-602007498096185160?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/602007498096185160/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2010/08/posicionamiento-en-buscadores-url.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/602007498096185160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/602007498096185160'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2010/08/posicionamiento-en-buscadores-url.html' title='Posicionamiento en buscadores - URL amigable (Frendly URL)'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-6050028160797884890</id><published>2010-08-03T18:46:00.008-04:30</published><updated>2010-08-06T00:43:24.553-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo web'/><category scheme='http://www.blogger.com/atom/ns#' term='seo'/><category scheme='http://www.blogger.com/atom/ns#' term='posicionamiento en buscadores'/><title type='text'>Posicionamiento en buscadores (SEO)</title><content type='html'>&lt;span style="" lang="ES"&gt;&lt;span class="Apple-style-span"  style="line-height: 55px; font-size:medium;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_8AfDk4OYg00/TFik46MTn2I/AAAAAAAAAS4/KlbC0NdcYDo/s1600/SeoUK15.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 193px; height: 200px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/TFik46MTn2I/AAAAAAAAAS4/KlbC0NdcYDo/s200/SeoUK15.jpg" alt="" id="BLOGGER_PHOTO_ID_5501328242433564514" border="0" /&gt;&lt;/a&gt;&lt;span style="" lang="ES"&gt;Si eres programador, arquitecto o diseñador web probablemente haz escuchado este término que está muy de moda durante los últimos años. Para una página web que quiere darse a conocer en el mercado esta vía puede ser una de sus mejores armas para publicitarse sin necesidad de un gran presupuesto.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES"&gt;Un buen posicionamiento en la web es una tarea de todos los involucrados en el diseño, desarrollo, e implementación de la pagina web, es necesario tomarlo en cuenta desde el mismo momento en que se empieza.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;span style="" lang="ES"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES"&gt;Para lograr un buen posicionamiento existe una técnica llamada “Optimización en buscadores” o “Search engine optimization (SEO)”, que no es más que la utilización de un mega conjunto de &lt;b style=""&gt;mejores prácticas&lt;/b&gt; para lograr que tu sitio web suba posiciones en un buscador (Principalmente google).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES"&gt;Yo no soy gurú en esto, pero en varios emprendimientos que he tenido últimamente me he visto en la necesidad de aprender un poco más sobre esto, y los resultados pueden ser increíbles.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES"&gt;Para no alargarme más en este tema, quisiera dejarles las mejores prácticas que yo he logrado recolectar en mi mente para que las apliquen en sus páginas lo más rápido que puedan, ¡no hay tiempo ni visitas que perder! En este post voy a colocar solo los titulos de cada una de las secciones, y, luego, voy a ampliarlas en diferentes entradas:&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;a href="http://internetdeveloping.blogspot.com/2010/08/posicionamiento-en-buscadores-url.html"&gt;URL amistosos (Frendly URL’s).&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;a href="http://internetdeveloping.blogspot.com/2010/08/posicionamiento-en-buscadores.html"&gt;Maquetación CSS.&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;a href="http://internetdeveloping.blogspot.com/2010/08/posicionamiento-en-buscadores-tiempo-de.html"&gt;Tiempo de carga del sitio.&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;a href="http://internetdeveloping.blogspot.com/2010/08/posicionamiento-en-buscadores_06.html"&gt;Utilización correcta de las etiquetas&lt;/a&gt;&lt;span&gt;&lt;a href="http://internetdeveloping.blogspot.com/2010/08/posicionamiento-en-buscadores_06.html"&gt;  &lt;/a&gt;&lt;/span&gt;&lt;a href="http://internetdeveloping.blogspot.com/2010/08/posicionamiento-en-buscadores_06.html"&gt;h1, h2, h3, Strong, etc.&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;a href="http://internetdeveloping.blogspot.com/2010/08/posicionamiento-en-buscadores_3129.html"&gt;Inscripción en directorios de páginas.&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;Estudio de las palabras claves.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;Ubicacion de los codigos javascript.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="ES"   style="font-size:12.0pt;mso-bidi-line-height:115%;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-ascii-theme-font:minor-latin;mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin; mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:ES;mso-fareast-language:EN-US;mso-bidi-language:AR-SAfont-family:&amp;quot;;font-size:11.0pt;"&gt;Contenido del sitio.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:Calibri, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-weight: 900; line-height: 18px;"&gt;Google webmaster toolkit.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:Calibri, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-weight: 900; line-height: 18px;"&gt;Otras herramientas muy utiles.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Calibri, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-weight: 900; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-6050028160797884890?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/6050028160797884890/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2010/08/posicionamiento-en-buscadores-seo.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/6050028160797884890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/6050028160797884890'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2010/08/posicionamiento-en-buscadores-seo.html' title='Posicionamiento en buscadores (SEO)'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_8AfDk4OYg00/TFik46MTn2I/AAAAAAAAAS4/KlbC0NdcYDo/s72-c/SeoUK15.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-5771919914131472886</id><published>2009-09-09T18:09:00.007-04:30</published><updated>2009-09-09T18:55:22.082-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Conceptos Básicos de CSS</title><content type='html'>&lt;p&gt;Una hoja de estilo es un conjunto de especificaciones que declara cómo deben mostrarse los componentes de una página web, es decir, cómo debe interpretar el navegador, a efectos de presentación visual, los distintos elementos presentes en una página web. El formato de cada elemento de una página web se especifica  mediante declaraciones de estilo denominadas reglas.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Los estilos de css se definen en forma de clases, se supone que los estilos que definamos deben estar sincronizados con las definiciones html de la pagina web.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.  Definiciones&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Una definicion CSS se compone de tres partes:&lt;br /&gt;&lt;/p&gt;&lt;ol style="margin-left: 54pt;"&gt;&lt;li&gt;Selector (Clase o codigo)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Propiedad&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Valor&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;p&gt;Una definicion simple organiza los tres componentes anteriores de acuerdo a la siguiente estructura:&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt;"&gt;&lt;span style="font-size:9;"&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;selector  {propiedad: valor;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Por ejemplo, la siguiente definición dice que todos los coponents h1 de la pagina deben tener un grosor normal (de tener un grosor grande sería equivalente a que estuvieran en negritas los textos):&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt;"&gt;&lt;span style="font-size:9;"&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;h1  { font-weight: normal; } &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Una definicion puede contener más de una propiedad con sus respectivos valores, separadas entre ellas por punto y coma (se considera una buena práctica añadir también punto y coma al final). Ejemplo:&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt;"&gt;&lt;span style="font-size:9;"&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;h1  { font-weight: normal; color: red;} &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Una definicion puede dar formato a más de un elemento o componente a la vez, separando estos mediante comas. Ejemplo:&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 72pt;"&gt;&lt;span style="font-size:9;"&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;h1, h2, h3, h4  { font-weight: normal; color: red; }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3.  Declaración&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Las definiciones de las hojas de estilo se pueden declarar en tres sitios distintos:&lt;br /&gt;&lt;/p&gt;&lt;ol style="margin-left: 54pt;"&gt;&lt;li&gt;En la página web&lt;br /&gt;&lt;/li&gt;&lt;li&gt;En un archivo externo&lt;br /&gt;&lt;/li&gt;&lt;li&gt;En un elemento&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;En la página web&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Este tipo de declaraciones no son recomendadas ni se consideran buenas prácticas dentro de la programación web y por eso no voy a explicarlas.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;En un elemento&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Este tipo de declaraciones no son recomendadas ni se consideran buenas prácticas dentro de la programación web y por eso no voy a explicarlas.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;En un archivo externo&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Las declaraciones se escriben en un archivo de texto con extensión .css sin ningún tipo de preámbulo y deben ser referenciados al principio de las páginas web, específicamente entre los tags &amp;lt;head&amp;gt; &amp;lt;/head&amp;gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:9;"&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;&amp;lt;link rel="stylesheet" href="estilo.css" type="text/css" /&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Como se puede ver, el atributo rel (relation) advierte que se trata de una hoja de estilo, href aporta el nombre (y el camino si fuera necesario) del archivo y type indica que se trata de un archivo de texto que contiene una hoja de estilo que sigue la norma CSS.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4.  Cajas&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Desde el punto de vista de CSS, todo lo que hay en una página web es una caja. Lo que hace un selector es identificar la caja a la que se aplica el formato.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Las cajas tienen:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Contenido (content). El contenido de la caja: texto, imagen, etc.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Relleno (padding).  La distancia entre el contenido y el borde.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Borde (border). El borde de la caja.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Margen (margin). La distancia entre el borde y el elemento contenedor (p.e. body) u otro elemento adyacente.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; El siguiente diagrama muestra modelo oficial de cajas de CSS según el W3C:&lt;br /&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_8AfDk4OYg00/Sqg2GdlyWyI/AAAAAAAAARU/HyeBXlpnnN0/s1600-h/1.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 287px;" src="http://2.bp.blogspot.com/_8AfDk4OYg00/Sqg2GdlyWyI/AAAAAAAAARU/HyeBXlpnnN0/s400/1.PNG" alt="" id="BLOGGER_PHOTO_ID_5379609239544290082" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Los componentes de la caja se pueden dividir en cuatro partes: top, bottom, right y left. Por tanto, en la ilustración anterior, las siglas LM, RM, etc., significan LeftMargin, Right Margin, etc.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Las hojas de estilo pueden aplicar formato (p.e. color, anchura, tipo de línea, etc.) a cualquiera de los componentes de esta caja, así como  permite posicionar estas cajas en el conjunto de la página.&lt;br /&gt;&lt;/p&gt;&lt;p&gt; De este modo, si queremos que un elemento muestre el borde en forma de puntos de color azul, podemos generar esta declaración:&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt;"&gt;&lt;span style="font-size:9;"&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;p  { border-style: dotted;  border-color: blue}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;A partir de lo anterior, este código en la página:&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt;"&gt;&lt;span style="font-size:8;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: italic;"&gt;&amp;lt;p&amp;gt;Ejemplos de hojas de Estilo&amp;lt;/p&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Se mostrará así:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8AfDk4OYg00/Sqg2GhrrehI/AAAAAAAAARc/kk64NNzRiYk/s1600-h/2.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 39px;" src="http://4.bp.blogspot.com/_8AfDk4OYg00/Sqg2GhrrehI/AAAAAAAAARc/kk64NNzRiYk/s400/2.PNG" alt="" id="BLOGGER_PHOTO_ID_5379609240642746898" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Si queremos ampliar el relleno entre el contenido y el borde así como tener un tamaño de punto más pequeño podemos modificar la regla anterior acudiendo a las propiedades de borde (border) y de margen (padding):&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt;"&gt;&lt;span style="font-size:9;"&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;p  { border-style: dotted;  border-width: 2px;  border-color: blue;  padding: 15px; } &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Ahora, el navegador lo mostrará así:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_8AfDk4OYg00/Sqg2HCXmWNI/AAAAAAAAARk/G68sHUmUN9M/s1600-h/3.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 50px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/Sqg2HCXmWNI/AAAAAAAAARk/G68sHUmUN9M/s400/3.PNG" alt="" id="BLOGGER_PHOTO_ID_5379609249416894674" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;5.  Herencia&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Las cajas están contenidas dentro de otras cajas y heredan los estilos de la caja contenedora si no hay una regla de nivel específico.  Por ejemplo, si declaramos un tipo de letra para el elemento body, todos los elementos que están dentro, como h1, h2, p, etc. heredarán este tipo de letra.  En el siguiente ejemplo declaramos un  color de letra para body y otro distinto para h2. De este modo, todos los elementos, excepto h2, tendrán el color declarado para body, mientras que h2 tendrá su propio color.  Veamos. Primero la declaración de reglas CSS:&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt;"&gt;&lt;span style="font-size:9;"&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;body { color: blue }&lt;br /&gt;h2 { color: red } &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Ahora el código html de la página:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:9;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: italic;"&gt;&amp;lt;h1&amp;gt;Esto es un elemento h1&amp;lt;/h1&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&amp;lt;p&amp;gt;Este es un párrafo&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&amp;lt;h2&amp;gt;Esto es h2&amp;lt;/h2&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&amp;lt;p&amp;gt;Más texto marcado como párrafo&amp;lt;/p&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&amp;lt;h3&amp;gt;Esto es h3&amp;lt;/h3&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&amp;lt;ul&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&amp;lt;li&amp;gt;Item 1&amp;lt;/li&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&amp;lt;li&amp;gt;Item 2&amp;lt;/li&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&amp;lt;li&amp;gt;Item 3&amp;lt;/li&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&amp;lt;/ul&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&amp;lt;p&amp;gt;Apuesto a que todo es azul en esta página menos uno de los elementos&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_8AfDk4OYg00/Sqg2Hs6p_VI/AAAAAAAAARs/AmIPZczIFuU/s1600-h/4.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 215px;" src="http://2.bp.blogspot.com/_8AfDk4OYg00/Sqg2Hs6p_VI/AAAAAAAAARs/AmIPZczIFuU/s400/4.PNG" alt="" id="BLOGGER_PHOTO_ID_5379609260838223186" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6.  Tipos de selectores&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Existen dos grandes categorías de selectores:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Elementos: son los nombres correspondientes a elementos del lenguaje (X)HTML como body, h1, p, table, etc.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Nombres propios: son nombres que puede crear el autor de la hoja de estilo. De esta clase de selectores, existen, a su vez dos tipo: de clase (class) y de identidad (id). Por tanto, en realidad tenemos en total tres tipos de selectores que examinaremos a continuación.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;6.1. Selectores de elemento&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Se declaran utilizando como selector un elemento (X)HTML, p.e.:&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt;"&gt;&lt;span style="font-size:9;"&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;h1 { color: blue } &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;De este modo, el aspecto de todos y cada uno de los elementos que forman el lenguaje (X)HTML puede ser modificado mediante un regla. Cabe recordar que los navegadores disponen de una hoja de estilo interna que es la que otorga formato a los elementos (X)HTML cuando no hay ninguna hoja de estilo específica. Por ejemplo, aún sin hoja de estilo la mayor parte de los navegadores aplican negrita a los elementos marcados como strong, así como un tipo de letra superior + negrita a los elementosmarcados con h1, etc.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6.2. Selectores de clase&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Estos selectores se declaran mediante  una palabra propia que asigna el autor de la hoja de estilo. Esta palabra va precedida por un punto.  Por ejemplo: supongamos que se necesita una clase de selectores para formatear títulos de películas (pongamos que se trata de una web sobre cinema). El autor de la hoja de estilo puede crear el selector con el nombre  tituloFilm para formatear de la misma forma los títulos de los films. Para ello, escribe esta regla:&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt;"&gt;&lt;span style="font-size:9;"&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;.tituloFilm  { font-size: 1.5em; font-family: Times New Roman; color: blue;} &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Se aplica mediante el atributo class  seguido por el nombre del selector (sin el punto). Por ejemplo, en el siguiente código fuente solo a uno de los dos elementos de párrafo (p) se le ha añadido esta clase de selector:&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt;"&gt;&lt;span style="font-size:8;"&gt; &lt;span style="font-style: italic;font-size:100%;" &gt;&amp;lt;p class="tituloFilm"&amp;gt;2001: Una odisea del espacio&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;La obra de Kubrick marcó un punto de inflexión en el género de la ciencia-ficción&amp;lt;/p&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt; La declaración solamente afectará a uno de ellos y el resultado es que el primer párrafo tendrá un aspecto muy distinto de los demás:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/Sqg2H4e56aI/AAAAAAAAAR0/1WVhb6gL-_s/s1600-h/5.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 62px;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/Sqg2H4e56aI/AAAAAAAAAR0/1WVhb6gL-_s/s400/5.PNG" alt="" id="BLOGGER_PHOTO_ID_5379609263943051682" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6.3. Selectores de identidad&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Los selectores de identidad se nombran mediante  una palabra propia precedida por el símbolo # (almohadilla). Por ejemplo:&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 72pt;"&gt;&lt;span style="font-size:9;"&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;#navegacion { background-color: LightGrey; } &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Los selectores de identidad solo se pueden aplicar a un elemento en cada página. Dicho al revés, y tomando el ejemplo anterior: en cada página solamente puede haber un elemento #navegacion (en cambio, podemos tener múltiples elementos de clase en una misma página).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;En este caso, hemos supuesto que queremos dar un estilo propio a la zona de navegación de cada página.  Se supone que deseamos destacar la barra de navegación mediante un fondo gris y queremos que la fuente del texto en esa zona sea un poco más pequeña. La declaración sería la siguiente:&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt;"&gt;&lt;span style="font-size:9;"&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;#navegacion { background-color: LightGrey; font-size: 0.8em } &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;El código fuente en la página sería el siguiente:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:9;"&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;&amp;lt;div id="navegacion"&amp;gt;&lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;&amp;lt;a href="item1.htm"&amp;gt;Item 1&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;&amp;lt;a href="item2.htm"&amp;gt;Item 2&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;&amp;lt;a href="item3.htm"&amp;gt;Item 3&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Se supone que Item 1, Item 2, etc., son opciones de menú. El resultado sería este: &lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_8AfDk4OYg00/Sqg3EsE1GlI/AAAAAAAAAR8/3gMIWCVgVyE/s1600-h/6.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 37px;" src="http://2.bp.blogspot.com/_8AfDk4OYg00/Sqg3EsE1GlI/AAAAAAAAAR8/3gMIWCVgVyE/s400/6.PNG" alt="" id="BLOGGER_PHOTO_ID_5379610308584479314" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;7.  Uso de div y span&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; El lenguaje (X)HTML dispone de dos elementos con gran potencialidad cuando se utilizan junto con las hojas de estilo, y cuya característica principal, a diferencia de elementos como body, p, h1, etc., es que no poseen ningún significado intrínseco. Son los siguientes:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;div&lt;br /&gt;&lt;/li&gt;&lt;li&gt;span&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Mientras el elemento div es de bloque, el elemento span es de línea. Recordemos que los elementos de bloque tienen un salto de línea integrado.  El ejemplo más conocido es p. Un elemento de línea, por el contrario no genera ningún espacio a su alrededor, sino que se mantienen en la misma línea que lo contiene. Un buen ejemplo puede ser strong.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Tanto div como span pueden utilizarse para mejorar la apariencia de una página, pero además contribuyen a añadir valor semántico a la misma.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;7.1. div&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;En concreto, div ayuda a crear la estructurar básica de la página. Por ejemplo, podemos imaginar un sitio web cuyas páginas se estructuran en tres grandes secciones, como muestra la figura siguiente:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_8AfDk4OYg00/Sqg3EwQXFWI/AAAAAAAAASE/7TF5jQ0okkU/s1600-h/7.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 258px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/Sqg3EwQXFWI/AAAAAAAAASE/7TF5jQ0okkU/s400/7.PNG" alt="" id="BLOGGER_PHOTO_ID_5379610309706585442" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Con una estructura como la anterior, el código fuente de cada página puede contener cuatro elementos div, cada uno de ellos identificado con un&lt;br /&gt;&lt;/p&gt;&lt;p&gt;atributo id diferente, de este modo:&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt;"&gt;&lt;span style="font-size:9;"&gt; &lt;span style="font-style: italic;font-size:100%;" &gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div id="tituloPag"&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id="navegacion"&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id="contenido"&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id="piePag"&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;La estructuración anterior permitirá definir estilos para las cuatro secciones de la página sin perjuicio de aplicar estilos más específicos mediante selectores de elemento, de clase, etc. Esta estructuración facilitará el mantenimiento de los estilos del sitio y, en caso necesario, el posicionamiento de los mismos en la página.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;7.2. span&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;El elemento span suele utilizarse también combinado con id o con class para especificar con tanto nivel de detalle el aspecto de cualquier elemento de la página.  Por ejemplo, podemos desear marcar y tratar de forma distinta el apellido de una lista de nombres, para lo cual podemos usar span de este modo. Definimos un selector de clase apellido para el cual declaramos un estilo:&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt;"&gt;&lt;span style="font-size:9;"&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;.apellido { font-style: italic; font-weight: bold } &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Aplicamos entonces span y class a los componentes (li) de la siguiente lista:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:9;"&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;&amp;lt;h1&amp;gt;Realizadores de los años 90&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;Martin &amp;lt;span class="apellido"&amp;gt;Escorsese&amp;lt;/span&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;James &amp;lt;span class="apellido"&amp;gt;Cameron&amp;lt;/span&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;Pedro &amp;lt;span class="apellido"&amp;gt;Almodóvar&amp;lt;/span&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;El resultado en el navegador será el siguiente:&lt;br /&gt;&lt;/p&gt;&lt;span xmlns=""&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8AfDk4OYg00/Sqg3FZ1MRqI/AAAAAAAAASM/k8oyzcZnDlQ/s1600-h/8.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 102px;" src="http://4.bp.blogspot.com/_8AfDk4OYg00/Sqg3FZ1MRqI/AAAAAAAAASM/k8oyzcZnDlQ/s400/8.PNG" alt="" id="BLOGGER_PHOTO_ID_5379610320866920098" border="0" /&gt;&lt;/a&gt;&lt;strong&gt;8.  Posicionamiento&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Las hojas de estilo proporcionan propiedades que permiten posicionar de forma fija, absoluta o relativa (fixed, absolute, relative) las cajas en una página web. Estas propiedades, junto con los selectores de clase y de identidad que permiten identificar y clasificar las cajas respectivamente, proporcionan al diseñador un dominio total de la estructura de la página sin necesidad de recurrir, por ejemplo, al uso de tablas.&lt;br /&gt;&lt;/p&gt;&lt;p&gt; A título ilustrativo, mostramos un ejemplo típico de código de estilo con indicaciones de posicionamiento:&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt; font-style: italic;"&gt;&lt;span style="font-size:100%;"&gt;#navegacion { position: absolute; top: 0; left: 0; width: 30%; }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt;"&gt;&lt;span style="font-size:9;"&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;#contenido { width: 70%; margin-left: 30%; } &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;El código anterior generaría dos secciones como las que muestra la figura siguiente:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt; Lo cierto es que el posicionamiento mediante CSS merece un capítulo aparte y por ello escapa a los objetivos de esta presentación. Pero no hemos querido dejar de señalar su importancia con el fin de animar a todo aquel que, precisamente, quiera avanzar en estos temas.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:16;"&gt;&lt;strong&gt;Buenas prácticas&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;1.  Declarar la hoja de estilo en un archivo separado (mejor que en la hoja de estilo, salvo necesidad específica).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2.  Utilizar medidas relativas (tanto por ciento en lugar de píxeles, o unidades em en lugar de puntos, etc.).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3.  Usar elementos semánticos (h1, h2, blockquote, etc.) para organizar los contenidos de la página, no para conseguir una determinada apariencia de la misma.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;4.  Modificar la apariencia de la página exclusivamente mediante estilos (y no con elementos o atributos desaconsejados como font, center, etc. o usando elementos fuera de lugar).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;5.  Limitar al máximo declarar estilos dentro de elementos individuales (es decir, evitar el uso del atributo style dentro de elementos).&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-5771919914131472886?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/5771919914131472886/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/09/tutorial-basico-de-css.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/5771919914131472886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/5771919914131472886'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/09/tutorial-basico-de-css.html' title='Conceptos Básicos de CSS'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_8AfDk4OYg00/Sqg2GdlyWyI/AAAAAAAAARU/HyeBXlpnnN0/s72-c/1.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-7376364119516714735</id><published>2009-09-09T08:23:00.008-04:30</published><updated>2009-09-11T09:56:32.273-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><title type='text'>Como definir una propiedad en flex actionscript</title><content type='html'>&lt;ol&gt;&lt;li&gt;En este artículo vamos a ver como definir una propiedad en flex, pero primero debemos conocer ¿qué es una propiedad?.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Una propiedad es una variable que define a una clase, es decir, son variables que se definen al momento de crear una clase para que formen parte de esta, por ejemplo:  Si definimos la clase Mesa probablemente le definamos las propiedades altura, anchura, profundidad, etc.&lt;br /&gt;&lt;br /&gt;Este concepto se aplica a todos los lenguajes de programación orientada a objetos, vamos a ver como sería la definición de esta clase ejemplo en actionscript:&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt; public class Mesa&lt;br /&gt; {&lt;br /&gt;  public function Mesa()&lt;br /&gt;  {&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public var profundidad: String;&lt;br /&gt;  public var altura : Number;&lt;br /&gt;  public var anchura : Number;&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Otra cosa que debemos saber es la utilizacion de los metodos get y set para tener mucho mas control sobre las propiedades de una clase.&lt;br /&gt;&lt;br /&gt;¿Qué son los metodos get y set?&lt;br /&gt;En el lenguaje de la programacion orientada a objetos se estila mucho la utilización de metodos que te permitan asignar y obtener valores a las propiedades, para explicar mejor les explico implementando los metodos get y set para la clase mesa:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt; public class Mesa&lt;br /&gt; {&lt;br /&gt;  public function Mesa()&lt;br /&gt;  {&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private var _color : String;&lt;br /&gt;  private var _altura : Number;&lt;br /&gt;  private var _anchura : Number;&lt;br /&gt;  &lt;br /&gt;  public function get color() : String&lt;br /&gt;  {&lt;br /&gt;   return this._color;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public function set color(value : String) : void&lt;br /&gt;  {&lt;br /&gt;   this._color = value;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public function get altura() : String&lt;br /&gt;  {&lt;br /&gt;   return this._altura;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public function set altura(value : String) : void&lt;br /&gt;  {&lt;br /&gt;   this._altura = value;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public function get anchura() : Number&lt;br /&gt;  {&lt;br /&gt;   return this._anchura;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public function set anchura(value : String) : void&lt;br /&gt;  {&lt;br /&gt;   this._anchura = value;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;¿Qué ventajas tiene utilizar los métodos get set?&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Puedo controlar el acceso a las variables de la clase, por ejemplo pudiera no definir un metodo "set" para una de las variables y de esta manera cualquier instancia de este tipo de clase tendria esa variable de solo lectura.&lt;/li&gt;&lt;li&gt;Puedo colocar propiedades calculadas, por ejemplo cuando en un arreglo hacemos arreglo.length, a nosotros nos devuelve el numero de elementos del arreglo pero en realidad lo que hace la clase es recorrer todos los items y los cuenta para luego decirnos cuantos fueron. En esta clase Mesa un ejemplo de propuedad calculada seria la propiedad "volumen", que viene siendo la multiplicacion de ancho * alto * profundidad.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Puedo realizar acciones cuando cambie la propiedad. Como la unica manera de modificar el varlor de esta variable es a través del metodo set, entonces puedo contruir el metodo con sentencias  extra o validaciones antes de asignar el valor recibido a la variable, por ejemplo:&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;  public function set altura(value : String) : void&lt;br /&gt;  {&lt;br /&gt;   if(value&gt;0)&lt;br /&gt;    this._altura = value;&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;En este caso solo asignamos el valor introducido por el usuairo a esta varible, en el caso en que sea mayor a cero, despues de todo, una altura no puede ser menor que 0, ya que sino la mesa no se visualizaria.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-7376364119516714735?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/7376364119516714735/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/09/como-definir-una-propiedad-en-flexbb.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/7376364119516714735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/7376364119516714735'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/09/como-definir-una-propiedad-en-flexbb.html' title='Como definir una propiedad en flex actionscript'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-6746670323748702665</id><published>2009-07-12T18:01:00.013-04:30</published><updated>2010-08-03T23:58:23.870-04:30</updated><title type='text'>Como hacer la pagina web perfecta</title><content type='html'>&lt;style&gt; v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} &lt;/style&gt; &lt;!--[endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:trackmoves&gt;false&lt;/w:TrackMoves&gt;   &lt;w:trackformatting/&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:donotpromoteqf/&gt;   &lt;w:lidthemeother&gt;EN-US&lt;/w:LidThemeOther&gt;   &lt;w:lidthemeasian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:lidthemecomplexscript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:splitpgbreakandparamark/&gt;    &lt;w:dontvertaligncellwithsp/&gt;    &lt;w:dontbreakconstrainedforcedtables/&gt;    &lt;w:dontvertalignintxbx/&gt;    &lt;w:word11kerningpairs/&gt;    &lt;w:cachedcolbalance/&gt;   &lt;/w:Compatibility&gt;   &lt;m:mathpr&gt;    &lt;m:mathfont val="Cambria Math"&gt;    &lt;m:brkbin val="before"&gt;    &lt;m:brkbinsub val="&amp;#45;-"&gt;    &lt;m:smallfrac val="off"&gt;    &lt;m:dispdef/&gt;    &lt;m:lmargin val="0"&gt;    &lt;m:rmargin val="0"&gt;    &lt;m:defjc val="centerGroup"&gt;    &lt;m:wrapindent val="1440"&gt;    &lt;m:intlim val="subSup"&gt;    &lt;m:narylim val="undOvr"&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"&gt;   &lt;w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"&gt;   &lt;w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 1"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 2"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 3"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 4"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 5"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 6"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 7"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 8"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 9"&gt;   &lt;w:lsdexception locked="false" priority="35" qformat="true" name="caption"&gt;   &lt;w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"&gt;   &lt;w:lsdexception locked="false" priority="1" name="Default Paragraph Font"&gt;   &lt;w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"&gt;   &lt;w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"&gt;   &lt;w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"&gt;   &lt;w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Revision"&gt;   &lt;w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"&gt;   &lt;w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"&gt;   &lt;w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"&gt;   &lt;w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"&gt;   &lt;w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"&gt;   &lt;w:lsdexception locked="false" priority="37" name="Bibliography"&gt;   &lt;w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Font Definitions */  @font-face  {font-family:Wingdings;  panose-1:5 0 0 0 0 0 0 0 0 0;  mso-font-charset:2;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face  {font-family:"Cambria Math";  panose-1:2 4 5 3 5 4 6 3 2 4;  mso-font-charset:1;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:variable;  mso-font-signature:0 0 0 0 0 0;} @font-face  {font-family:Calibri;  panose-1:2 15 5 2 2 2 4 3 2 4;  mso-font-charset:0;  mso-generic-font-family:swiss;  mso-font-pitch:variable;  mso-font-signature:-1610611985 1073750139 0 0 159 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-parent:"";  margin-top:0in;  margin-right:0in;  margin-bottom:10.0pt;  margin-left:0in;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  margin-top:0in;  margin-right:0in;  margin-bottom:10.0pt;  margin-left:.5in;  mso-add-space:auto;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0in;  margin-right:0in;  margin-bottom:0in;  margin-left:.5in;  margin-bottom:.0001pt;  mso-add-space:auto;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0in;  margin-right:0in;  margin-bottom:0in;  margin-left:.5in;  margin-bottom:.0001pt;  mso-add-space:auto;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0in;  margin-right:0in;  margin-bottom:10.0pt;  margin-left:.5in;  mso-add-space:auto;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} .MsoChpDefault  {mso-style-type:export-only;  mso-default-props:yes;  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} .MsoPapDefault  {mso-style-type:export-only;  margin-bottom:10.0pt;  line-height:115%;} @page Section1  {size:8.5in 11.0in;  margin:1.0in 1.0in 1.0in 1.0in;  mso-header-margin:35.4pt;  mso-footer-margin:35.4pt;  mso-paper-source:0;} div.Section1  {page:Section1;}  /* List Definitions */  @list l0  {mso-list-id:690767173;  mso-list-type:hybrid;  mso-list-template-ids:607409016 281313448 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1  {mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-.25in;} @list l0:level2  {mso-level-number-format:alpha-lower;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-.25in;} @list l1  {mso-list-id:1192494811;  mso-list-type:hybrid;  mso-list-template-ids:104623368 483525440 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;} @list l1:level1  {mso-level-start-at:0;  mso-level-number-format:bullet;  mso-level-text:-;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-.25in;  font-family:"Calibri","sans-serif";  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} @list l2  {mso-list-id:1880513535;  mso-list-type:hybrid;  mso-list-template-ids:-1151434424 67698707 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l2:level1  {mso-level-number-format:roman-upper;  mso-level-tab-stop:none;  mso-level-number-position:right;  text-indent:-.25in;} ol  {margin-bottom:0in;} ul  {margin-bottom:0in;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Tabla normal";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-priority:99;  mso-style-qformat:yes;  mso-style-parent:"";  mso-padding-alt:0in 5.4pt 0in 5.4pt;  mso-para-margin-top:0in;  mso-para-margin-right:0in;  mso-para-margin-bottom:10.0pt;  mso-para-margin-left:0in;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;} &lt;/style&gt; &lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;o:shapedefaults ext="edit" spidmax="1027"&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;o:shapelayout ext="edit"&gt;   &lt;o:idmap ext="edit" data="1"&gt;  &lt;/o:shapelayout&gt;&lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} &lt;/style&gt; &lt;!--[endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:trackmoves&gt;false&lt;/w:TrackMoves&gt;   &lt;w:trackformatting/&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:donotpromoteqf/&gt;   &lt;w:lidthemeother&gt;EN-US&lt;/w:LidThemeOther&gt;   &lt;w:lidthemeasian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:lidthemecomplexscript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:splitpgbreakandparamark/&gt;    &lt;w:dontvertaligncellwithsp/&gt;    &lt;w:dontbreakconstrainedforcedtables/&gt;    &lt;w:dontvertalignintxbx/&gt;    &lt;w:word11kerningpairs/&gt;    &lt;w:cachedcolbalance/&gt;   &lt;/w:Compatibility&gt;   &lt;m:mathpr&gt;    &lt;m:mathfont val="Cambria Math"&gt;    &lt;m:brkbin val="before"&gt;    &lt;m:brkbinsub val="&amp;#45;-"&gt;    &lt;m:smallfrac val="off"&gt;    &lt;m:dispdef/&gt;    &lt;m:lmargin val="0"&gt;    &lt;m:rmargin val="0"&gt;    &lt;m:defjc val="centerGroup"&gt;    &lt;m:wrapindent val="1440"&gt;    &lt;m:intlim val="subSup"&gt;    &lt;m:narylim val="undOvr"&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"&gt;   &lt;w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"&gt;   &lt;w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 1"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 2"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 3"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 4"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 5"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 6"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 7"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 8"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 9"&gt;   &lt;w:lsdexception locked="false" priority="35" qformat="true" name="caption"&gt;   &lt;w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"&gt;   &lt;w:lsdexception locked="false" priority="1" name="Default Paragraph Font"&gt;   &lt;w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"&gt;   &lt;w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"&gt;   &lt;w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"&gt;   &lt;w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Revision"&gt;   &lt;w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"&gt;   &lt;w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"&gt;   &lt;w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"&gt;   &lt;w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"&gt;   &lt;w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"&gt;   &lt;w:lsdexception locked="false" priority="37" name="Bibliography"&gt;   &lt;w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Font Definitions */  @font-face  {font-family:Wingdings;  panose-1:5 0 0 0 0 0 0 0 0 0;  mso-font-charset:2;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face  {font-family:"Cambria Math";  panose-1:2 4 5 3 5 4 6 3 2 4;  mso-font-charset:1;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:variable;  mso-font-signature:0 0 0 0 0 0;} @font-face  {font-family:Calibri;  panose-1:2 15 5 2 2 2 4 3 2 4;  mso-font-charset:0;  mso-generic-font-family:swiss;  mso-font-pitch:variable;  mso-font-signature:-1610611985 1073750139 0 0 159 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-parent:"";  margin-top:0in;  margin-right:0in;  margin-bottom:10.0pt;  margin-left:0in;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  margin-top:0in;  margin-right:0in;  margin-bottom:10.0pt;  margin-left:.5in;  mso-add-space:auto;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0in;  margin-right:0in;  margin-bottom:0in;  margin-left:.5in;  margin-bottom:.0001pt;  mso-add-space:auto;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0in;  margin-right:0in;  margin-bottom:0in;  margin-left:.5in;  margin-bottom:.0001pt;  mso-add-space:auto;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0in;  margin-right:0in;  margin-bottom:10.0pt;  margin-left:.5in;  mso-add-space:auto;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} .MsoChpDefault  {mso-style-type:export-only;  mso-default-props:yes;  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} .MsoPapDefault  {mso-style-type:export-only;  margin-bottom:10.0pt;  line-height:115%;} @page Section1  {size:8.5in 11.0in;  margin:1.0in 1.0in 1.0in 1.0in;  mso-header-margin:35.4pt;  mso-footer-margin:35.4pt;  mso-paper-source:0;} div.Section1  {page:Section1;}  /* List Definitions */  @list l0  {mso-list-id:690767173;  mso-list-type:hybrid;  mso-list-template-ids:607409016 281313448 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1  {mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-.25in;} @list l0:level2  {mso-level-number-format:alpha-lower;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-.25in;} @list l1  {mso-list-id:1192494811;  mso-list-type:hybrid;  mso-list-template-ids:104623368 483525440 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;} @list l1:level1  {mso-level-start-at:0;  mso-level-number-format:bullet;  mso-level-text:-;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-.25in;  font-family:"Calibri","sans-serif";  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} @list l2  {mso-list-id:1880513535;  mso-list-type:hybrid;  mso-list-template-ids:-1151434424 67698707 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l2:level1  {mso-level-number-format:roman-upper;  mso-level-tab-stop:none;  mso-level-number-position:right;  text-indent:-.25in;} ol  {margin-bottom:0in;} ul  {margin-bottom:0in;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Tabla normal";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-priority:99;  mso-style-qformat:yes;  mso-style-parent:"";  mso-padding-alt:0in 5.4pt 0in 5.4pt;  mso-para-margin-top:0in;  mso-para-margin-right:0in;  mso-para-margin-bottom:10.0pt;  mso-para-margin-left:0in;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;} &lt;/style&gt; &lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;o:shapedefaults ext="edit" spidmax="1027"&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;o:shapelayout ext="edit"&gt;   &lt;o:idmap ext="edit" data="1"&gt;  &lt;/o:shapelayout&gt;&lt;/xml&gt;&lt;![endif]--&gt;&lt;span style="" lang="ES-VE"&gt;&lt;span style="font-size:85%;"&gt;En esta oportunidad quiero explicar varios conceptios mientras desarrollo una aplicación para la creacion de encuestas o examenes en linea. En cada tutorial separado explicare más detalladamente cada uno de los puntos de esta entrada, ¿Que vamos a aprender mientras creamos esta aplicación? Muy interesante, voy a enseñarles todo lo que yo utilizo a la hora de crear una página web, las mejores prácticas a mi humilde criterio&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;A la hora de crear la página vamos a tener las siguientes premisas fundamentales:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="" lang="ES-VE"&gt;&lt;span style=""&gt;-&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;Pensar todo el tiempo en el usuario:&lt;/span&gt;&lt;/b&gt;&lt;span style="" lang="ES-VE"&gt; Vamos a evitar cualquier actividad extra para el usuario, crear ayudas en todo momento, prevenir en lugar de corregir, darle velocidad a la pagina, interfaz minimalista, etc.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="" lang="ES-VE"&gt;&lt;span style=""&gt;-&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;La simplicidad no tiene nada que ver con el tamaño:&lt;/span&gt;&lt;/b&gt;&lt;span style="" lang="ES-VE"&gt; Tú puedes tener la página más grande del mundo pero que siga siendo muy simple desde todo punto de vista (arquitectura, organización, usabilidad, etc.)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="" lang="ES-VE"&gt;&lt;span style=""&gt;-&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;Estandarizar los procesos:&lt;/span&gt;&lt;/b&gt;&lt;span style="" lang="ES-VE"&gt; Hay actividades que son muy repetitivas, hay que tratar de estandarizarlas o incluso tratar de automatizarlas para que cada vez se hagan mas rápido y sin errores.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="" lang="ES-VE"&gt;&lt;span style=""&gt;-&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;Patrones de diseño:&lt;/span&gt;&lt;/b&gt;&lt;span style="" lang="ES-VE"&gt; Todos los problemas que se nos puedan presentar a la hora de crear una página web ¡ya se le presentaron a otra persona!, busca en internet, utiliza los patrones de diseño, tal vez trabajemos mas al principio pero luego estaremos volando y sin equivocaciones.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;p class="MsoListParagraph" style="text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;&lt;span style=""&gt;1.&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;!--[endif]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;¿Cómo diseñar una página con maquetación CSS?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;Primero vamos a maquetar la pagina en contenedores &lt;/span&gt;&lt;/p&gt;&lt;div&gt; para utilizar estándares de CSS, así vamos a poder diseñar una página pensando en la información y el contenido y luego le daremos un diseño creando hojas de estilos que tendrán clases que se les aplicaran a los contenedores que definimos, algo así:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;  &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8AfDk4OYg00/SlpnUgb9kOI/AAAAAAAAAQk/ZQ-nMJnASmM/s1600-h/1.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 362px; height: 182px;" src="http://4.bp.blogspot.com/_8AfDk4OYg00/SlpnUgb9kOI/AAAAAAAAAQk/ZQ-nMJnASmM/s400/1.JPG" alt="" id="BLOGGER_PHOTO_ID_5357708308712886498" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;Fíjense que la pagina web HTML solo contiene contenedores de información que no tienen ningún diseño (la cabecera de la pagina, el contenido y el pie de la pagina), cuando se le aplica la capa de la derecha (la hoja de estilos) los contenedores cambian de color, tipo de letra, color de letra, sangrías para el texto, etc. Cuando nosotros queramos podemos cambiar la hoja de estilos y nuestra aplicación se verá muy diferente pero seguirá teniendo la misma estructura e información.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;&lt;span style=""&gt;2.&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;!--[endif]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;¿Cómo utilizar plantillas para poder compartir la misma cabecera, menú y pie en todas las paginas sin tener que copiar y pegar el código?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="Object_x0020_2" spid="_x0000_s1026" type="#_x0000_t75" style="'position:absolute;margin-left:1.45pt;margin-top:1.25pt;" wrapcoords="0 0 353 21088 21308 21088 21661 20765 21661 5191 21308 323 21308 0 0 0" gfxdata="UEsDBBQABgAIAAAAIQC75UiUBQEAAB4CAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbKSRvU7DMBSF dyTewfKKEqcMCKEmHfgZgaE8wMW+SSwc27JvS/v23KTJgkoXFsu+P+c7Ol5vDoMTe0zZBl/LVVlJ gV4HY31Xy4/tS3EvRSbwBlzwWMsjZrlprq/W22PELHjb51r2RPFBqax7HCCXIaLnThvSAMTP1KkI +gs6VLdVdad08ISeCho1ZLN+whZ2jsTzgcsnJwldluLxNDiyagkxOquB2Knae/OLUsyEkjenmdzb mG/YhlRnCWPnb8C898bRJGtQvEOiVxjYhtLOxs8AySiT4JuDystlVV4WPeM6tK3VaILeDZxIOSsu ti/jidNGNZ3/J08yC1dNv9v8AAAA//8DAFBLAwQUAAYACAAAACEArTA/8cEAAAAyAQAACwAAAF9y ZWxzLy5yZWxzhI/NCsIwEITvgu8Q9m7TehCRpr2I4FX0AdZk2wbbJGTj39ubi6AgeJtl2G9m6vYx jeJGka13CqqiBEFOe2Ndr+B03C3WIDihMzh6RwqexNA281l9oBFTfuLBBhaZ4ljBkFLYSMl6oAm5 8IFcdjofJ0z5jL0MqC/Yk1yW5UrGTwY0X0yxNwri3lQgjs+Qk/+zfddZTVuvrxO59CNCmoj3vCwj MfaUFOjRhrPHaN4Wv0VV5OYgm1p+LW1eAAAA//8DAFBLAwQUAAYACAAAACEABIUMyXIHAAAyRQAA HwAAAGNsaXBib2FyZC9kcmF3aW5ncy9kcmF3aW5nMS54bWzsm01v2zgQhu8L7H8QdF2ktj5sKUad AvU2vQRbI273zlKULYSiBJJxnf31O0NSluPGUds02y7KSyKFw+HwFSnP42FevtrVPNgyqapGzMPo xTgMmKBNUYn1PPzw/vIsDwOliSgIbwSbh3dMha8ufv/tJZmtJWk3FQ3Ag1AzMg83Wrez0UjRDauJ etG0TEBb2ciaaLiV61EhySfwXPNRPB5PRzWpRHjRu/qTaBLcyuobXPGG3rBiQcSWKHDJ6ezwLy5G Tp/umczE9q1sV+1SYuT0r+1SBlUxD0E5QWqQKBy5BmcGt6OjXuvewa6UNdo3ZRnsjJc7/Gl8sJ0O KPwxyidZksOToNAWj7MoG8dulM07228yBkFjMAGLJEqTOM07izcDXiA4GwRcHASmWgxLbD+faRp1 U71mFNbGmrMgdSGDHtihm3PXWTm5jmZ7Muqhme9jJrNWKv2WNXWAF/NQQkhmTZHtldI2js7EPIgu FL1bmRnq3eumuMO5foTf8DCl5ouGm0dBBN00ch7qMLCXCw13bqpc6ZW+4wy7Fqxc2gUBV9fghIMs 85CJsw8rfA4Qb2/CtzwCPYKayCs7DF/D5uNhADbvycfVP/PwPErTMSwpCMaYMHIlXssbWAsh+NaV cLdgsoGhYFMtbwWF+Udm8i4KBZ6iHP3cMIn7G7adaVcNr4rLinMM3mxYtuAy2BIYjevIhXzPyowa 6LuWlYTCMv+jFmdc20XGyFEDI7aBqqMGqno5QCejjNMDQ4HLuJcmnWQYcEB+eX1QFKdP0uvTLRKv D4ri9El7faIki6Z+AeGuQlWcQJMDgfI4N68Hv4JQFSfQtBcojnNYQP4VBCsIVXECZQcCZZBreIFw i6EqTqC8FwjVMZ/kfouhKk6g8wOBppPMv6RN6oOq2IzoILU0SSrKZRcQ1dKmVkZK2aea6uzvN5BB VlIbgAhUrRecEcj6XL6qLzSrW0jjGKaj2gxknDBRLIkkx2lr78tl0aZHny7fKrZqkQBsc5dPqy4n 5uKalYBGCDAhPvejPJNQysQ+1zTWaFVCVrrvmAx3dPbYlZUlhLPvHA933vcwIzei71xXopEPOejT 49LaG1ncrEFYy02P0FPW0dMlbz7RDZF6FixlQ5lSQTp1efPXYRQA32ScWvgDpkoTB397jJpAIpRM HUACTU4MP56mqBJCW2BoLjAjxPckqv0y9hTlKeqARZ+VMj1FOW4/QeGeorovNk4I5ClqQCBPUQMC eYoaEMhT1IBAnqIGBHpuitowUjD5nzPUozRj8GoDcdmv8LGuYqgPeQTLcfjtviVLhLLPMOsL+Ow0 ZrmKQjeMjeA+3P0IzIJamK3HPYRZ2VMxK83yaRK7KpzHLF+sCn2xyr5gbAUPXzHwnagvVhlRbDm2 08dj1sAnuMesAYE8Zg0I5DFrQCCPWQMCecwaEOi5MatsGu0xqy9I/aSYdf4YZnVnEL+9mgW1KjzW CCVGKO+5g4wJVLPO4UwGnoaE9nhiima+mOWPBP5KRyZ9McsXs+4dxv3aM7eesgYyHE9ZAwJ5yhoQ yFPWgECesgYE+g6UZf4JxGRGjx4OrJm4/cKi1gMen3xE8P9e3voXAAD//+yXTXPaMBCG/4pG104m 2NjgMDGH0KaXTIcJTe8bWQZPZJmRFAr99d2VhE2YaU+91ReQ8erV7qMPXgn3LOvlPSzqTlOTNdWx 5G2jO8PpZyt2spUrZdgBVMmVS/jt8v62j/dt605Khtbed/Kf+rDZrw09i2+HtUHlkucTzjS0suSP qvspdmDcgq1NJ6S1LLsjbR9OPcM4g4qNasfatBTW1TXDXPN8nibTlLNTyadFPp+lRZCRR8cEBiRJ Np1MCs4ERmBAms9iDWelvbHuq+xaRo2S15jailKLiXkQcHiyLqR0Do8VhxrdceOrdseHrjpRfq/4 jWUbp1YdosPKQYtdZ0ounAkpKus2gR0sKlmvgxS2nrGjAr0tudQ3L5uY7xCiDipBHKwF8xSk1Vbj 9HCGMd/hdfOr5HdJlk1wVEzAh0h40g/mDYFw1HaNjo8YssOhGr1dv2uB9Se+4JiFRaWkIJ03aXCI JMU2lWc71VSPjVL+4U/L5EOUH5W5017WIHANfGr1jXJxtuDqhYTwQtirF8IOOJCTn4XIg1LBZjqg yXC+KXn47/kQlMhnOvA5L5KRD0GJfLKBTzKdJ7NxAdGuIioRUH4BqEgLfzyMK4ioRECzAVCaFriA xiMIVxBRiYDmF4Dm2XQ8o/0fF1GJgIoBENHx/+TjFiMqEdDdBaAZ2r5xi9EhTVSCI7qwlt6YEq6w gHr76VGawWramx9f0EE2xqFTxhPLtm6lJKDrmwQv5pYCrwlSO7oBOD+O15C6WoOBa9c6SEXj7HsM Dvndys3+WYroq88WOl4ncEfo/kaScpr2q9sICIG5BLtqd1DJcEnJ8bj1CWOSfY8AhQRJqEbf2mtH gY8W9qwdMo/x1FXWNWbcd45m+G+d+x5+5H92z7pVYqE68SarFegDWF/h1sB+14jP4ODyefkbAAD/ /wMAUEsDBBQABgAIAAAAIQDhUTcfzwYAAOYbAAAaAAAAY2xpcGJvYXJkL3RoZW1lL3RoZW1lMS54 bWzsWc1v3EQUvyPxP4x8b7PfzUbdVNnNbgNt2ijZFvU4a8/a04w91sxs0r2h9oiEhCiIA5W4cUBA pVbiUv6aQBEUqf8Cb2ZsryfrkLSNoILmkLWff/O+35uvy1fuxQwdECEpT3pe/WLNQyTxeUCTsOfd Go8urHpIKpwEmPGE9Lw5kd6V9fffu4zXfEbTCcciGEckJggYJXIN97xIqXRtZUX6QMbyIk9JAt+m XMRYwasIVwKBD0FAzFYatVpnJcY08daBo9KMhgz+JUpqgs/EnmZDUIJjkH5zOqU+Mdhgv64Rci4H TKADzHoe8Az44ZjcUx5iWCr40PNq5s9bWb+8gteyQUydMLY0bmT+snHZgGC/YWSKcFIIrY9a3Uub BX8DYGoZNxwOB8N6wc8AsO+DpVaXMs/WaLXez3mWQPZxmfeg1q61XHyJf3NJ526/3293M10sUwOy j60l/Gqt09poOHgDsvj2Er7V3xgMOg7egCy+s4QfXep2Wi7egCJGk/0ltA7oaJRxLyBTzrYq4asA X61l8AUKsqHILi1iyhN1Uq7F+C4XIwBoIMOKJkjNUzLFPuTkAMcTQbEWgNcILn2xJF8ukbQsJH1B U9XzPkxx4pUgL599//LZE3R0/+nR/Z+OHjw4uv+jZeSM2sJJWB714tvP/nz0MfrjyTcvHn5RjZdl /K8/fPLLz59XA6F8FuY9//Lxb08fP//q09+/e1gB3xB4UoaPaUwkukEO0S6PwTDjFVdzMhGvNmIc YVoesZGEEidYS6ngP1SRg74xxyyLjqNHn7gevC2gfVQBr87uOgrvRWKmaIXka1HsALc5Z30uKr1w TcsquXk8S8Jq4WJWxu1ifFAle4ATJ77DWQp9M09Lx/BBRBw1dxhOFA5JQhTS3/g+IRXW3aHU8es2 9QWXfKrQHYr6mFa6ZEwnTjYtBm3RGOIyr7IZ4u34Zvs26nNWZfUmOXCRUBWYVSg/Jsxx41U8Uziu YjnGMSs7/DpWUZWSe3Phl3FDqSDSIWEcDQMiZdWYmwLsLQX9GoaOVRn2bTaPXaRQdL+K53XMeRm5 yfcHEY7TKuweTaIy9gO5DymK0Q5XVfBt7laIfoc44OTEcN+mxAn36d3gFg0dlRYJor/MhI4ltGqn A8c0+bt2zCj0Y5sD59eOoQE+//pRRWa9rY14A+akqkrYOtZ+T8Idb7oDLgL69vfcTTxLdgik+fLE 867lvmu53n++5Z5Uz2dttIveCm1XrxvsotgskeMTV8hTytiemjNyXZpFsoR5IhgBUY8zO0FS7JjS CB6zvu7gQoHNGCS4+oiqaC/CKSyw655mEsqMdShRyiVs7Ay5krfGwyJd2W1hW28YbD+QWG3zwJKb mpzvCwo2ZrYJzeYzF9TUDM4qrHkpYwpmv46wulbqzNLqRjXT6hxphckQw2XTgFh4ExYgCJYt4OUO 7MW1aNiYYEYC7Xc79+ZhMVE4zxDJCAcki5G2ezlGdROkPFfMSQDkTkWM9CbvFK+VpHU12zeQdpYg lcW1ThCXR+9NopRn8CJKum6PlSNLysXJEnTY87rtRttDPk573hT2tPAYpxB1qdd8mIVwGuQrYdP+ 1GI2Vb6IZjc3zC2COhxTWL8vGez0gVRItYllZFPDfMpSgCVaktW/0Qa3npcBNtNfQ4vmKiTDv6YF +NENLZlOia/KwS5RtO/sa9ZK+UwRsRcFh2jCZmIXQ/h1qoI9AZVwNGE6gn6BczTtbfPJbc5Z0ZVP rwzO0jFLI5y1W12ieSVbuKnjQgfzVlIPbKvU3Rj36qaYkj8nU8pp/D8zRc8ncFLQDHQEfDiUFRjp eu15XKiIQxdKI+qPBCwcTO+AbIGzWPgMSQUnyOZXkAP9a2vO8jBlDRs+tUtDJCjMRyoShOxAWzLZ dwqzejZ3WZYsY2QyqqSuTK3aE3JA2Fj3wI6e2z0UQaqbbpK1AYM7nn/ue1ZBk1Avcsr15vSQYu61 NfBPr3xsMYNRbh82C5rc/4WKFbOqHW+G53Nv2RD9YbHMauVVAcJKU0E3K/vXVOEVp1rbsZYsbrRz 5SCKyxYDsVgQpXDeg/Q/mP+o8Jm9bdAT6pjvQm9FcNGgmUHaQFZfsAsPpBukJU5g4WSJNpk0K+va bOmkvZZP1ue80i3kHnO21uws8X5FZxeLM1ecU4vn6ezMw46vLe1EV0Nkj5cokKb5RsYEpurWaRun aBLWex7c/ECg78ET3B15QGtoWkPT4AkuhGCxZG9xel72kFPgu6UUmGZOaeaYVk5p5ZR2ToHFWXZf klM60Kn0FQdcsekfD+W3GbCCy24/8qbqXM2t/wUAAP//AwBQSwMEFAAGAAgAAAAhAJxmRkG7AAAA JAEAACoAAABjbGlwYm9hcmQvZHJhd2luZ3MvX3JlbHMvZHJhd2luZzEueG1sLnJlbHOEj80KwjAQ hO+C7xD2btJ6EJEmvYjQq9QHCMk2LTY/JFHs2xvoRUHwsjCz7DezTfuyM3liTJN3HGpaAUGnvJ6c 4XDrL7sjkJSl03L2DjksmKAV201zxVnmcpTGKSRSKC5xGHMOJ8aSGtHKRH1AVzaDj1bmIqNhQaq7 NMj2VXVg8ZMB4otJOs0hdroG0i+hJP9n+2GYFJ69elh0+UcEy6UXFqCMBjMHSldnnTUtXYGJhn39 Jt4AAAD//wMAUEsBAi0AFAAGAAgAAAAhALvlSJQFAQAAHgIAABMAAAAAAAAAAAAAAAAAAAAAAFtD b250ZW50X1R5cGVzXS54bWxQSwECLQAUAAYACAAAACEArTA/8cEAAAAyAQAACwAAAAAAAAAAAAAA AAA2AQAAX3JlbHMvLnJlbHNQSwECLQAUAAYACAAAACEABIUMyXIHAAAyRQAAHwAAAAAAAAAAAAAA AAAgAgAAY2xpcGJvYXJkL2RyYXdpbmdzL2RyYXdpbmcxLnhtbFBLAQItABQABgAIAAAAIQDhUTcf zwYAAOYbAAAaAAAAAAAAAAAAAAAAAM8JAABjbGlwYm9hcmQvdGhlbWUvdGhlbWUxLnhtbFBLAQIt ABQABgAIAAAAIQCcZkZBuwAAACQBAAAqAAAAAAAAAAAAAAAAANYQAABjbGlwYm9hcmQvZHJhd2lu Z3MvX3JlbHMvZHJhd2luZzEueG1sLnJlbHNQSwUGAAAAAAUABQBnAQAA2REAAAAA "&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image003.png" title=""&gt;  &lt;o:lock ext="edit" aspectratio="f"&gt;  &lt;w:wrap type="through"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8AfDk4OYg00/Slpnbget23I/AAAAAAAAAQs/x0rrwKOPJpc/s1600-h/2.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 124px; height: 135px;" src="http://4.bp.blogspot.com/_8AfDk4OYg00/Slpnbget23I/AAAAAAAAAQs/x0rrwKOPJpc/s400/2.JPG" alt="" id="BLOGGER_PHOTO_ID_5357708428983524210" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;span style="" lang="ES-VE"&gt;La idea es crear una archivo “header.php” que será la cabecera de las paginas y lo importaremos cada vez que queramos renderizar o mostrar una página en especifico, de esta manera si realizamos un cambio en esta cabecera no tendremos que ir pagina por pagina realizando el cambio en todas las cabeceras sino que cambiaríamos el archivo header.php y el cambio se reflejaría en todas las paginas. Lo mismo ocurriría en el caso del menú (menu.php) y el pie de la pagina (footer.php).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;&lt;span style=""&gt;3.&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;!--[endif]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;¿Cómo evitar recargar la pagina tan a menudo?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;Con las nuevas tecnologías es posible recargar contenedores específicos de las páginas web en vez de recargar toda la pagina, de esta manera aumentamos mucha facilidad de uso y tiempo de espera. Además recargamos menos al servidor ya que realizamos menos peticiones y por ultimo vamos a ver cómo termina siendo incuso ¡Mucho más fácil que antes! Trabajar de esta manera. Nosotros utilizaremos el framework de javascript llamado JQuery para lograr estas funcionalidades.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;&lt;span style=""&gt;4.&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;!--[endif]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;¿Cómo estructurar nuestra página de una manera sencilla y organizada para que siga siendo simple a pesar de que ser bastante grande?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;Luego de buscar y probar la gran mayoría de los frameworks de desarrollo yo decidí crear mi propia arquitectura para mis páginas web, siguiendo algunos estándares y patrones de diseño pero sin volverla tan compleja y abstracta como me parece que ocurre en el caso de frameworks existentes como symfony.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;&lt;span style=""&gt;5.&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;!--[endif]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;¿Cómo dividir en capas toda la pagina web para lograr la independencia de cada una de ellas?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;En la arquitectura que diseñe la pagina web se divide en 6 capas donde cada una de ellas es completamente independiente, es decir, si quieres cambiar de base de datos solo tienes que cambiar la capa de comandos, si quieres cambiar el diseño de la pagina, solo tienes que cambiar la capa de diseño, etc.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;En mi arquitectura yo planteo las siguientes capas: &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent: -0.5in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="" lang="ES-VE"&gt;&lt;span style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;        &lt;/span&gt;I.&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;            &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="" lang="ES-VE"&gt;Diseño: Renderiza los datos, les da colores, tamaño, etc. Puras hojas de estilo.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.5in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="" lang="ES-VE"&gt;&lt;span style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;      &lt;/span&gt;II.&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;            &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="" lang="ES-VE"&gt;Vista: La estructura de los datos, contiene la información y no contienen prácticamente ninguna lógica.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.5in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="" lang="ES-VE"&gt;&lt;span style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;    &lt;/span&gt;III.&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;            &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="" lang="ES-VE"&gt;Cliente: Creación de componentes DatePicker, Slider, etc. Validaciones, Evitar recargo de la pagina, ayuda de usuario, etc.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.5in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="" lang="ES-VE"&gt;&lt;span style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;    &lt;/span&gt;IV.&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;            &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="" lang="ES-VE"&gt;Lógica: Transacciones (crudManager), Plantillas (templateManager), Permisos de usuario, Validaciones, etc.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.5in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="" lang="ES-VE"&gt;&lt;span style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;      &lt;/span&gt;V.&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;            &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="" lang="ES-VE"&gt;Comando: Enlace entre el modelo y la lógica para independizar a la página de la estructura de los datos.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="text-indent: -0.5in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="" lang="ES-VE"&gt;&lt;span style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;    &lt;/span&gt;VI.&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;            &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style="" lang="ES-VE"&gt;Modelo: Puede ser una BD, unos web services, o cualquier otra forma de obtener y guardar datos.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_8AfDk4OYg00/SlpniIgVDhI/AAAAAAAAAQ0/JGtYxbIBD3o/s1600-h/3.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 377px; height: 266px;" src="http://2.bp.blogspot.com/_8AfDk4OYg00/SlpniIgVDhI/AAAAAAAAAQ0/JGtYxbIBD3o/s400/3.JPG" alt="" id="BLOGGER_PHOTO_ID_5357708542806920722" border="0" /&gt;&lt;/a&gt;&lt;span style="" lang="ES-VE"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;&lt;span style=""&gt;6.&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;!--[endif]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;¿Cómo crear una ayuda de usuario sobre la pagina?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;El problema con las ayudas es que siempre son una sección aparte de la aplicación y el usuario ni siquiera sabe cómo encontrar la ayuda para lo que está buscando. Otra de las ventajas que te da estructurar tu pagina en contenedores &lt;/span&gt;&lt;/p&gt;&lt;div&gt; es que tienes la posibilidad de mostrarlos y ocultarlos fácilmente. De esta manera si nosotros consideramos que la pagina actual que estamos creando debemos colocar un espacio de ayuda entonces podemos crear un contenedor con esa información y en cualquier momento el usuario podrá ocultarlo y continuar como si nada. Por ejemplo:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SlpnppnQJaI/AAAAAAAAAQ8/R3mfPaCBi08/s1600-h/4.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 129px;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SlpnppnQJaI/AAAAAAAAAQ8/R3mfPaCBi08/s400/4.JPG" alt="" id="BLOGGER_PHOTO_ID_5357708671953413538" border="0" /&gt;&lt;/a&gt;&lt;span style="" lang="ES-VE"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;&lt;span style=""&gt;7.&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;!--[endif]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;¿Cómo prevenir en lugar de corregir?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;La parte más importante a la hora de crear una web es como se plantea la interacción del usuario con la aplicación, la mayoría de las paginas utilizan los componentes estándares de formulario que tiene HTML para lograr esta interaccion, pero lamentablemente estos componentes son muy limitados y en un gran porcentaje de las veces dificultan el uso de la pagina. Para eso en la arquitectura que estamos planteando hay un espacio dedicado a la creación o importación de nuevos componentes javascript. ¿Porque introducir una fecha en un TextInputo en una seria de ComboBoxs? Lo más natural seria un calendario, ¿no les parece? Existen una serie de componentes como NumericStepper, Slider, DatePicker, etc. Que hacen que la experiencia de usuario se vuelva mucho más simple y práctica y además evitan muchísimas validaciones hacia nosotros porque no dejan espacio para los errores. Y si además colocas tremenda ayuda, ¡es excelente!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;&lt;span style=""&gt;8.&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;!--[endif]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;¿Cómo hacer una página segura?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;Lo primero que debemos tomar en cuenta a la hora de hacer una página segura es que la capa de javascript&lt;span style=""&gt;  &lt;/span&gt;no puede ser tomada en cuenta para la seguridad en casi nada, ¿Por qué? Porque puede ser desactivada en cualquier momento por los hackers, incluso los navegadores más viejos ni siquiera soportan javascript. ¿Qué quiere decir esto? Pues muy fácil, las validaciones de datos que hacemos en javascript también las debemos hacer en PHP o en cualquier lenguaje que estemos usando del lado del servidor. Pero OJO: Igual debemos seguir haciendo las validaciones del lado del cliente para no recargar al servidor y para seguir con nuestra premisa de PREVENIR en lugar de CORREGIR.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;Para hacer nuestra arquitectura segura yo decidí dividir toda la interacción con los datos en transacciones, si se fijan en la capa lógica existe el crudManager y el infoManager. El primero de estos se encarga de eliminar, modificar y insertar los datos. El segundo se encarga solo de consultaros, por lo tanto requieren permisos de usuario diferentes para ser utilizados. Los mismo ocurre con el templateManager que se encarga de armar las vistas que el usuario va a visualizar, si el usuario no tiene permisos para visualizarlas entonces lo lleva a una página de error.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;¿Cómo se cargan los permisos? En variables de sesión, en la arquitectura que vamos a utilizar ya existe un modulo de autenticación que solo debemos realizarle pequeños cambios para adaptarlo a nuestra página, al momento de iniciar sesion te otorga permisos de usuario que luego tu controlas para acceder a las vistas y transacciones desde el crudManager, infoManager y templateManager.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraph" style="text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;&lt;span style=""&gt;9.&lt;span style=";font-family:&amp;quot;;font-size:7;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;!--[endif]--&gt;&lt;b style=""&gt;&lt;span style="" lang="ES-VE"&gt;¿Cómo realizar los CRUD sin recargar la pagina?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;Es demasiado común en una página web querer insertar, modificar, eliminar y consultar valores de una entidad en especifico (Persona, Paciente, Profesor, etc.). Con unos pocos conceptos es posible estandarizar estos procedimientos para hacerlos mas fáciles de programar y además se logra a la misma vez evitar recargar la pagina tan a menudo. Si estamos utilizando la arquitectura COCOAS (De la que he hablado durante toda esta entrada) solo debemos crear dos contenedores, uno para visualizar la información y otro para modificarla, por ejemplo: En el siguiente ejemplo se tiene una lista de anuncios publicada por un condominio, y se quiere modificar un anuncio en particular:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;Este sería el código del contenedor para visualizar los datos:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre name="code" class="html"&gt;&lt;br /&gt;&amp;lt;div  id="showPost1" class="post"&amp;gt;&lt;br /&gt; &amp;lt;h1  class="title"&amp;gt;&amp;lt;a href="#"&amp;gt;Racionamiento de  agua&amp;lt;/h1&amp;gt;&lt;br /&gt; &amp;lt;p&amp;gt;Los dias lunes y martes  no entrará agua al edficicio de la calle, por lo tanto se racionará el agua del  tanque en el siguiente horario: Lunes: de 8am a 12pm - de 2pm a 8pm. |  Martes: de 8am a 12pm - de 2pm a 8pm.&amp;lt;/p&amp;gt;&lt;br /&gt; &amp;lt;p  style="text-align:right;"&amp;gt;&lt;br /&gt; &amp;lt;a  id="detallesLink" class="editLink"  name="Post1&amp;gt;"  href="#"&amp;gt;editar&amp;lt;/a&amp;gt;&lt;br /&gt; &amp;lt;a class="deleteLink"  name="Post" href="crudManager.php?action=delete_anuncio&amp;amp;codigo=1"&amp;gt;Eliminar&amp;lt;/a&amp;gt;&lt;br /&gt; &amp;lt;/p&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Y este seria el contenedor para modificar los datos:&lt;br /&gt;&lt;pre name="code" class="html"&gt;&lt;br /&gt;&amp;lt;div  id="editPost1" class="post"  style="display:none;"&amp;gt;&lt;br /&gt; &amp;lt;form action="crudManager.php" method="post" id="anuncioForm"&amp;gt;&lt;br /&gt; &amp;lt;input name="action"  type="hidden" value="edit_anuncio" /&amp;gt;&lt;br /&gt; &amp;lt;input  name="codigo" type="hidden" value="1" /&amp;gt;&lt;br /&gt; &amp;lt;h1  class="title"&amp;gt;Titulo: &amp;lt;input name="titulo"  type="text" value=” Racionamiento de agua” /&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt; &amp;lt;textarea name="mensaje"  cols="" rows="" style="width:500px;  height:100px;"&amp;gt; Los dias lunes y martes no entrará agua al edficicio de  la calle, por lo tanto se racionará el agua del tanque en el siguiente horario:  Lunes: de 8am a 12pm - de 2pm a 8pm. | Martes: de 8am a 12pm  - de 2pm a 8pm.&amp;lt;/textarea&amp;gt;&lt;br /&gt; &amp;lt;p  style="text-align:right;"&amp;gt;&amp;lt;input name=""  type="submit" value="Guardar" /&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt; &amp;lt;/form&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Si estamos trabajando con COCOAS, debemos decirle cual contenedor es el que se utiliza para mostrar la información y cual contenedor es el que se utiliza para editar la información, esto lo hacemos con el campo ID de cada uno de los contenedores, colocando la palabra “&lt;span style="color:red;"&gt;show&lt;/span&gt;” o “&lt;span style="color:red;"&gt;edit&lt;/span&gt;” (segun el caso) seguida de el &lt;span style="color: rgb(112, 48, 160);"&gt;nombre de la entidad&lt;/span&gt; que estamos modificando en este caso “&lt;span style="color: rgb(112, 48, 160);"&gt;Post&lt;/span&gt;” seguida de el &lt;span style="color: rgb(112, 48, 160);"&gt;código de la entidad&lt;/span&gt; especifica que estamos modificando (can caso de que estemos en una lista de items de la misma entidad).&lt;br /&gt;&lt;br /&gt;Siempre el contenedor que se creó para modificar la entidad debe tener por defecto en sus estilos la propiedad &lt;b style=""&gt;display:none&lt;/b&gt; para que la pagina se desempeñe mucho mejor, esta propiedad le dice al contenedor que por defecto el debe estar oculto.&lt;br /&gt;&lt;br /&gt;Luego debemos irnos al vinculo que hemos definido que se le debe hacer click para modificar la entidad (ocultar el contenedor de visualizar y mostrar el contenedor de modificar) y colocarle en su propiedad class el valor “editLink”,&lt;span style=""&gt;  &lt;/span&gt;y en su propiedad name el nombre de la entidad y código que este vinculo modifica (en este caso “Post1”) de esta manera COCOAS sabrá lo que tiene que hacer.&lt;br /&gt;&lt;br /&gt;Por último debemos irnos al vinculo que hemos definido que se le debe hacer click para eliminar la entidad y colocarle en su propiedad class el valor “deleteLink” y de esta manera COCOAS sabrá lo que tiene que hacer.&lt;br /&gt;&lt;br /&gt;Al final los dos contenedores se verían de la siguiente manera, por supuesto que no se verían al mismo momento, sino que al presionar “editar” se ocultaría el primer contenedor y se mostraría el segundo contenedor:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8AfDk4OYg00/SlpnxBL34PI/AAAAAAAAARE/sv4DOwimd3g/s1600-h/5.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 79px;" src="http://4.bp.blogspot.com/_8AfDk4OYg00/SlpnxBL34PI/AAAAAAAAARE/sv4DOwimd3g/s400/5.JPG" alt="" id="BLOGGER_PHOTO_ID_5357708798540112114" border="0" /&gt;&lt;/a&gt;&lt;span style="" lang="ES-VE"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_8AfDk4OYg00/Slpn4b-_RUI/AAAAAAAAARM/4zMDGjfhrzg/s1600-h/6.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 103px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/Slpn4b-_RUI/AAAAAAAAARM/4zMDGjfhrzg/s400/6.JPG" alt="" id="BLOGGER_PHOTO_ID_5357708925992912194" border="0" /&gt;&lt;/a&gt;&lt;span style="" lang="ES-VE"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;Bueno en las siguientes entradas explicare mucho mejor cada uno de los puntos de los que he hablado en esta oportunidad ya que todavía nos queda muuuuuucho de que hablar y buenas prácticas que seguir para conseguir mucha rapidez, de todas maneras para los que saben leer ingles aquí les dejo un pequeño documento donde explica un poco más detallada la arquitectura COCOAS.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-VE"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-6746670323748702665?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/6746670323748702665/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/07/como-hacer-la-pagina-web-perfecta.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/6746670323748702665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/6746670323748702665'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/07/como-hacer-la-pagina-web-perfecta.html' title='Como hacer la pagina web perfecta'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_8AfDk4OYg00/SlpnUgb9kOI/AAAAAAAAAQk/ZQ-nMJnASmM/s72-c/1.JPG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-1229852225650013124</id><published>2009-07-11T19:45:00.003-04:30</published><updated>2009-07-11T19:56:00.286-04:30</updated><title type='text'>Nuevo enfoque de Cairngorm - Universal Mind</title><content type='html'>La gente de &lt;a href="http://umcairngorm.riaforge.org/"&gt;Universal Mind&lt;/a&gt; ha desarrollado un nuevo enfoque para el framework de contruccion de aplicaciones flex llamado &lt;a href="http://en.wikipedia.org/wiki/Cairngorm_%28Flex_framework%29"&gt;cairngorm&lt;/a&gt;. Ahora existe la posibilidad, por ejemplo, de controlar el flujo de los datos y llamadas a servicios agregando nuestros propios callBacks para recibir los datos.&lt;br /&gt;&lt;br /&gt;¿Como se come esto? Pues muy sencillo!&lt;br /&gt;Si antes siempre tenias que recibir la respuesta de un servicio desde el comando para luego insertarla en el modelo y que el modelo actualizara la vista. Ahora no!! Ahora simplemente podriamos decidir donde recibir la respuesta del servicio, incluso en la misma vista! Y no tendriamos que pasar por el modelo ni nada por el estilo.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Aqui les dejor una explicacion de la nueva manera de trabajar del cairngorm de universal mind que ha publicado mi gran amigo Rene Ramirez: &lt;a href="http://developyourdream.blogspot.com/2009/06/cairngorm-universal-mind-extension.html"&gt;http://developyourdream.blogspot.com/2009/06/cairngorm-universal-mind-extension.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Para los que no conozcan Cairngorm todavia aqui les dejo este link donde intento explicarlo mucho mas a fondo: &lt;a href="http://internetdeveloping.blogspot.com/2009/04/empezando-con-cairngorm-desarrollando.html"&gt;http://internetdeveloping.blogspot.com/2009/04/empezando-con-cairngorm-desarrollando.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tambien he detallado la explicacion de cairngorm durante la realizacion de un ejemplo sencillo:&lt;br /&gt;&lt;a href="http://internetdeveloping.blogspot.com/2009/05/ejemplo-cairngorm-agregar-contacto.html"&gt;http://internetdeveloping.blogspot.com/2009/05/ejemplo-cairngorm-agregar-contacto.html&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-1229852225650013124?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/1229852225650013124/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/07/nuevo-enfoque-de-cairngorm-universal.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/1229852225650013124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/1229852225650013124'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/07/nuevo-enfoque-de-cairngorm-universal.html' title='Nuevo enfoque de Cairngorm - Universal Mind'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-513018300976224134</id><published>2009-06-12T18:49:00.001-04:30</published><updated>2009-06-12T10:21:18.829-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='drag and drop'/><category scheme='http://www.blogger.com/atom/ns#' term='datagrid'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='listbase'/><title type='text'>Drag and Drop muy fácil con un DataGrid Flex</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_8AfDk4OYg00/SjJqguDfT4I/AAAAAAAAAQM/xpsWulPqWwA/s1600-h/datagrid.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 196px; height: 101px;" src="http://2.bp.blogspot.com/_8AfDk4OYg00/SjJqguDfT4I/AAAAAAAAAQM/xpsWulPqWwA/s320/datagrid.JPG" alt="" id="BLOGGER_PHOTO_ID_5346452817993224066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En el siguiente ejemplo vamos a ver como lograr de manera muy fácil la funcionalidad de pasar datos de un &lt;a href="http://livedocs.adobe.com/flex/2/langref/mx/controls/DataGrid.html"&gt;DataGrid &lt;/a&gt;hacia otro o viceversa con solo realizar el típico "&lt;a href="http://www.adobe.com/devnet/flex/quickstart/adding_drag_and_drop/"&gt;drag and drop&lt;/a&gt;" del ratón (presionando el botón izquierdo del ratón sobre el dato que queremos pasar y arrastrándolo hasta el &lt;a href="http://livedocs.adobe.com/flex/2/langref/mx/controls/DataGrid.html"&gt;DataGrid &lt;/a&gt;que deseamos que reciba la información). Para empezar la explicación vamos a ver en funcionamiento del ejemplo que vamos a realizar:&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;embed pluginspage=" http://www.macromedia.com/go/getflashplayer" src="http://ejemplos.net78.net/swf/SimpleDragAndDrop.swf" height="460" width="362"&gt;&lt;/embed&gt;&lt;br /&gt;Existen varias maneras de realizar esta funcionalidad, algunas de ellas requieren mayor dedicación y programación por parte del desarrollador y otras no, así como también las que requieren mayor programación también permiten un mayor control. En este voy a explicar la mas sencilla y fácil de implementar.&lt;br /&gt;&lt;br /&gt;Todos los objetos que heredan de la clase &lt;a href="http://livedocs.adobe.com/flex/201/langref/mx/controls/listClasses/ListBase.html"&gt;ListBase &lt;/a&gt;(El &lt;a href="http://livedocs.adobe.com/flex/2/langref/mx/controls/DataGrid.html"&gt;DataGrid &lt;/a&gt;tambien, por heredar de esta clase) tienen 5 propiedades muy interesantes que permiten contemplar la funcionalidad Drag and Drop de una manera muy sencilla:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;dragEnabled&lt;/span&gt;: Esta propiedad especifica si el componente &lt;a href="http://livedocs.adobe.com/flex/201/langref/mx/controls/listClasses/ListBase.html"&gt;ListBase &lt;/a&gt;debe permitir que al seleccionar un dato se pueda iniciar el arrastre de la informacion hacia cualquier componente ListBase (incluyendo este mismo componente).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;dropEnabled&lt;/span&gt;: Esta propiedad especifica si el componente &lt;a href="http://livedocs.adobe.com/flex/201/langref/mx/controls/listClasses/ListBase.html"&gt;ListBase &lt;/a&gt;debe permitir que un dato entrante pueda ser soltado sobre este componente.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;dragMoveEnabled&lt;/span&gt;: Esta propiedad dice si cuando un objeto es arrastrado a partir de este componente se debe borrar la copia original que inicio el arraste. Es decir, si esta propiedad es falsa y hacemos un drag and drop de algun item de la lista, se mantendrá una copia del item en el lugar donde si inicio el movimiento.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;allowMultipleSelection&lt;/span&gt;: Con esta propiedad podemos realizar el drag and drop de multiples objetos (items) en un mismo movimiento.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;allowDragSelection&lt;/span&gt;: Esta propiedad nos indica si es posible realizar una seleccion sobre un item para realizar el drag and drop. Si es falsa no podremos seleccionar ningun item para realizar un drag and drop sobr el.&lt;/li&gt;&lt;/ol&gt;Entonces si en este ejemplo nosotros queremos realizar un drag and drop de el datagrid superior al datagrid inferior entonces debemos colocarle al datagrid superior las siguientes propiedades dragEnabled, allowDragSelection y dragMoveEnables como true. Y en el caso del datagrid inferior debemos colocarle la propiedad dropEnabled como true.&lt;br /&gt;&lt;br /&gt;Si nosotros quisieramos podríamos reemplazar uno de los &lt;a href="http://livedocs.adobe.com/flex/2/langref/mx/controls/DataGrid.html"&gt;DataGrid &lt;/a&gt;utilizados en este ejemplo por cualquier otro componente que herede de la clase &lt;a href="http://livedocs.adobe.com/flex/201/langref/mx/controls/listClasses/ListBase.html"&gt;ListBase&lt;/a&gt; (El List, TitleList, Tree, etc.).&lt;br /&gt;&lt;br /&gt;Bueno eso es todo! Como pueden ver es demasiado simple y fácil de realizar. Cualquier pregunta, si es que las tienen, no duden en realizarlas en los comentarios del post que yo siempre estoy pendiente de responderlas! Para descargar el código fuente del ejemplo presiona &lt;a href="http://ejemplos.net78.net/downloads/cont_descargas.php?archivo=SimpleDragAndDrop.rar"&gt;click aquí&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://ejemplos.net78.net/downloads/cont_descargas.php?archivo=SimpleDragAndDrop.rar" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 125px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SSDhcJ7C_NI/AAAAAAAAAI8/gGFwsT168AY/s400/descargar.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459437839645906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-513018300976224134?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/513018300976224134/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/06/drag-and-drop-muy-facil-con-un-datagrid.html#comment-form' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/513018300976224134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/513018300976224134'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/06/drag-and-drop-muy-facil-con-un-datagrid.html' title='Drag and Drop muy fácil con un DataGrid Flex'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_8AfDk4OYg00/SjJqguDfT4I/AAAAAAAAAQM/xpsWulPqWwA/s72-c/datagrid.JPG' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-8469542891789377556</id><published>2009-06-09T08:58:00.005-04:30</published><updated>2009-06-09T09:48:22.498-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='metadata'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><title type='text'>Listado de metatags y sus utilidades en flex</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_8AfDk4OYg00/Si5qIZtUyhI/AAAAAAAAAQE/WuUGpwFzNPE/s1600-h/FLEXmETADATA.PNG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 199px; height: 128px;" src="http://2.bp.blogspot.com/_8AfDk4OYg00/Si5qIZtUyhI/AAAAAAAAAQE/WuUGpwFzNPE/s320/FLEXmETADATA.PNG" alt="" id="BLOGGER_PHOTO_ID_5345326500307847698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: normal;"&gt;En el articulo anterior "&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;a href="http://internetdeveloping.blogspot.com/2009/06/utilizando-metadata-para-describir-las.html"&gt;Utilizando metadata para describir las clases en Flex&lt;/a&gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: normal;"&gt;" explique un poco la &lt;a href="http://es.wikipedia.org/wiki/Metadato"&gt;definicion de Metadata&lt;/a&gt; y di un ejemplo de su tipico uso para expecificar a flex un poco más información acerca de los datos, clases y propiedades que estamos utilizando en nuestra aplicación. En este caso voy a describirles un ejemplo de uso y explicación para cada tipo de metatag que podemos definir en Flex, sin hablar mucho más vamos a empezar con los metatags:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[ArrayElementType]&lt;/span&gt;&lt;br /&gt;&lt;/strong&gt;Para decir que tipo de datos debe contener el ArrayCollection. Por ejemplo:&lt;/p&gt;&lt;em style="color: rgb(0, 0, 0);"&gt;[ArrayElementType("String")]&lt;/em&gt;&lt;br /&gt;public var newStringProperty:Array;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;p&gt;&lt;strong style="color: rgb(0, 0, 0);"&gt;[Bindable] &lt;/strong&gt;&lt;br /&gt;Para  utilizar una propiedad como “data binding expression”, este tipo de propiedades  son utilizadas para que cuando flex detecte un cambio en ellas actualice todos  los destinos que tienen esta propiedad asiganada con el típico “propertyChangeEvent”.  Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[Bindable]&lt;/span&gt;&lt;br /&gt;public var personas:ArrayCollection&lt;/p&gt;&lt;br /&gt;&lt;p&gt;        &amp;lt;mx:DataGrid id="dg" dataProvider="{ personas }"&amp;gt;&lt;br /&gt;&amp;lt;/mx:DataGrid&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;[DefaultProperty] &lt;/strong&gt;&lt;br /&gt;Se  refiere a la propiedad por defecto del componente, esta “defaultProperty” es la  que se setea en mxml cuando se coloca entre los tags del componente. Por  ejemplo:&lt;br /&gt;&amp;lt;mx:DataGrid  id="dg" dataProvider="{ personas }"&amp;gt;&lt;br /&gt;&amp;lt;mx:columns&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn dataField="email"  headerText="Email"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:columns&amp;gt;&lt;br /&gt;&amp;lt;/mx:DataGrid&amp;gt;&lt;br /&gt;En este  caso la defaultProperty del mx.Control.Datagrid seria un objeto de tipo  Columns, que a su vez tiene una defaultProperty de tipo ArrayCollection de  DatagridColumn.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;[Deprecated] &lt;/strong&gt;&lt;br /&gt;Se  utiliza para que el compilador arroje un warning para notificar al usuario que  esa propiedad o clase esta obsoleta.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;[Embed] &lt;/strong&gt;&lt;br /&gt;Le dice  al compilador que incluya el recurso dentro de la película al momento de  compilarla. Un recurso puede ser una imagen, sonido, video, icono, etc. Por  ejemplo:&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[Embed(source="com/assets/icono.png")]&lt;/span&gt;&lt;br /&gt;private var icon:Class;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;[Event] &lt;/strong&gt;&lt;br /&gt;Se  utiliza para definir un evento que una clase arroja. Por ejemplo, el  mx.Control.Button tiene como definido el evento MouseEvent.Click como metadato.  De esta manera cuando estamos definiendo un botón en mxml podemos colocar un  handler al evento click.&lt;br /&gt;&amp;lt;mx:Button click="buttonClickHandler()" /&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;[Exclude]&lt;/strong&gt;&lt;br /&gt;Se  utiliza para decirle al compilador que no muestre esta propiedad al momento de  autocompletar, es como decir que el atributo es privado, por ejemplo:&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[Exclude(name="label",  kind="property")]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;[ExcludeClass]&lt;/strong&gt;&lt;br /&gt;Le dice  al compilador que excluya la clase al momento de autocompletar, es como decir  que la clase es privada.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;[IconFile] &lt;/strong&gt;&lt;br /&gt;Es el  icono que va a tener la clase (componente). Por ejemplo: &lt;/p&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[IconFile("MyButton.png")]&lt;/span&gt;&lt;br /&gt;public class MyButton extends Button&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;p&gt;&lt;strong&gt;[Inspectable] &lt;/strong&gt;&lt;br /&gt;Se  utiliza para decirle al compilador que posibles valores puede tener una  propiedad, de que tipo debe ser (String, int, Number, etc.) cual debe ser su  valor por defecto, etc. Para más información revisar el siguiente vinculo: &lt;a href="http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&amp;amp;file=metadata_141_11.html"&gt;http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&amp;amp;file=metadata_141_11.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;[InstanceType] &lt;/strong&gt;&lt;br /&gt;Para  decir de que tipo debe ser una propiedad, por ejemplo (Cobra sentido en el caso  de que la propiedad haya sido definida como una interfaz o una clase muy  general):&lt;/p&gt;&lt;br /&gt;// Define a deferred property for the top component.&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[InstanceType("mx.controls.Label")]&lt;/span&gt;&lt;br /&gt;public var topRow:IDeferredInstance;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;[NonCommittingChangeEvent] &lt;/strong&gt;&lt;br /&gt;Este  metatag le especifica a flex que no debe lanzar validadiones de data (commits típicos  del data binding) en el evento especificado, por ejemplo:&lt;/p&gt;&lt;br /&gt;[Event(name="change", type="flash.events.Event")]&lt;br /&gt;class MyText extends UIComponent {&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;[Bindable(event="valueCommit")]&lt;br /&gt;[NonCommittingChangeEvent("change")]&lt;br /&gt;function get text():String {&lt;br /&gt;        return getText();&lt;br /&gt;}&lt;br /&gt;function set text(t):void {&lt;br /&gt;       setText(t);&lt;br /&gt;      // Dispatch events.&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;p&gt;En este  caso cuando el texto (propiedad text) cambie no va a ocurrir ninguna validación,  pero en el caso de que se presione la tecla Enter, ocurrirá un valueCommit y  entonces si se dispararan las validaciones de datos.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;[RemoteClass]&lt;/strong&gt;&lt;br /&gt;Especifica  que esta clase va mapeada contra un objeto en el servidor, le dice a flex que  debe incluir la información de la case al momento de serializarla. Por ejemplo: &lt;/p&gt;&lt;br /&gt;[RemoteClass(alias="com.CctVO")] &lt;br /&gt;public class Carrito  {&lt;br /&gt;         public var id : String;      &lt;br /&gt;      [Inspectable(defaultValue&lt;em&gt;="sin pagar",&lt;/em&gt;enumeration="sin pagar,pagado")]               &lt;br /&gt;      public var estado : String;         &lt;br /&gt;      public var productos : ArrayCollection;&lt;br /&gt;&lt;br /&gt;           [Transient]     public function get total() : int    &lt;br /&gt;      {        &lt;br /&gt;           return productos.length;    &lt;br /&gt;      }&lt;br /&gt;}&lt;br /&gt;&lt;p&gt;&lt;strong&gt;[Style] &lt;/strong&gt;&lt;br /&gt;Para  especificar que una propiedad es de tipo “estilo” para un componente, por  ejemplo:&lt;/p&gt;&lt;br /&gt;[Style(name="verticalAlign", type="String", enumeration="bottom,middle,top", inherit="no")]&lt;br /&gt;&lt;strong&gt;[Transient]&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;Le dice a  flex que debe ignorar cierta propiedad a la hora de serializar una clase para  ser mapeada contra un objeto del lado del servidor. Por ejemplo:&lt;/p&gt;&lt;br /&gt;[RemoteClass(alias="com.CctVO")]  public class Carrito  {     public var id : String;          public var estado : String;     public var productos : ArrayCollection;       [Transient]     public function get total() : int     {         return productos.length;     }&lt;br /&gt;}&lt;br /&gt;&lt;p&gt;En este  caso no se debe enviar la propiedad “total” al servidor ya que es un atributo  calculado en ejecución. Para ver mas información hacer click en el siguiente  vinculo: &lt;a href="http://livedocs.adobe.com/flex/3/html/help.html?content=metadata_3.html"&gt;http://livedocs.adobe.com/flex/3/html/help.html?content=metadata_3.html&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;Esos son todos los metatags que conozco hasta la fecha que se peuden definir a la hora de programar en flex, espero les sean de mucha utilidad asi como para mi lo han sido. Cualquier cosa les dejo un &lt;a href="http://ejemplos.net78.net/downloads/cont_descargas.php?archivo=MetadatosFlex1.0.pdf"&gt;documento en PDF con las definiciones y ejemplo que he dado en este artículo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ejemplos.net78.net/downloads/cont_descargas.php?archivo=MetadatosFlex1.0.pdf" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 125px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SSDhcJ7C_NI/AAAAAAAAAI8/gGFwsT168AY/s400/descargar.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459437839645906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-8469542891789377556?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/8469542891789377556/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/06/listado-de-metatags-y-sus-utilidades-en.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/8469542891789377556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/8469542891789377556'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/06/listado-de-metatags-y-sus-utilidades-en.html' title='Listado de metatags y sus utilidades en flex'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_8AfDk4OYg00/Si5qIZtUyhI/AAAAAAAAAQE/WuUGpwFzNPE/s72-c/FLEXmETADATA.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-4653495745635258626</id><published>2009-06-04T11:01:00.007-04:30</published><updated>2009-06-09T09:52:15.819-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='metadata'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><title type='text'>Utilizando metadata para describir las clases en Flex</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/Si5mq3EryRI/AAAAAAAAAP8/yUZTRm0Fd0g/s1600-h/FLEXmETADATA.PNG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 199px; height: 128px;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/Si5mq3EryRI/AAAAAAAAAP8/yUZTRm0Fd0g/s320/FLEXmETADATA.PNG" alt="" id="BLOGGER_PHOTO_ID_5345322694259493138" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Si nos vamos a la &lt;a href="http://es.wikipedia.org/wiki/Metadato"&gt;definicion de wikipedia&lt;/a&gt; la metadata no es mas que información "sobre la data", es decir, es describir como es la data. Una metadata esta compuesta de una serie de metatags, donde cada uno de estos ultimos se encarga de describir alguna caracteristica de la clase. En un metadato podemos decile al flex que tipos de datos debe contener un ArrayCollection, si una imagen se debe cargar dentro de la pelicula SWF o cargarla remotamente al momento de ejecutar la pelicula, cuales son los posibles valores que puede tomar una propiedad, etc. Supongamos, en el siguiente ejemplo, que tenemos la clase "Carrito" que viene definida de la siguiente manera:&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package&lt;br /&gt;{&lt;br /&gt;import mx.collections.ArrayCollection;&lt;br /&gt;&lt;br /&gt;public class Carrito&lt;br /&gt;{&lt;br /&gt;public var id : String;&lt;br /&gt;public var estado : String;&lt;br /&gt;public var productos : ArrayCollection;&lt;br /&gt;&lt;br /&gt;       public function get total() : int&lt;br /&gt;       {&lt;br /&gt;          return productos.length;&lt;br /&gt;       }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Esta clase no tiene ningun tipo de "Metatag"y lo unico que conocemos de ella es que tiene tres atributos, sus tipos y sus nombres. Ahora supongamos que queremos utilizar este objeto como un "objeto remoto" para utilizarlo en algun lenguaje del lado del servidor como java, php, c#, etc. Para eso debemos decirle al compilador que este objeto esta representado del lado de java y que debe conservar la informacion de la clase al momento de serializar, para eso utilizamos el &lt;a href="http://livedocs.adobe.com/flex/3/html/help.html?content=metadata_3.html"&gt;&lt;span style="font-weight: bold;"&gt;metatag&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;[&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;samp style="font-weight: bold; color: rgb(0, 0, 153);" class="codeph"&gt;RemoteClass&lt;/samp&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;. Tambien debemos decirle entonces que la propiedad "total" no debe ser enviada al servidor por tratarse de una propiedad calculada (seria como por ejemplo la edad, al pasar la fecha de nacimiento se puede calcular la edad), para excluir propiedades de ser enviadas para el servidor utilizamos el &lt;a href="http://livedocs.adobe.com/flex/3/html/help.html?content=metadata_3.html"&gt;&lt;span style="font-weight: bold;"&gt;metatag &lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;&lt;a href="http://livedocs.adobe.com/flex/3/html/help.html?content=metadata_3.html"&gt;[Transient]&lt;/a&gt;. &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-size:100%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Ahora supongamos que queremos definir que el estado de el carrito solo puede ser o "pagado" o "sin pagar", para eso debemos utilizar el &lt;a href="http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&amp;amp;file=metadata_141_11.html"&gt;&lt;span style="font-weight: bold;"&gt;metatag&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;&lt;a href="http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&amp;amp;file=metadata_141_11.html"&gt; [Inspectable]&lt;/a&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;y definir dentro de el los dos valores que puede tomar ese atributo. Con estas tres definiciones la clase nos quedaría de la siguiente manera:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package&lt;br /&gt;{&lt;br /&gt;import mx.collections.ArrayCollection;&lt;br /&gt;&lt;br /&gt;[RemoteClass(alias="com.CctVO")]&lt;br /&gt;public class Carrito&lt;br /&gt;{&lt;br /&gt;   public var id : String;&lt;br /&gt;&lt;br /&gt;      [Inspectable(&lt;samp class="codeph"&gt;defaultValue&lt;/samp&gt;&lt;i&gt;="sin pagar",&lt;/i&gt;&lt;samp class="codeph"&gt;enumeration="sin pagar,pagado"&lt;/samp&gt;)]&lt;br /&gt;      public var estado : String;&lt;br /&gt;&lt;br /&gt;   public var productos : ArrayCollection;&lt;br /&gt;&lt;br /&gt;      [Transient]&lt;br /&gt;      public function get total() : int&lt;br /&gt;      {&lt;br /&gt;          return productos.length;&lt;br /&gt;      }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Este es un gran ejemplo de metadatos que podemos utilizar en flex. Si quieres conocer mas sobre los metadatos de flex te invito a entrar e mi articulo "&lt;a href="http://internetdeveloping.blogspot.com/2009/06/listado-de-metatags-y-sus-utilidades-en.html"&gt;Listado de metatags y sus utilidades en flex&lt;/a&gt;" donde explico de manera mucho más detallada todas las posibles descripciones que podemos realizarle a una clase al momento de programarla. Cualquier pregunta no duden en escribirla en los comentarios de este articulo.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-4653495745635258626?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/4653495745635258626/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/06/utilizando-metadata-para-describir-las.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/4653495745635258626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/4653495745635258626'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/06/utilizando-metadata-para-describir-las.html' title='Utilizando metadata para describir las clases en Flex'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_8AfDk4OYg00/Si5mq3EryRI/AAAAAAAAAP8/yUZTRm0Fd0g/s72-c/FLEXmETADATA.PNG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-6008893994315031282</id><published>2009-06-03T18:36:00.014-04:30</published><updated>2009-06-04T19:16:19.446-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='panel'/><category scheme='http://www.blogger.com/atom/ns#' term='herencia'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='titlewindow'/><category scheme='http://www.blogger.com/atom/ns#' term='componentes'/><title type='text'>Extendiendo de el SuperTitleWindow para que todas tus ventanas tengan "Cerrar" y "Aceptar" de forma nativa</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_8AfDk4OYg00/SihcwfEeFAI/AAAAAAAAAP0/43rLMjGPU98/s1600-h/SuperTitleWindow.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 86px;" src="http://2.bp.blogspot.com/_8AfDk4OYg00/SihcwfEeFAI/AAAAAAAAAP0/43rLMjGPU98/s200/SuperTitleWindow.JPG" alt="" id="BLOGGER_PHOTO_ID_5343622945918817282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Desde que empece mi aprendizaje en el desarrollo de aplicaciones con flex, he tenido la necesidad de crear ventanas emergentes con un formato especifico, todas ellas debian tener un botón de "Aceptar" y "Cancelar" para cerrar la ventana en el momento que el usuario lo creyera conveniente. En este ejemplo vamos a ver como se puede estantadrizar el comportamiento de todas las ventanas emergentes de una aplicacion apartir de la clase SuperTitleWindow.cs que tiene inmerso el siguiente comportamiento:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Metodo "Aceptar" cuando se presiona el botón "Enter" del teclado.&lt;/li&gt;&lt;li&gt;Metodo "Cancelar" cuando se presiona el boton "ESC" del teclado.&lt;/li&gt;&lt;li&gt;Metodo "Limpiar Pantalla" cuando se presionan las teclas "shift" + "Delete".&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Botón cerrar en la parte superior derecha de la ventana (al estilo windows).&lt;/li&gt;&lt;li&gt;Obliga a definir el foco inicial del mouse dentro que se utilizara al desplegarse la ventana.&lt;/li&gt;&lt;li&gt;Permite modificar la logica a realizar una vez despachado el evento "Cerrar" o "Aceptar".&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Para que se entienda un poco mejor vamos a ver un ejemplo de ventana emergente que herede del SuperTitleWindow.&lt;br /&gt;&lt;embed pluginspage=" http://www.macromedia.com/go/getflashplayer" src="http://ejemplos.net78.net/flex/supertitlewindow/prueba.swf" width="420" height="200"&gt;&lt;/embed&gt;&lt;br /&gt;Si observamos el codigo de esta ventana vamos a notar unas pequeñas particularidades con respecto a las ventanas tradicionales:&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s1600-h/code.gif"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:180%;"&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;Código LoginWindow&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);font-size:180%;" class="fullpost" &gt;.mxml&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;SuperTitleWindow xmlns="popupClasses.*" xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="174" title="Inicio de sesión"&amp;gt;&lt;br /&gt;&amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;lt;![CDATA[&lt;br /&gt;import popupClasses.SuperTitleWindowEvent;&lt;br /&gt;import mx.managers.PopUpManager;&lt;br /&gt;&lt;br /&gt;private function aceptarClick() : void&lt;br /&gt;{&lt;br /&gt;//Lanzo el evento SuperTitleWindowEvent.OK_WINDOW para que se llame el metodo okPressed&lt;br /&gt;var ev : SuperTitleWindowEvent = new SuperTitleWindowEvent(SuperTitleWindowEvent.OK_WINDOW);&lt;br /&gt;this.dispatchEvent(ev);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function cancelarClick() : void&lt;br /&gt;{&lt;br /&gt;//Lanzo el evento SuperTitleWindowEvent.CANCEL_WINDOW para que se llame el metodo cancelPressed&lt;br /&gt;var ev : SuperTitleWindowEvent = new SuperTitleWindowEvent(SuperTitleWindowEvent.CANCEL_WINDOW);&lt;br /&gt;this.dispatchEvent(ev);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;override protected function setWindowFocus():void&lt;br /&gt;{&lt;br /&gt;//Seteo el foco al text input llamado "usuario"&lt;br /&gt;//si no implemento esta funcion entonces se disparará una excepcion&lt;br /&gt;//de esta manera obligo a que siempre se defina el foco inicial de una ventana emergante&lt;br /&gt;usuario.setFocus();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;override protected function okPressed(event:SuperTitleWindowEvent):void&lt;br /&gt;{&lt;br /&gt;//aqui inserto mi logica de aceptar, por ejemplo una validacion.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PopUpManager.removePopUp(this);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;override protected function cancelPressed(event:SuperTitleWindowEvent):void&lt;br /&gt;{&lt;br /&gt;super.cancelPressed(event);//Debo remover esto si deseo sobreescribir el comportamiento original al momento de presionar cacelar&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;override protected function clearPressed(event:SuperTitleWindowEvent):void&lt;br /&gt;{&lt;br /&gt;//aqui va la logica para limpiar la ventana, se despacha con las teclas "shift" + "delete"&lt;br /&gt;super.clearPressed(event);&lt;br /&gt;}&lt;br /&gt;]]&amp;gt;&lt;br /&gt;&amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&amp;lt;mx:Label text="Ingrese el nombre de usuario y contraseña"/&amp;gt;&lt;br /&gt;&amp;lt;mx:HBox width="100%"&amp;gt;&lt;br /&gt;&amp;lt;mx:Label text="Nombre de usuario:"/&amp;gt;&lt;br /&gt;&amp;lt;mx:TextInput id="usuario"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:HBox&amp;gt;&lt;br /&gt;&amp;lt;mx:HBox width="100%"&amp;gt;&lt;br /&gt;&amp;lt;mx:Label text="Contraseña:"/&amp;gt;&lt;br /&gt;&amp;lt;mx:TextInput/&amp;gt;&lt;br /&gt;&amp;lt;/mx:HBox&amp;gt;&lt;br /&gt;&amp;lt;mx:ControlBar horizontalAlign="right"&amp;gt;&lt;br /&gt;&amp;lt;mx:Button label="Cancelar" click="cancelarClick()"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Button label="Aceptar" click="aceptarClick()"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:ControlBar&amp;gt;&lt;br /&gt;&amp;lt;/SuperTitleWindow&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Lo primero que notamos es que la ventanta hereda de la clase SuperTitleWindow, luego notamos que existen 6 funciones principales que las podemos utilizar dependiendo de nuestros requerimientos:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;okPressed&lt;/span&gt;() : Esta funcion se dispará automaticamente cada vez que la ventana esta a punto de cerrarse, en esta funcion debo agregar la logica a realizar justo antes de cerrar.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;cancelPressed&lt;/span&gt;() : Ocurre igual que en la funcion okPressed pero en este caso cuando la ventana esta apunto de cerrarse.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;clearPressed&lt;/span&gt;() : Esta funcion se ejecuta automaticamente cada vez que la ventana debe limpiarse, se debe introducir aqui la logica de limpiado, por ejemplo en este caso la logica de limpiado es:&lt;blockquote&gt;&lt;/blockquote&gt;&lt;span style="font-style: italic;"&gt;                 usuario.text = "";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                 clave.text = "";&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;setWindowFocus&lt;/span&gt;(): esta funcion es oblicatoria de sobreescribir, esto se debe a que debemos colocar el foco del mouse sobre el primer campo del formulario que se encuentra en la ventana, de esta manera la aplicacion fluye sin la necesidad de la intervencion del mouse. Si no se sobreescribe esta funcion, entonces ocurre una excepción.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;cancelarClick&lt;/span&gt;() : Esta funcion la debemos crear en caso de que queramos colocar un botón de cancelar dentro de la ventana, esta funcion debe despachar al evento SuperTitleWindowEvent de tipo SCANCEL_WINDOW para que sea escuchado por el SuperTitleWindow y volvamos a caer en el metodo cancelPressed().&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;aceptarClick&lt;/span&gt;() : Esta funcion la debemos crear en caso de que queramos colocar un botón de cancelar dentro de la ventana, esta funcion debe despachar al evento SuperTitleWindowEvent de tipo OK_WINDOW para que sea escuchado por el SuperTitleWindow y volvamos a caer en el metodo okPressed().&lt;/li&gt;&lt;/ol&gt;Por otro lado tenemos 3 propiedades configurables para la confirmacion de las tres acciones tipicas en la ventana Aceptar, Cancelar, Limpiar:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;askClear&lt;/span&gt;: Defino si debo o no debo confirmar la limpieza de la pantalla, por defecto es verdadera para obligar al prigramador a deshabilitarla en caso que lo crea pertienente.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;askOk&lt;/span&gt;: Defino si debo o no debo confirmar el cerrado de la pantalla, por defecto es verdadera para obligar al prigramador a deshabilitarla en caso que lo crea pertienente.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;askCancel&lt;/span&gt;: Defino si debo o no debo confirmar el cerrado de la pantalla, por defecto es verdadera para obligar al programador a deshabilitarla en caso que lo crea pertienente.&lt;/li&gt;&lt;/ol&gt;Al heredar de esta clase estamos teniendo varias ventajas, la primera de ellas es que estamos estandarizando la implementacion de las ventanas, de esta manera el usuario se acostumbrará a presionar el boton "Enter" para aceptar las ventanas emergentes y "ESC" para cancelarlas. Por otro lado se organiza y estructura el código, se fomenta la reutilizacion del codigo y si se necesita variar algun comportamiento se puede manipular a la SuperTitleWindow.cs en lugar de realizar modificaciones a todas las ventanas por separado.&lt;br /&gt;&lt;br /&gt;Para descargar este ejemplo pueden hacer click en el siguiente vinculo, cualquier duda no duden en preguntarlo como comentario de este post, espero que les sea de tanta utilidad como a mi.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ejemplos.net78.net/downloads/cont_descargas.php?archivo=SuperTitleWindowTest.rar" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 125px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SSDhcJ7C_NI/AAAAAAAAAI8/gGFwsT168AY/s400/descargar.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459437839645906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-6008893994315031282?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/6008893994315031282/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/06/extendiendo-de-el-supertitlewindow-para.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/6008893994315031282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/6008893994315031282'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/06/extendiendo-de-el-supertitlewindow-para.html' title='Extendiendo de el SuperTitleWindow para que todas tus ventanas tengan &quot;Cerrar&quot; y &quot;Aceptar&quot; de forma nativa'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_8AfDk4OYg00/SihcwfEeFAI/AAAAAAAAAP0/43rLMjGPU98/s72-c/SuperTitleWindow.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-8121804254561295909</id><published>2009-05-26T23:19:00.007-04:30</published><updated>2009-05-27T00:12:51.240-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Jquery'/><title type='text'>JQuery - Framework de desarrollo para Javascript</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8AfDk4OYg00/Shy_US9sE3I/AAAAAAAAAPs/ye0rlXvxsBM/s1600-h/jquery-logo.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 236px; height: 85px;" src="http://4.bp.blogspot.com/_8AfDk4OYg00/Shy_US9sE3I/AAAAAAAAAPs/ye0rlXvxsBM/s400/jquery-logo.png" alt="" id="BLOGGER_PHOTO_ID_5340353613563433842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Probablemente muchos de nosotros queremos entrar con entusiasmo en el mundo del desarrollo de aplicaciones ajax pero nos hemos encontrado con un gran muro debido a la complejidad e inmadurez del los IDE de desarrollo (Es muy dificil encontrar un software que permita debugear paso a paso) y la falta de un gran framework facil de usar como es el caso de otros lenguajes como ActionScript (&lt;a href="http://www.holaflex.com/?p=34"&gt;Framework Flex&lt;/a&gt;), C# (&lt;a href="http://es.wikipedia.org/wiki/.NET_de_Microsoft"&gt;.NET framework&lt;/a&gt;), JAVA (&lt;a href="http://es.wikipedia.org/wiki/Java_EE"&gt;Java enterprice edition&lt;/a&gt;, etc.), PHP (&lt;a href="http://es.wikipedia.org/wiki/Zend_Framework"&gt;Zend Framework&lt;/a&gt;), etc.&lt;br /&gt;&lt;br /&gt;Bueno para todas las personas que coincidan conmigo ¡Les tengo buenas noticas! he conocido y empezado a desarrollar con un framework que me ha encantado, es super fácil de usar y con unas pocas lineas puedes crear cosas muy estilizadas, ajax y simples. Ese framework se llama &lt;span style="font-weight: bold;"&gt;&lt;a href="http://es.wikipedia.org/wiki/JQuery"&gt;JQuery&lt;/a&gt; ¡&lt;/span&gt;y los invito a todos a probarlo! Para muestra de lo que pueden lograr luego de unas pocas horas de desarrollo y aprendizaje:&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.flashimagegallery.com/pics/artwork/"&gt;Galeria de imagenes on JQuery&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mind-projects.it/projects/jqzoom/demos.php#demo4"&gt;Zoom de secciones de imagenes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ericmmartin.com/simplemodal/"&gt;Ventanas emergentes dentro de la pagina&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://php.scripts.psu.edu/rja171/widgets/rating.php"&gt;Sencillo ratin o calificacion por estrellas (al estilo youtube)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Cuando se desarrolla bajo el framework de &lt;a href="http://es.wikipedia.org/wiki/JQuery"&gt;JQuery &lt;/a&gt;se tiene una arquitectura orientada a componentes al puro estilo de los &lt;a href="http://internetdeveloping.blogspot.com/2009/02/creacion-de-un-componente-flex.html"&gt;componentes Flex&lt;/a&gt; o los &lt;a href="http://www.desarrolloweb.com/articulos/657.php"&gt;ASP.NET Web Controls (Componentes ASP.NET)&lt;/a&gt;. Para los que no conozcan ninguna de estas dos arquitecturas tan populares imaginen un diseño de arquitectura como un formulario web, donde cada uno de los objetos del formulario (TexInput, RadioButton, CheckButton, TextArea, Button, etc) seria un componente programable que puede ser reutilizado N veces en el futuro, podrias crear tus propios y componentes mas avanzados. Una muestra de componentes creados con JQuery y muy sencillos de utilizar son los siguientes:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.kelvinluck.com/assets/jquery/datePicker/v2/demo/datePicker.html"&gt;Selector de Fecha reutilizable.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codylindley.com/blogstuff/js/jtip/"&gt;Tooltipo al colocar el mouse sobre un vinculo&lt;/a&gt; (prueben colocando el mouse sobre el signo de interrogacion)&lt;/li&gt;&lt;li&gt;Y todos los demas componentes que coloque arriba.&lt;/li&gt;&lt;/ul&gt;Para comenzar a desarrollar y aprender sobre este grandioso Framework de Javascript debemos descargar la ultima version de JQuery e incluirla en el heather de nuestro projecto. Para descargar la ultima version pueden ingresar al &lt;a href="http://docs.jquery.com/Downloading_jQuery"&gt;siguiente directorio&lt;/a&gt; y seleccionar la version mas resiente o &lt;a href="http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.3.2.min.js"&gt;hacer click directamente en este link&lt;/a&gt;. De todas maneras pronto empezare a realizar tutoriales sobre el desarrollo sobre el framework de JQuery y la utilizacion detallada de algunos de los componentes que ya he probado.&lt;br /&gt;&lt;br /&gt;Vinculos: &lt;a href="http://jquery.com/"&gt;Pagina oficial de JQuery&lt;/a&gt;.&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-8121804254561295909?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/8121804254561295909/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/05/jquery-framework-de-desarrollo-para.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/8121804254561295909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/8121804254561295909'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/05/jquery-framework-de-desarrollo-para.html' title='JQuery - Framework de desarrollo para Javascript'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_8AfDk4OYg00/Shy_US9sE3I/AAAAAAAAAPs/ye0rlXvxsBM/s72-c/jquery-logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-6867151027823905033</id><published>2009-05-24T13:54:00.022-04:30</published><updated>2009-05-26T23:10:44.932-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Cairngorm'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><title type='text'>Ejemplo Cairngorm - Agregar Contacto</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/ShyspJNsDDI/AAAAAAAAAPk/O1N0IpgZ63k/s1600-h/cairngorm.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 248px;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/ShyspJNsDDI/AAAAAAAAAPk/O1N0IpgZ63k/s320/cairngorm.png" alt="" id="BLOGGER_PHOTO_ID_5340333081002511410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Continuando la explicacion de Cairngorm realizada en la entrada anterior "&lt;a href="http://internetdeveloping.blogspot.com/2009/04/empezando-con-cairngorm-desarrollando.html"&gt;Empezando con Cairngorm - Desarrollando aplicaciones Flex&lt;/a&gt;" en este post vamos a realizar un ejemplo de agregar un usuario (contacto) a una agenda de contactos.&lt;br /&gt;&lt;br /&gt;Para empezar debemos descargarnos los códigos del ejemplo en el &lt;a href="http://ejemplos.net78.net/downloads/cont_descargas.php?archivo=CairngormDiagram.zip"&gt;siguiente vinculo&lt;/a&gt;, y cargarlos a nuestro entorno de desarrollo (En mi caso Eclipse). Una vez hecho esto se encontraran la siguiente ruta de carpetas dentro del directorio source: &lt;span style="font-style: italic;"&gt;com.adobe.cairngorm.samples.addcontact. &lt;/span&gt;Ubiquense en ese directorio y van a encontrar que el ejemplo esta dividido en varias carpetas: Businees, Command, Control, Model, View, VO. Estas divisiones se hace para darle un poco mas de claridad al codigo, yo agregaria una mas llamada "events" donde colocaria los eventos, pero eso es cuestion de gustos. Vamonos a la carpeta "View" y hacemos doble click sobre la vista AddContactPanel.mxml.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Panel&lt;br /&gt;xmlns:mx="http://www.adobe.com/2006/mxml"&lt;br /&gt;xmlns:view="com.adobe.cairngorm.samples.addcontact.view.*"&lt;br /&gt;title="MyContacts"&lt;br /&gt;horizontalAlign="left" height="350"&amp;gt;&lt;br /&gt;&amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;lt;![CDATA[&lt;br /&gt;&lt;br /&gt;import com.adobe.cairngorm.control.CairngormEventDispatcher;&lt;br /&gt;import com.adobe.cairngorm.samples.addcontact.control.AddContactEvent;&lt;br /&gt;import com.adobe.cairngorm.samples.addcontact.model.AddContact;&lt;br /&gt;import com.adobe.cairngorm.samples.addcontact.vo.ContactVO;&lt;br /&gt;import com.adobe.cairngorm.samples.addcontact.model.ModelLocator;&lt;br /&gt;import mx.collections.ArrayCollection;&lt;/p&gt;&lt;br /&gt;&lt;p&gt; [Bindable]&lt;br /&gt;public var addcontact : AddContact;&lt;br /&gt;&lt;br /&gt;[Bindable]&lt;br /&gt;public var contacts : ArrayCollection;&lt;br /&gt;&lt;br /&gt;public function addContact() : void&lt;br /&gt;{&lt;br /&gt;var contactVO : ContactVO = new ContactVO();&lt;br /&gt;contactVO.fullname = fullname.text;&lt;br /&gt;contactVO.emailaddress = emailaddress.text;&lt;br /&gt;&lt;br /&gt;var event : AddContactEvent = new AddContactEvent( contactVO );&lt;br /&gt;CairngormEventDispatcher.getInstance().dispatchEvent( event );&lt;br /&gt;}&lt;br /&gt;]]&amp;gt;&lt;br /&gt;&amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&amp;lt;mx:HBox height="100%"&amp;gt;&lt;br /&gt;&amp;lt;mx:VBox&amp;gt;&lt;br /&gt;&amp;lt;mx:Form id="addcontactForm"&amp;gt;&lt;br /&gt;&amp;lt;mx:HBox width="100%" horizontalAlign="left"&amp;gt;&lt;br /&gt;&amp;lt;mx:Text text="Add a Contact:"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:HBox&amp;gt;&lt;br /&gt;&amp;lt;mx:FormItem label="Name: "&amp;gt;&lt;br /&gt;&amp;lt;mx:TextInput id="fullname"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:FormItem&amp;gt;&lt;br /&gt;&amp;lt;mx:FormItem label="Email: "&amp;gt;&lt;br /&gt;&amp;lt;mx:TextInput id="emailaddress" displayAsPassword="true"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:FormItem&amp;gt;&lt;br /&gt;&amp;lt;mx:HBox width="100%" horizontalAlign="right"&amp;gt;&lt;br /&gt;&amp;lt;mx:Button label="AddContact" enabled="{ !addcontact.isPending }" click="addContact()"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:HBox&amp;gt;&lt;br /&gt;&amp;lt;/mx:Form&amp;gt;&lt;br /&gt;&amp;lt;mx:Text&lt;br /&gt;text="{ addcontact.statusMessage }"&lt;br /&gt;textAlign="center"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:VBox&amp;gt;&lt;br /&gt;&amp;lt;mx:VRule  height="100%" strokeColor="#DDDDDD"/&amp;gt;&lt;br /&gt;&amp;lt;mx:VBox paddingTop="15" paddingLeft="15" paddingRight="15" paddingBottom="15"&amp;gt;&lt;br /&gt;&amp;lt;mx:Text text="List of Contacts"/&amp;gt;&lt;br /&gt;&amp;lt;mx:List wordWrap="true" dataProvider="{contacts}" width="200" height="220"&amp;gt;&amp;lt;/mx:List&amp;gt;&lt;br /&gt;&amp;lt;mx:Button label="DeleteContact" textAlign="right"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:VBox&amp;gt;&lt;br /&gt;&amp;lt;/mx:HBox&amp;gt;&lt;br /&gt;&amp;lt;/mx:Panel&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Esta vista contiene el formulario para que el usuario final introduzca los datos del contacto que quiere agregar, lo importante a destacar en este archivo son las siguientes lineas:&lt;br /&gt;&lt;blockquote&gt;  public function addContact() : void&lt;br /&gt;{&lt;br /&gt;var contactVO : ContactVO = new ContactVO();&lt;br /&gt;contactVO.fullname = fullname.text;&lt;br /&gt;contactVO.emailaddress = emailaddress.text;&lt;br /&gt;&lt;br /&gt;var event : AddContactEvent = new AddContactEvent( contactVO );&lt;br /&gt;CairngormEventDispatcher.getInstance().dispatchEvent( event );&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8AfDk4OYg00/Shym5fY0SXI/AAAAAAAAAPM/Hyk-hrDIzZs/s1600-h/cairngormEvent.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 246px;" src="http://4.bp.blogspot.com/_8AfDk4OYg00/Shym5fY0SXI/AAAAAAAAAPM/Hyk-hrDIzZs/s320/cairngormEvent.png" alt="" id="BLOGGER_PHOTO_ID_5340326764762909042" border="0" /&gt;&lt;/a&gt;La funcion addContact se encarga de crear un objeto ContactVO llenandolo con la información introducida en el fomulario por el usuario. Luego crea y despacha un evento Cairngorm llamado AddContactEvent. Vamos a ubicarnos con el mismo esquema de la entrada "&lt;a href="http://internetdeveloping.blogspot.com/2009/04/empezando-con-cairngorm-desarrollando.html"&gt;Empezando con Cairngorm - Desarrollando aplicaciones Flex&lt;/a&gt;":&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;En este momento nos encontramos en el paso numero 1 del flujo. Todos los eventos despachados en Cairngorm deben heredar de la clase &lt;span style="font-weight: bold;"&gt;&lt;a href="http://www.cairngormdocs.org/docs/cairngorm_2_1/com/adobe/cairngorm/control/CairngormEvent.html"&gt;CairngormEvent&lt;/a&gt;, &lt;/span&gt;y, &lt;span style="font-weight: bold;"&gt;al momento de crearlos, debemos especificar en el controlador con que comando va asociado este evento&lt;/span&gt;, veamos el codigo de la clase AddContactEvent.cs:&lt;br /&gt;&lt;/div&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.adobe.cairngorm.samples.addcontact.control&lt;br /&gt;{&lt;br /&gt;import com.adobe.cairngorm.control.CairngormEvent;&lt;br /&gt;import com.adobe.cairngorm.samples.addcontact.vo.ContactVO;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* El evento se dispara cuando el usuario presiona "agregar contacto"&lt;br /&gt;*/&lt;br /&gt;public class AddContactEvent extends CairngormEvent&lt;br /&gt;{&lt;br /&gt;/**&lt;br /&gt;* El contacto que se desea agregar&lt;br /&gt;*/&lt;br /&gt;public var contactVO : ContactVO;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* El contructor, te obliga a especificar el contacto&lt;br /&gt;*/&lt;br /&gt;public function AddContactEvent( contactVO : ContactVO )&lt;br /&gt;{&lt;br /&gt;super( AddContactControl.EVENT_ADD_CONTACT );&lt;br /&gt;this.contactVO = contactVO;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Como pueden ver es un codigo bastante sencillo. Lo unico que debemos tomar en cuenta es heredar de la clase &lt;a href="http://www.cairngormdocs.org/docs/cairngorm_2_1/com/adobe/cairngorm/control/CairngormEvent.html"&gt;CairngormEvent &lt;/a&gt;y de especificar cualquier información que deseamos que este disponible en el comando o delegado o servicio (en este caso nos interesa tener el contacto que se va a agregar).&lt;br /&gt;&lt;br /&gt;Para hacer el vinculo entre el comando y el evento ahora debemos ir a la clase AddContactControl para realizar las especificaciones de la siguiente manera:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.adobe.cairngorm.samples.addcontact.control&lt;br /&gt;{&lt;br /&gt;import com.adobe.cairngorm.control.FrontController;&lt;br /&gt;import com.adobe.cairngorm.samples.addcontact.commands.AddContactCommand;&lt;br /&gt;&lt;br /&gt;public class AddContactControl extends FrontController&lt;br /&gt;{&lt;br /&gt;public function AddContactControl()&lt;br /&gt;{&lt;br /&gt;addCommand( AddContactControl.EVENT_ADD_CONTACT, AddContactCommand );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static const EVENT_ADD_CONTACT : String = "addcontact";&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="fullpost"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8AfDk4OYg00/Shymlb-88HI/AAAAAAAAAPE/2Q6QMLDoQuQ/s1600-h/caingormControl.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 246px;" src="http://4.bp.blogspot.com/_8AfDk4OYg00/Shymlb-88HI/AAAAAAAAAPE/2Q6QMLDoQuQ/s320/caingormControl.png" alt="" id="BLOGGER_PHOTO_ID_5340326420251734130" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="fullpost"&gt;En la linea addCommand( AddContactControl.EVENT_ADD_CONTACT, AddContactCommand ); realizamos el verdadero vinculo entre nuestro evento y el comando. Ahora debemos proceder a crear un comando para manejar las peticiones al servidor. En este momento nos encontramos en el paso dos del flujo Cairngorm, recuerden que &lt;span style="font-weight: bold;"&gt;es obligatorio hacer al menos una instancia del controlador en la aplicacion&lt;/span&gt;, ademas, este controlador debe heredar de la clase &lt;a href="http://www.cairngormdocs.org/docs/cairngorm_2_1/com/adobe/cairngorm/control/FrontController.html"&gt;FrontController&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Ahora debemos pasar al siguiente paso (crear un comando).  Los comandos implementan las interfaces  Command y Responder. &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_8AfDk4OYg00/ShymIDUC8gI/AAAAAAAAAO8/wv59aHpCapk/s1600-h/cairngormCommand.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 234px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/ShymIDUC8gI/AAAAAAAAAO8/wv59aHpCapk/s320/cairngormCommand.png" alt="" id="BLOGGER_PHOTO_ID_5340325915413115394" border="0" /&gt;&lt;/a&gt;Por ello deben tener tres metodos principales: execute, onResult y onFault. El primero de ellos es ejecutado automaticamente por el controlador cuando se dispara alguna evento que este enlazado con este comando, el segundo se ejecuta automaticamente una vez que el delegado ha concluido la ejecucion del servicio satisfactoriamente, el ultimo de estos metodos es igual al segundo, con la salvedad que se ejecuta cuando ocurrio algun error no controlado durante la ejecucion del servicio. Ese comando debe tener una instancia del modelo para poder insertar la informacion obtenida del servicio durante el paso 9 del diagrama de flujo.&lt;br /&gt;A continuacion el codigo del comando:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.adobe.cairngorm.samples.addcontact.commands&lt;br /&gt;{&lt;br /&gt;import mx.rpc.events.ResultEvent;&lt;br /&gt;import com.adobe.cairngorm.business.Responder;&lt;br /&gt;import com.adobe.cairngorm.commands.Command;&lt;br /&gt;import com.adobe.cairngorm.control.CairngormEvent;&lt;br /&gt;import com.adobe.cairngorm.samples.addcontact.business.AddContactDelegate;&lt;br /&gt;import com.adobe.cairngorm.samples.addcontact.control.AddContactEvent;&lt;br /&gt;import com.adobe.cairngorm.samples.addcontact.model.ModelLocator;&lt;br /&gt;import com.adobe.cairngorm.samples.addcontact.vo.ContactVO;&lt;br /&gt;&lt;br /&gt;public class AddContactCommand implements Command, Responder&lt;br /&gt;{&lt;br /&gt;private var model : ModelLocator = ModelLocator.getInstance();&lt;br /&gt;&lt;br /&gt;public function execute( event : CairngormEvent ) : void&lt;br /&gt;{&lt;br /&gt;model.addcontact.isPending = true;&lt;br /&gt;var delegate : AddContactDelegate = new AddContactDelegate( this );&lt;br /&gt;var addcontactEvent : AddContactEvent = AddContactEvent( event );&lt;br /&gt;delegate.addcontact( addcontactEvent.contactVO );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public function onResult( event : * = null ) : void&lt;br /&gt;{&lt;br /&gt;model.addcontact.contactVO = ContactVO( event );&lt;br /&gt;model.addcontact.isPending = false;&lt;br /&gt;&lt;br /&gt;//Simplify - Used an array of strings instead of ContactVO's&lt;br /&gt;model.contacts.addItem(ContactVO(event).fullname+" "+ContactVO(event).emailaddress);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public function onFault( event : * = null ) : void&lt;br /&gt;{&lt;br /&gt;model.addcontact.statusMessage = "Could not send contact information to the server.";&lt;br /&gt;model.addcontact.isPending = false;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8AfDk4OYg00/ShyqQKSVVYI/AAAAAAAAAPU/Rf01W2yxBn4/s1600-h/cairngormDelegate.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 234px;" src="http://4.bp.blogspot.com/_8AfDk4OYg00/ShyqQKSVVYI/AAAAAAAAAPU/Rf01W2yxBn4/s320/cairngormDelegate.png" alt="" id="BLOGGER_PHOTO_ID_5340330452770444674" border="0" /&gt;&lt;/a&gt;Para el siguiente paso debemos crear nuestra clase delegate (Delegado). Los delegados son los encargados de ejecutar los servicios que se encuentren definidos en el Localizador de servicio (&lt;a href="http://www.cairngormdocs.org/docs/cairngorm_2_1/com/adobe/cairngorm/business/ServiceLocator.html"&gt;ServiceLocator&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Para crear nuestro delegado debemos crear una clase que tenga los siguientes atributos globales:&lt;br /&gt;&lt;blockquote&gt;private var responder : Responder;&lt;br /&gt;private var service : Object;&lt;/blockquote&gt;El primero de ellos es una instacia del Comando que acabamos de agregar en el paso anterior, nos permitirar llamar a los metodos onResult y onFault dependiendo de la ejecucion del servicio. Debemos crear un metodo para cada servicio asociado con este delegado, en el ejemplo actual no tenemos ningún servicio asociado en el Localizador de Servicios, por lo que vamos a finjir la ejecucion de uno, utilizando un timer de 2 segundos (2000 Milisegundos). A continuacion el codigo de la clase AddContactDelegate.cs:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.adobe.cairngorm.samples.addcontact.business&lt;br /&gt;{&lt;br /&gt;import com.adobe.cairngorm.business.Responder;&lt;br /&gt;import com.adobe.cairngorm.business.ServiceLocator;&lt;br /&gt;import com.adobe.cairngorm.samples.addcontact.vo.ContactVO;&lt;br /&gt;&lt;br /&gt;import flash.utils.setTimeout;&lt;br /&gt;&lt;br /&gt;import mx.rpc.AsyncToken;&lt;br /&gt;import mx.rpc.events.ResultEvent;&lt;br /&gt;&lt;br /&gt;public class AddContactDelegate&lt;br /&gt;{&lt;br /&gt;private var responder : Responder;&lt;br /&gt;private var service : Object;&lt;br /&gt;&lt;br /&gt;public function AddContactDelegate( responder : Responder )&lt;br /&gt;{&lt;br /&gt;//this.service = ServiceLocator.getInstance().getService( "addcontactService" );&lt;br /&gt;this.responder = responder;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public function addcontact( contactVO : ContactVO ): void&lt;br /&gt;{&lt;br /&gt;//var token : AsyncToken = service.addcontact( contactVO );&lt;br /&gt;//token.resultHandler = responder.onResult;&lt;br /&gt;//token.faultHandler = responder.onFault;&lt;br /&gt;&lt;br /&gt;//for demo purpose: simulate remote service result&lt;br /&gt;setTimeout( addcontactResult, 1000, contactVO );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function addcontactResult( contactVO : ContactVO ): void&lt;br /&gt;{&lt;br /&gt;if( 1 )&lt;br /&gt;{&lt;br /&gt; responder.onResult( contactVO );&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt; responder.onFault();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8AfDk4OYg00/Shyq6zp2fwI/AAAAAAAAAPc/rYfdE3ElnGQ/s1600-h/cairngormServiceLocator.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 234px;" src="http://4.bp.blogspot.com/_8AfDk4OYg00/Shyq6zp2fwI/AAAAAAAAAPc/rYfdE3ElnGQ/s320/cairngormServiceLocator.png" alt="" id="BLOGGER_PHOTO_ID_5340331185429446402" border="0" /&gt;&lt;/a&gt;Por ultimo nos queda el archivo Services.mxml que hereda de la clase &lt;a href="http://www.cairngormdocs.org/docs/cairngorm_2_1/com/adobe/cairngorm/business/ServiceLocator.html"&gt;ServiceLocator&lt;/a&gt;, este, es el Localizador de servicios de la aplicacion, debemos tener todos nuestros objetos remotos, metodos remotos, etc. Definidos en este archivo. En el este ejemplo se encuentra comentada una declaracion de un objeto remoto como ejemplo.&lt;br /&gt;&lt;pre name="code" class="html"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;cairngorm:ServiceLocator&lt;br /&gt;xmlns:mx="http://www.adobe.com/2006/mxml"&lt;br /&gt;xmlns:cairngorm="com.adobe.cairngorm.business.*"&amp;gt;&lt;br /&gt;&amp;lt;!--commented for demo--&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;&amp;lt;mx:RemoteObject&lt;br /&gt;id="addcontactService"&lt;br /&gt;destination="addcontactService"&lt;br /&gt;showBusyCursor="true"&lt;br /&gt;result="event.token.resultHandler( event );"&lt;br /&gt;fault="event.token.faultHandler( event );"&amp;gt;&lt;br /&gt;&amp;lt;/mx:RemoteObject&amp;gt;&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;/cairngorm:ServiceLocator&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Tambien debemos hacer una instancia de este ServiceLocator en el inicio de ejecucion del proyecto. En resumen debemos hacer instancias de los siguientes componentes antes de iniciar la ejecucion de las funcionalidades del proyecto:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Controlador: AddContactControl en este ejemplo.&lt;/li&gt;&lt;li&gt;ServiceLocator: Services en este ejemplo.&lt;/li&gt;&lt;li&gt;ModelLocator: Se llama ModelLocator tambien en este proyecto.&lt;/li&gt;&lt;/ul&gt;Para que visualizen mejor como hacer las instancias que acabo de mencionar vamos a observar el codigo de la clase Applicacion del ejemplo:&lt;br /&gt;&lt;pre name="code" class="html"&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Panel&lt;br /&gt;xmlns:mx="http://www.adobe.com/2006/mxml"&lt;br /&gt;xmlns:view="com.adobe.cairngorm.samples.addcontact.view.*"&lt;br /&gt;title="MyContacts"&lt;br /&gt;horizontalAlign="left" height="350"&amp;gt;&lt;br /&gt;&amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;lt;![CDATA[&lt;br /&gt;&lt;br /&gt;import com.adobe.cairngorm.control.CairngormEventDispatcher;&lt;br /&gt;import com.adobe.cairngorm.samples.addcontact.control.AddContactEvent;&lt;br /&gt;import com.adobe.cairngorm.samples.addcontact.model.AddContact;&lt;br /&gt;import com.adobe.cairngorm.samples.addcontact.vo.ContactVO;&lt;br /&gt;import com.adobe.cairngorm.samples.addcontact.model.ModelLocator;&lt;br /&gt;import mx.collections.ArrayCollection;&lt;/p&gt;&lt;br /&gt;&lt;p&gt; [Bindable]&lt;br /&gt;public var addcontact : AddContact;&lt;br /&gt;&lt;br /&gt;[Bindable]&lt;br /&gt;public var contacts : ArrayCollection;&lt;br /&gt;&lt;br /&gt;public function addContact() : void&lt;br /&gt;{&lt;br /&gt;var contactVO : ContactVO = new ContactVO();&lt;br /&gt;contactVO.fullname = fullname.text;&lt;br /&gt;contactVO.emailaddress = emailaddress.text;&lt;br /&gt;&lt;br /&gt;var event : AddContactEvent = new AddContactEvent( contactVO );&lt;br /&gt;CairngormEventDispatcher.getInstance().dispatchEvent( event );&lt;br /&gt;}&lt;br /&gt;]]&amp;gt;&lt;br /&gt;&amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&amp;lt;mx:HBox height="100%"&amp;gt;&lt;br /&gt;&amp;lt;mx:VBox&amp;gt;&lt;br /&gt;&amp;lt;mx:Form id="addcontactForm"&amp;gt;&lt;br /&gt;&amp;lt;mx:HBox width="100%" horizontalAlign="left"&amp;gt;&lt;br /&gt;&amp;lt;mx:Text text="Add a Contact:"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:HBox&amp;gt;&lt;br /&gt;&amp;lt;mx:FormItem label="Name: "&amp;gt;&lt;br /&gt;&amp;lt;mx:TextInput id="fullname"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:FormItem&amp;gt;&lt;br /&gt;&amp;lt;mx:FormItem label="Email: "&amp;gt;&lt;br /&gt;&amp;lt;mx:TextInput id="emailaddress" displayAsPassword="true"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:FormItem&amp;gt;&lt;br /&gt;&amp;lt;mx:HBox width="100%" horizontalAlign="right"&amp;gt;&lt;br /&gt;&amp;lt;mx:Button label="AddContact" enabled="{ !addcontact.isPending }" click="addContact()"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:HBox&amp;gt;&lt;br /&gt;&amp;lt;/mx:Form&amp;gt;&lt;br /&gt;&amp;lt;mx:Text&lt;br /&gt;text="{ addcontact.statusMessage }"&lt;br /&gt;textAlign="center"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:VBox&amp;gt;&lt;br /&gt;&amp;lt;mx:VRule  height="100%" strokeColor="#DDDDDD"/&amp;gt;&lt;br /&gt;&amp;lt;mx:VBox paddingTop="15" paddingLeft="15" paddingRight="15" paddingBottom="15"&amp;gt;&lt;br /&gt;&amp;lt;mx:Text text="List of Contacts"/&amp;gt;&lt;br /&gt;&amp;lt;mx:List wordWrap="true" dataProvider="{contacts}" width="200" height="220"&amp;gt;&amp;lt;/mx:List&amp;gt;&lt;br /&gt;&amp;lt;mx:Button label="DeleteContact" textAlign="right"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:VBox&amp;gt;&lt;br /&gt;&amp;lt;/mx:HBox&amp;gt;&lt;br /&gt;&amp;lt;/mx:Panel&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Fijense que aparte de hacer todas las instancias necesarias, tambien le decimos al datagrid que debe enlazar (Binding) su dataprovider con el objeto "contacts" del ModelLocator (model), esto lo hacemos para que cada vez que actualizamos este modelo de datos, se actualice esta vista (el datagrid se llena con exactamente la misma data que tenga model.contacts).&lt;br /&gt;&lt;br /&gt;Una vez llamado el servicio y ejecutado correctamente la respuesta de este, nos llegara automaticamente al comando que definimos (AddContactCommand.cs). La respuesta se vera reflejada en el metodo "onResult" donde debemos utilizar la instancia del modelo que tenemos para agregar los datos obtenidos en el modelo de datos, de esta manera la vista se actualizara automaticamente gracias al &lt;a href="http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&amp;amp;file=databinding_091_02.html"&gt;binding automatico&lt;/a&gt;. Los pasos 6,7,8 y 9 del flujo se ejecutan muy rápidamente como pueden darse cuenta, todo gracias a las configuraciones y métodos de programacion utilizados en la arquitectura. A continuacion les dejo el ejemplo funcionando y un vinculo para descargar el codigo fuente. Cualquier pregunta no duden de escribirla en los comentarios de este post.&lt;br /&gt;&lt;embed pluginspage=" http://www.macromedia.com/go/getflashplayer" src="http://ejemplos.net78.net/swf/CairngormDiagram.swf" height="600" width="600"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;a href="http://ejemplos.net78.net/downloads/cont_descargas.php?archivo=CairngormDiagram.zip"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 125px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SSDhcJ7C_NI/AAAAAAAAAI8/gGFwsT168AY/s400/descargar.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459437839645906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-6867151027823905033?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/6867151027823905033/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/05/ejemplo-cairngorm-agregar-contacto.html#comment-form' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/6867151027823905033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/6867151027823905033'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/05/ejemplo-cairngorm-agregar-contacto.html' title='Ejemplo Cairngorm - Agregar Contacto'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_8AfDk4OYg00/ShyspJNsDDI/AAAAAAAAAPk/O1N0IpgZ63k/s72-c/cairngorm.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-6221014910682361247</id><published>2009-04-29T21:10:00.010-04:30</published><updated>2009-05-27T00:14:12.836-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Cairngorm'/><category scheme='http://www.blogger.com/atom/ns#' term='patrones de diseño'/><title type='text'>Empezando con Cairngorm - Desarrollando aplicaciones Flex</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_8AfDk4OYg00/Shhkfx27KaI/AAAAAAAAAOc/ZuW51cewp9U/s1600-h/cairngorm.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 155px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/Shhkfx27KaI/AAAAAAAAAOc/ZuW51cewp9U/s200/cairngorm.png" alt="" id="BLOGGER_PHOTO_ID_5339127855370152354" border="0" /&gt;&lt;/a&gt;Probablemente todos los que hemos estado por un buen rato metidos en el mundo de Flex hemos escuchado algunas ves sobre el framwerok para desarrollar a aplicaciones &lt;a href="http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm;jsessionid=E4FE90EABC7DE0B7A710F9076C0419BB"&gt;&lt;span style="font-weight: bold;"&gt;Cairngorm&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Para los que no lo han escuchado dejenme explicarles un poco cual es su utilidad: Cuando desarrollas utilizando este framework te vez obligado a cumplir con una serie de normas (&lt;a href="http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o"&gt;Patrones de diseño&lt;/a&gt;) que brindan una infinidad de ventajas a largo plazo dentro de tu aplicacion. Por ejemplo: El estar dividido en 8 capaz te permite llevar una mejor organizacion del codigo, permite que varias personas trabajen de manera colaborativa al separar eficazmente la capa de datos de la aplicacion (bien sea con objetos remotos, http service, xml, etc) de la capa de presentacion, permite que nuevos integrantes que conozcan el framework se incorporen mucho mas rapidamente al ser un estandar, se reutiliza mucho el codigo. En fin, muchisimas ventajas, dejen que lo empiezen a usar para que vean que al final no van a poder dejar de usarlo.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;¿Como esta dividido Cairngorm?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Una aplicacion realizada bajo Cairngorm tiene 8 capaz principales: Vista, Evento, Controlador, Comando, Delegado, Ubicador de servicios, modelo y los servicios de datos:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Vista: Son todos los formularios, la capa de presentacion de la aplicacion, lo que el usuario final ve.&lt;/li&gt;&lt;li&gt;Evento: Recordemos que lex utiliza la programacion orientada a eventos, son el vinculo entre la vista y el comando.&lt;/li&gt;&lt;li&gt;Controlador: Enruta los diferentes eventos posibles de la aplicacion con los diferentes comandos.&lt;/li&gt;&lt;li&gt;Comando: Realiza 3 acciones principales, execute, que ejecuta el metodo del delegado deseado. "result" que se ejecuta cuando se recive la respuesta del servidor correctamente y "fault" que se ejecuta si ocurre alguna exepcion durante la ejecucion del delegado y servicio. En el metodo "result" se debe introducir los datos en el modelo para que las vistas sean actualizadas.&lt;/li&gt;&lt;li&gt;Delegado: Existen muchos metodos para un objeto remoto, el delegado es el encargado de llamarlos, es un vinculo entre el comando y el servicio.&lt;/li&gt;&lt;li&gt;Ubicador de servicios: aqui se realizan todas las definiciones de los objetos, metodos o servicios que se van a utilizar. Se coloca la ruta del servidor donde son expuestos estos servicioes, etc.&lt;/li&gt;&lt;li&gt;Modelo: Contiene todos los datos de la aplicacion, un diagrama de clases, entidades.&lt;/li&gt;&lt;li&gt;Los servicios: Deben ser creados en un servidor, lenguaje java, php, c#, etc. Ese servidor contiene la BD.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Ejemplo de caso de uso con Cairngorm:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8AfDk4OYg00/ShhZ_pDPlqI/AAAAAAAAAOM/XMRceFSAPrI/s1600-h/cairngorm.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 310px;" src="http://4.bp.blogspot.com/_8AfDk4OYg00/ShhZ_pDPlqI/AAAAAAAAAOM/XMRceFSAPrI/s400/cairngorm.png" alt="" id="BLOGGER_PHOTO_ID_5339116308133811874" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Vamos a colocar el siguiente ejemplo basado en la grafica de arriba: El usuario desea guardar un paciente en la base de datos, para que eso suceda debe existir un formulario de introducccion de los datos del paciente (esa seria la "&lt;span style="color: rgb(255, 102, 0); font-weight: bold;"&gt;vista&lt;/span&gt;"), una vez que el usuario llena los datos del paciente oprime el botón "guardar" (en ese momento el programador debe disparar un "&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;evento&lt;/span&gt;" con los datos del paciente), el "&lt;span style="font-weight: bold;"&gt;controlador&lt;/span&gt;" es el encargado de enrutar ese evento hacia el "&lt;span style="color: rgb(153, 0, 0); font-weight: bold;"&gt;comando&lt;/span&gt;" mas adecuado (El comando debe manejar las ejecuciones o fallos de los servicios) luego el comando llama a un "&lt;span style="font-weight: bold; color: rgb(0, 102, 0);"&gt;delegado&lt;/span&gt;"donde se hace un llamado al objeto remoto segun las definiciones que se hayan realizado en el &lt;span style="color: rgb(51, 153, 153); font-weight: bold;"&gt;"manejador de servicios".  &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Luego de recibir la respuesta del servicio (recuerden que la respuesta la debe manejar el "&lt;span style="color: rgb(153, 0, 0); font-weight: bold;"&gt;comando&lt;/span&gt;"), el "&lt;span style="color: rgb(153, 0, 0); font-weight: bold;"&gt;comando&lt;/span&gt;" se encarga de agregar dentro del &lt;span style="color: rgb(102, 51, 102); font-weight: bold;"&gt;"modelo" &lt;/span&gt;la informacion recibida, y como el "&lt;span style="color: rgb(102, 51, 102); font-weight: bold;"&gt;modelo&lt;/span&gt;" esta sincronizado (binding) con la vista, entonces la vista se actualiza automaticamente sin requerir nungina accion del programador.&lt;br /&gt;&lt;br /&gt;Probablemente no les haya quedado nada claro, es un poco dificil de entender al principio, y puede parecer que son demasiadas cosas para una accion tan simple como "insertar un paciente en la base de datos". Para entenderlo muchisimo mejor vamos a &lt;a href="http://internetdeveloping.blogspot.com/2009/05/ejemplo-cairngorm-agregar-contacto.html"&gt;explicar el ejemplo pero esta vez con el codigo y su ejecucion&lt;/a&gt;. Pero eso lo haremos en otro tutorial por razones didacticas (para entrar a el tutorial "&lt;a href="http://internetdeveloping.blogspot.com/2009/05/ejemplo-cairngorm-agregar-contacto.html"&gt;Ejemplo Cairngorm - Agregar Contacto&lt;/a&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;" haz &lt;a href="http://internetdeveloping.blogspot.com/2009/05/ejemplo-cairngorm-agregar-contacto.html"&gt;click aqui&lt;/a&gt;), no se preocupen que una vez que lo entiendan van a ver que es fácil y útil. Para bajarse la libreria de &lt;/span&gt;&lt;/span&gt;Cairngorm hagan &lt;a href="http://opensource.adobe.com/wiki/display/cairngorm/Downloads"&gt;click aqui&lt;/a&gt; y seleccionen la última version.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-6221014910682361247?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/6221014910682361247/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/04/empezando-con-cairngorm-desarrollando.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/6221014910682361247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/6221014910682361247'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/04/empezando-con-cairngorm-desarrollando.html' title='Empezando con Cairngorm - Desarrollando aplicaciones Flex'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_8AfDk4OYg00/Shhkfx27KaI/AAAAAAAAAOc/ZuW51cewp9U/s72-c/cairngorm.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-1149206245960780800</id><published>2009-04-27T10:33:00.004-04:30</published><updated>2009-06-04T13:27:39.768-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='panel'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='eventos'/><title type='text'>Expandir, Contraer, Cerrar, cambiar tamaño y mover un Panel</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8AfDk4OYg00/SfCFZzgWNzI/AAAAAAAAANk/_cq7VuwcPXM/s1600-h/superpanel.PNG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 224px; height: 203px;" src="http://4.bp.blogspot.com/_8AfDk4OYg00/SfCFZzgWNzI/AAAAAAAAANk/_cq7VuwcPXM/s320/superpanel.PNG" alt="" id="BLOGGER_PHOTO_ID_5327905037548402482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Una de las funcionalidades mas buscadas en un panel son CERRAR, EXPANDIR, CONTRAER Y RESIZE. En este tutorial vamos a explicar su implementacion en un Panel clásico del framework de flex. Utilizando un una clase llamada SuperPanel hecha por &lt;a href="http://www.wietseveenstra.nl/"&gt;Wietse Veenstra&lt;/a&gt; y publicada en su blog.&lt;br /&gt;&lt;br /&gt;Para empezar debemos tener en nuestro proyecto la clase SuperPanel.as y cada vez que queramos utilizarla en vez de crear un panel de tipo mx.Containers.Panel debemos crear un panel tipo SuperPanel.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;Es importante resaltar que la clase SuperPanel hereda directamente de la clase panel, por lo tanto es un panel en si mismo y Flex lo reconoce como un panel, con todos sus comportamientos naturales, mas lo que vamos a ver a continuacion.&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;Antes de empezar les coloco un demo de la aplicación y el link para que puedan descargar el &lt;a href="http://ejemplos.net78.net/downloads/cont_descargas.php?archivo=SuperPanelDemo.rar"&gt;codigo fuente&lt;/a&gt; que vamos a estar utilizando en este tutorial.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;embed pluginspage=" http://www.macromedia.com/go/getflashplayer" src="http://ejemplos.net78.net/flex/superpanel/SuperPanelDemo.swf" width="600" height="300"&gt;&lt;/embed&gt;&lt;br /&gt;Lo pimero que debemos hacer es ir al metodo createChildren(), por ser este, el primer método que se invoca en el ciclo de vida del SuperPanel.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;override protected function createChildren():void {&lt;br /&gt;super.createChildren();&lt;br /&gt;this.pTitleBar = super.titleBar;&lt;br /&gt;this.setStyle("headerColors", [0xC3D1D9, 0xD2DCE2]);&lt;br /&gt;this.setStyle("borderColor", 0xD2DCE2);&lt;br /&gt;this.doubleClickEnabled = true;&lt;br /&gt;&lt;br /&gt;if (enableResize) {&lt;br /&gt;this.resizeHandler.width     = 12;&lt;br /&gt;this.resizeHandler.height    = 12;&lt;br /&gt;this.resizeHandler.styleName = "resizeHndlr";&lt;br /&gt;this.rawChildren.addChild(resizeHandler);&lt;br /&gt;this.initPos();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (showControls) {&lt;br /&gt;this.normalMaxButton.width      = 10;&lt;br /&gt;this.normalMaxButton.height     = 10;&lt;br /&gt;this.normalMaxButton.styleName  = "increaseBtn";&lt;br /&gt;this.closeButton.width       = 10;&lt;br /&gt;this.closeButton.height      = 10;&lt;br /&gt;this.closeButton.styleName   = "closeBtn";&lt;br /&gt;this.pTitleBar.addChild(this.normalMaxButton);&lt;br /&gt;this.pTitleBar.addChild(this.closeButton);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;this.positionChildren();&lt;br /&gt;this.addListeners();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Lo primero que hacemos en este metodo es definir la apariencia del panel le colocamos un color al header y un color al borde, luego habilitamos que se pueda hacer dobleclick (hay que recordar que el evento doble click solo se dispara si la propiedad&lt;span style="font-family:monospace;"&gt; &lt;/span&gt;doubleClickEnabled es igual a true, por eso la estamos haciendo true) al hacer doble click sobre el titulo del panel, este ultimo se contraerá.&lt;br /&gt;&lt;br /&gt;Luego pueden notar los dos condicionales, uno para saber si esta habilido el comportamiento resize y otro para verificar si esta habilitado el comportamiento de cerrar, espandir y contraer. En el caso de que enable resize este "verdadero" entonces se colocara el botón en la esquina inferior derecha del componente (en el metodo initPos se verifica cuales son las cordenadas de esa esquina). Si la propiedad showControls es verdadera entonces se colocan los botones cerrar y expandir sobre &lt;span style="font-weight: bold;"&gt;dentro de la barra de titulo del panel&lt;/span&gt;.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public function positionChildren():void {&lt;br /&gt;if (showControls) {&lt;br /&gt;this.normalMaxButton.buttonMode    = true;&lt;br /&gt;this.normalMaxButton.useHandCursor = true;&lt;br /&gt;this.normalMaxButton.x = this.unscaledWidth - this.normalMaxButton.width - 24;&lt;br /&gt;this.normalMaxButton.y = 8;&lt;br /&gt;this.closeButton.buttonMode    = true;&lt;br /&gt;this.closeButton.useHandCursor = true;&lt;br /&gt;this.closeButton.x = this.unscaledWidth - this.closeButton.width - 8;&lt;br /&gt;this.closeButton.y = 8;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (enableResize) {&lt;br /&gt;this.resizeHandler.y = this.unscaledHeight - resizeHandler.height - 1;&lt;br /&gt;this.resizeHandler.x = this.unscaledWidth - resizeHandler.width - 1;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public function addListeners():void {&lt;br /&gt;this.addEventListener(MouseEvent.CLICK, panelClickHandler);&lt;br /&gt;this.pTitleBar.addEventListener(MouseEvent.MOUSE_DOWN, titleBarDownHandler);&lt;br /&gt;this.pTitleBar.addEventListener(MouseEvent.DOUBLE_CLICK, titleBarDoubleClickHandler);&lt;br /&gt;&lt;br /&gt;if (showControls) {&lt;br /&gt;this.closeButton.addEventListener(MouseEvent.CLICK, closeClickHandler);&lt;br /&gt;this.normalMaxButton.addEventListener(MouseEvent.CLICK, normalMaxClickHandler);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (enableResize) {&lt;br /&gt;this.resizeHandler.addEventListener(MouseEvent.MOUSE_OVER, resizeOverHandler);&lt;br /&gt;this.resizeHandler.addEventListener(MouseEvent.MOUSE_OUT, resizeOutHandler);&lt;br /&gt;this.resizeHandler.addEventListener(MouseEvent.MOUSE_DOWN, resizeDownHandler);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El metodo "positionChildren" se encarga de ubicar a los botones de cerrar, expandir, contraer y cambiar tamaño dentro del panel.&lt;br /&gt;&lt;br /&gt;El el segundo metodo addListeners() se encarga de iniciar los "Listeners" o "Escuchadores" que monitorearán cuando algun click, dobleclick o drag ocurra sobre los botones que recien acabamos de agregar en el metodo createChildren().&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public function panelClickHandler(event:MouseEvent):void {&lt;br /&gt;this.pTitleBar.removeEventListener(MouseEvent.MOUSE_MOVE, titleBarMoveHandler);&lt;br /&gt;this.parent.setChildIndex(this, this.parent.numChildren - 1);&lt;br /&gt;this.panelFocusCheckHandler();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public function titleBarDownHandler(event:MouseEvent):void {&lt;br /&gt;this.pTitleBar.addEventListener(MouseEvent.MOUSE_MOVE, titleBarMoveHandler);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public function titleBarMoveHandler(event:MouseEvent):void {&lt;br /&gt;if (this.width &amp;lt; screen.width) {&lt;br /&gt;Application.application.parent.addEventListener(MouseEvent.MOUSE_UP, titleBarDragDropHandler);&lt;br /&gt;this.pTitleBar.addEventListener(DragEvent.DRAG_DROP,titleBarDragDropHandler);&lt;br /&gt;this.parent.setChildIndex(this, this.parent.numChildren - 1);&lt;br /&gt;this.panelFocusCheckHandler();&lt;br /&gt;this.alpha = 0.5;&lt;br /&gt;this.startDrag(false, new Rectangle(0, 0, screen.width - this.width, screen.height - this.height));&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public function titleBarDragDropHandler(event:MouseEvent):void {&lt;br /&gt;this.pTitleBar.removeEventListener(MouseEvent.MOUSE_MOVE, titleBarMoveHandler);&lt;br /&gt;this.alpha = 1.0;&lt;br /&gt;this.stopDrag();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public function panelFocusCheckHandler():void {&lt;br /&gt;for (var i:int = 0; i &amp;lt; this.parent.numChildren; i++) {&lt;br /&gt;var child:UIComponent = UIComponent(this.parent.getChildAt(i));&lt;br /&gt;if (this.parent.getChildIndex(child) &amp;lt; this.parent.numChildren - 1) {&lt;br /&gt; child.setStyle("headerColors", [0xC3D1D9, 0xD2DCE2]);&lt;br /&gt; child.setStyle("borderColor", 0xD2DCE2);&lt;br /&gt;} else if (this.parent.getChildIndex(child) == this.parent.numChildren - 1) {&lt;br /&gt; child.setStyle("headerColors", [0xC3D1D9, 0x5A788A]);&lt;br /&gt; child.setStyle("borderColor", 0x5A788A);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Luego de iniciar todos los listeners y variables del panel tenemos los handlers (métodos) que se ejecutarán cuando ocurran los eventos que empezamos a escuchar. El primero de estos &lt;span style="font-family:monospace;"&gt;"&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;panelClickHandler&lt;/span&gt;" se encarga de darle el foco al panel que el usuario le acaba de dar "click", lo trae al frente de los otros panels.&lt;br /&gt;&lt;br /&gt;El segundo método &lt;span style="font-weight: bold;"&gt;"titleBarDownHandler" &lt;/span&gt;se ejecuta cuando el usuario hace un MOUSE_DOWN sobre el titlebar y se encarga de empezar a escuchar el MOUSE_MOVE para mover el panel junto con el mouse mientras se mantenga presionado el boton de este ultimo (una implementacion de drag and drop).&lt;br /&gt;&lt;br /&gt;El tercer metodo &lt;span style="font-weight: bold;"&gt;"TitleBarMoveHandler" &lt;/span&gt;es el encargado de iniciar el drag para mover el panel, se ejecuta cuando el listener recien agregado en el "&lt;span style="font-weight: bold;"&gt;titleBarDownHandler" &lt;/span&gt;detecta un movimiento del mouse, este método tambien escucha un MOUSE_UP para terminar con el drag and drop y si usuario deja de presionar el botón del mouse.&lt;br /&gt;&lt;br /&gt;El cuarto metódo &lt;span style="font-weight: bold;"&gt;"titleBarDragDropHandler" &lt;/span&gt;se encarga de terminer el drag and drop del panel, y se ejecuta cuando ocurre un MOUSE_UP. Por último el metodo "panelFocusCheckHandler" le camiba la apariencia al panel segun si tiene o no tiene el foco del mouse.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt; public function titleBarDoubleClickHandler(event:MouseEvent):void {&lt;br /&gt;     this.pTitleBar.removeEventListener(MouseEvent.MOUSE_MOVE, titleBarMoveHandler);&lt;br /&gt;     Application.application.parent.removeEventListener(MouseEvent.MOUSE_UP, resizeUpHandler);&lt;br /&gt;&lt;br /&gt;     this.upMotion.target = this;&lt;br /&gt;     this.upMotion.duration = 300;&lt;br /&gt;     this.upMotion.heightFrom = oH;&lt;br /&gt;     this.upMotion.heightTo = 28;&lt;br /&gt;     this.upMotion.end();&lt;br /&gt;&lt;br /&gt;     this.downMotion.target = this;&lt;br /&gt;     this.downMotion.duration = 300;&lt;br /&gt;     this.downMotion.heightFrom = 28;&lt;br /&gt;     this.downMotion.heightTo = oH;&lt;br /&gt;     this.downMotion.end();&lt;br /&gt;&lt;br /&gt;     if (this.width &lt; height ="=" visible =" false;" visible =" true;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;En el código de arriba encontramos la implementación del efecto de minimizar cuando hacemos dobleclick sobre el título del panel. El método titleBarDoubleClickHandler se encarga de definir los valores iniciales para los efectos Resize que se definieron al inicio de la clase, estos efectos cambian la altura del panel hasta contraerlo completamente, quedando solo visible la barra del titulo, o visceversa.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;   public function normalMaxClickHandler(event:MouseEvent):void {&lt;br /&gt;       if (this.normalMaxButton.styleName == "increaseBtn") {&lt;br /&gt;           if (this.height &gt; 28) {&lt;br /&gt;               this.initPos();&lt;br /&gt;               this.x = 0;&lt;br /&gt;               this.y = 0;&lt;br /&gt;               this.width = screen.width;&lt;br /&gt;               this.height = screen.height;&lt;br /&gt;               this.normalMaxButton.styleName = "decreaseBtn";&lt;br /&gt;               this.positionChildren();&lt;br /&gt;           }&lt;br /&gt;       } else {&lt;br /&gt;           this.x = this.oX;&lt;br /&gt;           this.y = this.oY;&lt;br /&gt;           this.width = this.oW;&lt;br /&gt;           this.height = this.oH;&lt;br /&gt;           this.normalMaxButton.styleName = "increaseBtn";&lt;br /&gt;           this.positionChildren();&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public function closeClickHandler(event:MouseEvent):void {&lt;br /&gt;       this.removeEventListener(MouseEvent.CLICK, panelClickHandler);&lt;br /&gt;       this.parent.removeChild(this);&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Estos dos metodos son los encarcados de las funciones de expandir, contraer y cerrar el panel, el primero de ellos se ejecuta cuando se hace click sobre el botón "normalMaxButton" y lo primero que hace es detectar si el panel se encuentra expandido o contraido y luego ejecuta el codigo para expandir o contraer el codigo segun el caso. El segundo metodo "closeClickHandler" se llama cuando el usuario hace click sobre el botón cerrar, este metodo elimina el listener sobre el evento click que habiamos definido durante la funcion create children y hace que el panel se auto elimine.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;   public function resizeOverHandler(event:MouseEvent):void {&lt;br /&gt;       this.resizeCur = CursorManager.setCursor(resizeCursor);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public function resizeOutHandler(event:MouseEvent):void {&lt;br /&gt;       CursorManager.removeCursor(CursorManager.currentCursorID);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public function resizeDownHandler(event:MouseEvent):void {&lt;br /&gt;       Application.application.parent.addEventListener(MouseEvent.MOUSE_MOVE, resizeMoveHandler);&lt;br /&gt;       Application.application.parent.addEventListener(MouseEvent.MOUSE_UP, resizeUpHandler);&lt;br /&gt;       this.resizeHandler.addEventListener(MouseEvent.MOUSE_OVER, resizeOverHandler);&lt;br /&gt;       this.panelClickHandler(event);&lt;br /&gt;       this.resizeCur = CursorManager.setCursor(resizeCursor);&lt;br /&gt;       this.oPoint.x = mouseX;&lt;br /&gt;       this.oPoint.y = mouseY;&lt;br /&gt;       this.oPoint = this.localToGlobal(oPoint);   &lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public function resizeMoveHandler(event:MouseEvent):void {&lt;br /&gt;       this.stopDragging();&lt;br /&gt;&lt;br /&gt;       var xPlus:Number = Application.application.parent.mouseX - this.oPoint.x;       &lt;br /&gt;       var yPlus:Number = Application.application.parent.mouseY - this.oPoint.y;&lt;br /&gt;  &lt;br /&gt;       if (this.oW + xPlus &gt; 140) {&lt;br /&gt;           this.width = this.oW + xPlus;&lt;br /&gt;       }&lt;br /&gt;  &lt;br /&gt;       if (this.oH + yPlus &gt; 80) {&lt;br /&gt;           this.height = this.oH + yPlus;&lt;br /&gt;       }&lt;br /&gt;       this.positionChildren();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public function resizeUpHandler(event:MouseEvent):void {&lt;br /&gt;       Application.application.parent.removeEventListener(MouseEvent.MOUSE_MOVE, resizeMoveHandler);&lt;br /&gt;       Application.application.parent.removeEventListener(MouseEvent.MOUSE_UP, resizeUpHandler);&lt;br /&gt;       CursorManager.removeCursor(CursorManager.currentCursorID);&lt;br /&gt;       this.resizeHandler.addEventListener(MouseEvent.MOUSE_OVER, resizeOverHandler);&lt;br /&gt;       this.initPos();&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Estos últimos cuatro metodos se dedican a implementar la funcionalidad de resize para el panel: El primero de ellos se encarga de cambiar el icono del mouse cuando tengamos el cursor sobre la esquina inferior derecha (para indicarnos que podemos hacer un resize del panel). El segundo metodo es muy similiar pero lo que hace es devolver el icono del mouse a su estado natural (la flechita) cuando quitemos el curso de la esquina inferior derecha del panel.&lt;br /&gt;&lt;br /&gt;El tercer metodo "resizeDownHandler" se ejecuta cuando presionamos el botón izquierdo del mouse sobre el boton "resizeHandler" que habiamos insertado en el createChildren(), este metodo se encarga de inicializar los valores X y Y de la esquina y de iniciar los listeners para el evento MOUSE_MOVE.&lt;br /&gt;&lt;br /&gt;El metodo "&lt;span style="font-weight: bold;"&gt;resizeMoveHandler&lt;/span&gt;" se encarga de cambiar el tamaño del panel en funcion del movimiento del mouse. Solo se ejecuta mientras tengamos el boton derecho del mouse preisonado, ya que una de las primeras cosas que hace es agregar un listener para el evento MOUSE_UP para detectar cuando dejamos de apretar el botón.&lt;br /&gt;&lt;br /&gt;El método &lt;span style="font-weight: bold;"&gt;"resizeUpHandler" &lt;/span&gt;el ultimo metodo de todos se encarga de eliminar el listener de MOUSE_MOVE para no continuar con el resize (cambio de tamaño) del panel.&lt;br /&gt;&lt;br /&gt;¡Y eso es todo! Como pueden apreciar es una clase bastante sencilla y facil de usar, por eso me gusta tanto, aunque tiene algunos bugs que iran descubriendo y puliendo sobre la marcha. En los próximos tutoriales publicare modificaciones bastante interesantes que he realizado sobre este u otros panels. Espero que haya sido lo suficientemente claro, cualquier pregunta no duden en preguntarme.&lt;br /&gt;&lt;a href="http://ejemplos.net78.net/downloads/cont_descargas.php?archivo=SuperPanelDemo.rar"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 125px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SSDhcJ7C_NI/AAAAAAAAAI8/gGFwsT168AY/s400/descargar.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459437839645906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-1149206245960780800?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/1149206245960780800/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/04/expandir-contraer-cerrar-cambiar-tamano.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/1149206245960780800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/1149206245960780800'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/04/expandir-contraer-cerrar-cambiar-tamano.html' title='Expandir, Contraer, Cerrar, cambiar tamaño y mover un Panel'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_8AfDk4OYg00/SfCFZzgWNzI/AAAAAAAAANk/_cq7VuwcPXM/s72-c/superpanel.PNG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-6619017175928034933</id><published>2009-04-25T23:25:00.007-04:30</published><updated>2009-05-27T00:31:22.884-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='httpservice'/><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='rest'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Tutorial HTTP Service con Flex y PHP</title><content type='html'>Existen dos grandes maneras de comunicarse remotamente a través de aplicaciones web, son dos enfoques que tienen diferencias muy marcadas, y que si aprendemos a utilizarlos bien, podemos explotar los mejores aspectos de cada método y lograr aplicaciones con una capa de datos robusta y veloz.&lt;br /&gt;&lt;br /&gt;Uno de los enfoques  (SOAP) es a través de exposiciones de metodos remotos para que puedan ser llamadas desde otras computadoras, si quieres aprender un poco mas sobre eso puedes entrar a mi tutorial &lt;a href="http://internetdeveloping.blogspot.com/2009/02/webservice-basico-con-php.html"&gt;Video tutorial WebService basico con php&lt;/a&gt; donde lo explico as detalladamente.&lt;br /&gt;&lt;br /&gt;El otro enfoque, que utilizaremos en este tutorial, tiene que ver con los metodos mas primitivos que existen en el protocolo http, que seguramente los que han trabajado con formularios web han escuchado algunos de estos: POST, GET, PUT, DELETE, etc. Un ejemplo de arquitectura web que utiliza este enfoque es llamado &lt;a href="http://es.wikipedia.org/wiki/Representational_State_Transfer"&gt;REST&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Vamos a emprezar, la aplicación que vamos a desarrollar va a tener dos lados, cliente y servidor. Del lado del cliente se creará una aplicacion flex llamada myHTTPService.mxml que se utilizará para visualizar todos los usuarios insertados en una base de datos y existirá un formulario para la insercion de un nuevo usuario. Del lado del servidor se creará una archivo PHP llamado request.php que permitirá acceder a la base de datos para realizar las consultas e inserciones pedidas por el cliente flex.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_8AfDk4OYg00/SfNe_UoyXzI/AAAAAAAAANs/ozWDkMpDgSU/s1600-h/arquitectura.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 303px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SfNe_UoyXzI/AAAAAAAAANs/ozWDkMpDgSU/s320/arquitectura.JPG" alt="" id="BLOGGER_PHOTO_ID_5328707226073980722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;El lado del Cliente&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s1600-h/code.gif"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:180%;"&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;Código myHTTPService.mxml&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="send_data()" height="503"&amp;gt;&lt;br /&gt;&amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;lt;![CDATA[&lt;br /&gt;import mx.utils.ObjectProxy;&lt;br /&gt;import mx.collections.ArrayCollection;&lt;br /&gt;import mx.controls.Alert;&lt;br /&gt;import mx.rpc.http.HTTPService;&lt;br /&gt;import mx.rpc.events.ResultEvent;&lt;br /&gt;import mx.rpc.events.FaultEvent;&lt;br /&gt;&lt;br /&gt;private var service:HTTPService &lt;/p&gt;&lt;br /&gt;&lt;p&gt; [Bindable]&lt;br /&gt;private var usuarios : ArrayCollection = new ArrayCollection();&lt;br /&gt;&lt;br /&gt;[Bindable]&lt;br /&gt;public var cards: Array = ["PUT","POST","GET","DELETE"];&lt;br /&gt;&lt;br /&gt;[Bindable]&lt;br /&gt;public var selectedItem:Object = "GET";&lt;/p&gt;&lt;br /&gt;&lt;p&gt; public function send_data() : void&lt;br /&gt;{&lt;br /&gt;var obj : Object = new Object();&lt;br /&gt;useHttpService(obj);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public function procesar() : void&lt;br /&gt;{&lt;br /&gt;if(nombre.text.length&amp;gt;0)&lt;br /&gt;{&lt;br /&gt;var obj : Object = new Object();&lt;br /&gt;obj.nombre = nombre.text;&lt;br /&gt;obj.id = codigo.text;&lt;br /&gt;&lt;br /&gt;useHttpService(obj);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;Alert.show("El nombre es obligatorio");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public function traspasar() : void&lt;br /&gt;{&lt;br /&gt;var a : Object = dg.selectedItem;&lt;br /&gt;nombre.text = a.nombre;&lt;br /&gt;codigo.text = a.id;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public function useHttpService(parameters:Object):void {&lt;br /&gt;service = new HTTPService();&lt;br /&gt;//service.destination = "http://localhost/tutoriales/httpservice/request.php";&lt;br /&gt;service.url = "http://ejemplos.net78.net/httpservice/request.php";&lt;br /&gt;service.method = "POST";&lt;br /&gt;service.addEventListener("result", httpResult);&lt;br /&gt;service.addEventListener("fault", httpFault);&lt;br /&gt;service.useProxy = false;&lt;br /&gt;service.send(parameters);&lt;br /&gt;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt; public function httpResult(event:ResultEvent):void {&lt;br /&gt;var result:Object = event.result;&lt;br /&gt;//Do something with the result.&lt;br /&gt;if(result.users.user is ObjectProxy)&lt;br /&gt;usuarios = new ArrayCollection([{nombre:result.users.user.nombre , id:result.users.user.id}]);&lt;br /&gt;else&lt;br /&gt;usuarios = result.users.user;&lt;br /&gt;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt; public function httpFault(event:FaultEvent):void {&lt;br /&gt;var faultstring:String = event.fault.faultString;&lt;br /&gt;Alert.show(faultstring);&lt;br /&gt;}&lt;br /&gt;]]&amp;gt;&lt;br /&gt;&amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGrid id="dg" x="10" y="10" dataProvider="{usuarios}" click="traspasar()"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Canvas x="10" y="182" width="260" height="98" backgroundColor="#FFFFFF"&amp;gt;&lt;br /&gt;&amp;lt;mx:Label x="10" y="10" text="Nombre:"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Label x="10" y="42" text="Id:"/&amp;gt;&lt;br /&gt;&amp;lt;mx:TextInput x="90" y="8" id="nombre"/&amp;gt;&lt;br /&gt;&amp;lt;mx:TextInput x="90" y="40" id="codigo" enabled="false"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Button x="173" y="66" label="Insertar" click="procesar()"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:Canvas&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;/mx:Application&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ahora, que debemos destacar de esta aplicacion, la esencia de todo esta en la funcion&lt;span style="font-family:monospace;"&gt; &lt;/span&gt;useHttpService: Esta funcion se encarga de crear una peticion a un servicio http, para eso creamos un objeto de tipo &lt;a href="http://livedocs.adobe.com/flex/201/langref/mx/rpc/http/HTTPService.html"&gt;HTTPService &lt;/a&gt;que va a simular un comportamiento parecido al que sucede cuando le damos a submit en un formulario web estandar, pero en este caso, en lugar de colocar varios input text, comboboxes, etc. Vamos a armar un objeto (en esta funcion lo llamamos&lt;span style="font-family:monospace;"&gt; &lt;/span&gt;"parameters") donde cada atributo de este objeto se comportara como una variable independiente en el lado de php, es decir, si al objeto le colocamos la propiedad nombre, entonces en php haremos $_POST['nombre'] para recibir el valor de esa propiedad.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Recuerden que en Flex un objeto de la clase Object puede tener cualquier atributo que nosotros queramos, solo debemos asignarle un valor a ese atributo inventado y a partir de ese momento el objeto contiene ese atributo con ese valor que le dimos.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Ahora vamos a analizar esa funcion paso por paso:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public function useHttpService(parameters:Object):void {&lt;br /&gt;service = new HTTPService();&lt;br /&gt;service.url = "http://ejemplos.net78.net/httpservice/request.php";&lt;br /&gt;service.method = "POST";&lt;br /&gt;service.addEventListener("result", httpResult);&lt;br /&gt;service.addEventListener("fault", httpFault);&lt;br /&gt;service.send(parameters);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El objeto service que acabamos de crear debemos pasarle varios parametros:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;URL: la direccion de la pagina que va a recibir nuestro formulario.&lt;/li&gt;&lt;li&gt;Method: puede ser POST, GET, PUT, DELETE, ETC.&lt;/li&gt;&lt;li&gt;send(parameters): Recuerden que el objeto parameters contiene todas las variables que queremos pasar al lado de PHP.&lt;/li&gt;&lt;li&gt;Por ultimo escuchamos dos eventos "result" y "fault", el primero de ellos se disparará si el servicio se invoca correctamente (si encontro el URL que pusimos arriba y si en el lado del servidor PHP nos devolvio un resultado coherente) y nos llevará a la funcion httpresult donde procesaremos los resultados, el segundo de los eventos se disparará si la llamada al servicio no puede ser procesada y nos llevará al método httpfault.&lt;/li&gt;&lt;/ol&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_8AfDk4OYg00/SfNfoT27C2I/AAAAAAAAAN8/7UlFyM1kgNY/s1600-h/parameters.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 95px;" src="http://2.bp.blogspot.com/_8AfDk4OYg00/SfNfoT27C2I/AAAAAAAAAN8/7UlFyM1kgNY/s400/parameters.JPG" alt="" id="BLOGGER_PHOTO_ID_5328707930239470434" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;El lado del servidor&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En el lado del servidor vamos a crear un archivo php llamado reques.php, este archivo deberá procesar correctamente las peticios POST que haga el lado del cliente y deberá devolver la lista de usuarios que han sido insertados dentro de la base de datos:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s1600-h/code.gif"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:180%;"&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;Código request.php&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="php"&gt;&lt;br /&gt;&lt;p&gt;//connect to the database&lt;br /&gt;$mysql = mysql_connect("localhost", "root", "");&lt;br /&gt;mysql_select_db( "phprestsql" );&lt;/p&gt;&lt;br /&gt;&lt;p&gt;//if the username and email address are filled out&lt;br /&gt;if( $_POST["nombre"])&lt;br /&gt;{&lt;br /&gt;//add the user&lt;br /&gt;$Query = "INSERT INTO user VALUES ('".$_POST['nombre']."','')";&lt;br /&gt;$Result = mysql_query( $Query );&lt;br /&gt;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt;//return a list of all the users&lt;br /&gt;$Query = "SELECT * from user";&lt;br /&gt;$Result = mysql_query( $Query );&lt;/p&gt;&lt;br /&gt;&lt;p&gt;$Return = "&amp;lt;users&amp;gt;";&lt;/p&gt;&lt;br /&gt;&lt;p&gt;while ( $User = mysql_fetch_object( $Result ) )&lt;br /&gt;{&lt;br /&gt;$Return .= "&amp;lt;user&amp;gt;&amp;lt;id&amp;gt;".$User-&amp;gt;id."&amp;lt;/id&amp;gt;&amp;lt;nombre&amp;gt;".$User-&amp;gt;nombre."&amp;lt;/nombre&amp;gt;&amp;lt;/user&amp;gt;";&lt;br /&gt;}&lt;br /&gt;$Return .= "&amp;lt;/users&amp;gt;";&lt;br /&gt;mysql_free_result( $Result );&lt;br /&gt;print ($Return);&lt;/p&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Como pueden ver el lado de php es muy basico y es similar al que se utilizaria si estubieramos trabajando con formularios comunes y corrientes. Debemos recibir la variable "nombre" que pasamos desde flex y luego realizar una insercion en la base de datos. Luego de realizar la insercion consultamos toda la tabla de usuarios para implimir un xml en la pantalla que sera lo que constituirá el objeto de respuesta de vuelta hacia flex, ese se recibira como parametro del metodo httpresult en caso de que la llamada al servicio se haya ejecutado correctamente.&lt;br /&gt;&lt;br /&gt;Espero que hayan entendido todo prefectamente, trate de ser lo mas claro posible, cualquier pregunta no duden en preguntarme a través de los comentarios de este blog. Les dejo un ejemplo funcionando de la aplicacion y los codigos fuentes de ambos lados (cliente y servidor).&lt;br /&gt;&lt;br /&gt;&lt;embed pluginspage=" http://www.macromedia.com/go/getflashplayer" src="http://aalejo.googlepages.com/myHTTPService.swf" height="300" width="300"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ejemplos.net78.net/downloads/cont_descargas.php?archivo=HTTPService.rar"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 125px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SSDhcJ7C_NI/AAAAAAAAAI8/gGFwsT168AY/s400/descargar.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459437839645906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-6619017175928034933?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/6619017175928034933/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/02/tutorial-http-service-con-flex-y-php.html#comment-form' title='9 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/6619017175928034933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/6619017175928034933'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/02/tutorial-http-service-con-flex-y-php.html' title='Tutorial HTTP Service con Flex y PHP'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_8AfDk4OYg00/SfNe_UoyXzI/AAAAAAAAANs/ozWDkMpDgSU/s72-c/arquitectura.JPG' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-2111350993658578377</id><published>2009-03-15T13:44:00.006-04:30</published><updated>2009-05-27T00:51:17.067-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='haccordion'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='button'/><title type='text'>Modificando el HAccordion del FlexLib</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_8AfDk4OYg00/Sb1Whoq3EFI/AAAAAAAAANc/MGBciV12T6c/s1600-h/bv.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 114px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/Sb1Whoq3EFI/AAAAAAAAANc/MGBciV12T6c/s200/bv.JPG" alt="" id="BLOGGER_PHOTO_ID_5313498271219912786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;El los ultimos dias he tenido la nacesidad de utilizar el accordion horizontal que trae la librería flexlib que mencione en el &lt;a href="http://internetdeveloping.blogspot.com/2009/02/flexlib-libreria-open-source-con.html"&gt;artículo anterior&lt;/a&gt;, una vez hecho esto me di cuenta de que por problemas de diseño del framework de flex la cabecera (heather) del acordion no pued ser muy personalizada, nada mas alla de colocarle un texto y un icono deseado, a pesar de que tiene una propiedad llamada headerRenderer para colocarle tu propio renderer. Esto se debe, a que la este renderer debe ser un Button.&lt;br /&gt;&lt;br /&gt;Para solucionar esto la gente de Flexlib (Especificamente, Doug McCune) tubo una brillante idea y desarrollaro un Canvas que se comporta como botton para poder colocar cualquier cosa que queramos dentro de la cabecera del Vertical u Horizontal accordion, el &lt;a href="http://flexlib.googlecode.com/svn/trunk/docs/flexlib/controls/CanvasButtonAccordionHeader.html"&gt;CanvasButtonAccordionHeader&lt;/a&gt;, pero todavia hay un problema, el headerRenderer es único para todo el HAccordion. ¿Qué pasa si yo desearía que cada cabecera, de cada sección del accordion, fuera diferente? Diferentes colores, fondo, controles, etc. No unicamente un texto o un icono diferente.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Para solucionar eso he decidido colocar un ViewStack con todas las posbles cabeceras del HAccordion y dependiendo de cual quiero visualizar en cada una de las secciones le paso en la propiedad "label" del boton (recordemos que supuestamente la cabecera es un botón) el numero de View que deseo visualizar en ese caso (la propiedad selectedIndex del ViewStack). El codigo del CanvasButtonAccordionHeather quedaria de la siguiente manera:&lt;br /&gt;&lt;pre name="code" class="html"&gt;&lt;br /&gt;&lt;canvasbuttonaccordionheader xmlns="flexlib.containers.accordionClasses.*" mx="http://www.adobe.com/2006/mxml"&gt;&lt;br /&gt;&lt;mx:script&gt;&lt;br /&gt; &lt;!--[CDATA[          [Bindable]--&gt;&lt;br /&gt;&lt;/mx:script&gt;&lt;br /&gt;   &lt;mx:viewstack id="myViewStack" borderstyle="solid" width="100%" height="100%" selectedindex="{_label}" creationcomplete="init()"&gt;&lt;br /&gt; &lt;mx:hbox id="v0" width="100%" height="100%" verticalgap="0" verticalalign="middle" backgroundsize="100%" backgroundimage="assets/accordionBack2.png"&gt;&lt;br /&gt;  &lt;mx:image source="assets/network.png" width="48" height="48"&gt;&lt;br /&gt;  &lt;mx:label text="Venezuela!" height="100%" width="100%" fontsize="25" fontweight="bold" color="#FFFFFF"&gt;&lt;br /&gt; &lt;/mx:label&gt;&lt;br /&gt; &lt;mx:hbox id="v1" width="100%" height="100%" verticalgap="0" verticalalign="middle" backgroundsize="100%" backgroundimage="assets/accordionBack.png"&gt;&lt;br /&gt;  &lt;mx:image source="assets/brush.png" width="48" height="48"&gt;&lt;br /&gt;  &lt;mx:label text="Turismo en Venezuela" height="100%" width="100%" fontsize="25" fontweight="bold" color="#FFFFFF"&gt;&lt;br /&gt; &lt;/mx:label&gt;&lt;br /&gt; &lt;mx:hbox id="v2" width="100%" height="100%" verticalgap="0" verticalalign="middle" backgroundsize="100%" backgroundimage="assets/accordionBack3.png"&gt;&lt;br /&gt;  &lt;mx:image source="assets/administrator.png" width="48" height="48"&gt;&lt;br /&gt;  &lt;mx:label text="Contactanos" height="100%" width="100%" fontsize="25" fontweight="bold" color="#FFFFFF"&gt;&lt;br /&gt; &lt;/mx:label&gt;&lt;br /&gt;   &lt;/mx:image&gt;&lt;br /&gt;&lt;/mx:hbox&gt;&lt;br /&gt;&lt;/mx:image&gt;&lt;/mx:hbox&gt;&lt;/mx:image&gt;&lt;/mx:hbox&gt;&lt;/mx:viewstack&gt;&lt;/canvasbuttonaccordionheader&gt;&lt;/pre&gt;&lt;br /&gt;Si se fijan, he colocado tres HBox dentro del ViewSatck, esto se debe a que mi acordion va a tener 3 secciones diferentes (V0, V1 y V2). Aunque esta no es la solucion mas ideal por lo menos me resulve de mis apuros, lo ideal sería tener un ViewStackButtonAccordionHeather, es decir, un ViewStack que se comporte como boton para que yo pueda presonalizarlo desde la aplicacion principal y no tener que crear un componente con todo el codigo cableado. Pero bueno, es un comienzo.&lt;br /&gt;&lt;br /&gt;El ejemplo definitivo de la pagina que estaba realizando lo pueden ver en &lt;a href="http://ejemplos.net78.net/Venezuela/"&gt;este link&lt;/a&gt;, de todas maneras aqui les dejo el ejemplo para que se lo descarguen.&lt;a href="http://ejemplos.net78.net/downloads/cont_descargas.php?archivo=VAccordion.rar"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 125px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SSDhcJ7C_NI/AAAAAAAAAI8/gGFwsT168AY/s400/descargar.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459437839645906" border="0" /&gt;&lt;/a&gt;&lt;a href="http://ejemplos.net78.net/Venezuela/" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 145px; height: 125px;" src="http://2.bp.blogspot.com/_8AfDk4OYg00/SSDhhAH7C2I/AAAAAAAAAJE/vDxkqZwO6Cw/s400/vistaprevia.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459521108642658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-2111350993658578377?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/2111350993658578377/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/03/modificando-el-haccordion-del-flex-lib.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/2111350993658578377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/2111350993658578377'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/03/modificando-el-haccordion-del-flex-lib.html' title='Modificando el HAccordion del FlexLib'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_8AfDk4OYg00/Sb1Whoq3EFI/AAAAAAAAANc/MGBciV12T6c/s72-c/bv.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-5641017670131810842</id><published>2009-02-20T18:53:00.006-04:30</published><updated>2009-04-09T16:49:39.236-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='recursos'/><category scheme='http://www.blogger.com/atom/ns#' term='librerias'/><category scheme='http://www.blogger.com/atom/ns#' term='componentes'/><title type='text'>FlexLib Librería - Open Source con componentes para Flex</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_8AfDk4OYg00/SZ9I22SRxQI/AAAAAAAAANE/oKONPj-_nCs/s1600-h/flexlib_logo.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 319px; height: 90px;" src="http://2.bp.blogspot.com/_8AfDk4OYg00/SZ9I22SRxQI/AAAAAAAAANE/oKONPj-_nCs/s320/flexlib_logo.jpg" alt="" id="BLOGGER_PHOTO_ID_5305038993188046082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Todos conocemos la importancia que tienen los componentes a la hora de realizar un diseño web (viene siendo uno de los aportes mas importantes de Flex sobre Flash). La comunidad desarrolladora de Flex se unó para realizar una librería llamada &lt;a href="http://code.google.com/p/flexlib/"&gt;FlexLib&lt;/a&gt; con los mejores componentes de los mejores programadores de flex conocidos. Entre algunos de los componentes (solo con los que yo he trabajado) que se incluyeron se encuentran:&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Horizontal Accordion: Es similar al Vertical Accordion del framework original de flex pero permite deslizar los contenedores de izquierda a derecha en lugar de arriba hacia abajo.&lt;/li&gt;&lt;li&gt;DragScrollingCanvas: Algo parecido a lo que sucede en google maps, podemos arrastrar el contenido interno del canvas sin la necesidad de usar un ScrollBar o la ruedad del mouse, solo haciendo un drag sobre el contenido.&lt;/li&gt;&lt;li&gt;ButtonScrollingCanvas: Coloca botones en los extremos del contenedor, al presionarlos, colocar el mouse sobre ellos, etc. Se realiza un Scroll del contenido.&lt;/li&gt;&lt;li&gt;CanvasButton: Es un contenedor canvas que hereda de la clase Button, por lo que permite ser utilizado como HeatherRenderer de un Horizonal o Vertical Acorrdion.&lt;/li&gt;&lt;/ol&gt;En Fin, si quieren conocer todos los componentes que tiene la librería los invito a entrar a la &lt;a href="http://code.google.com/p/flexlib/wiki/ComponentList"&gt;siguiente direccion de FlexLib en Google Codes&lt;/a&gt;. De todas maneras les dejo un vinculo para descargar la librería.&lt;br /&gt;&lt;a href="http://flexlib.googlecode.com/files/flexlib-.2.4.zip"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 125px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SSDhcJ7C_NI/AAAAAAAAAI8/gGFwsT168AY/s400/descargar.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459437839645906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-5641017670131810842?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/5641017670131810842/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/02/flexlib-libreria-open-source-con.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/5641017670131810842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/5641017670131810842'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/02/flexlib-libreria-open-source-con.html' title='FlexLib Librería - Open Source con componentes para Flex'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_8AfDk4OYg00/SZ9I22SRxQI/AAAAAAAAANE/oKONPj-_nCs/s72-c/flexlib_logo.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-4348297034961391703</id><published>2009-02-16T20:34:00.010-04:30</published><updated>2009-05-27T00:42:15.208-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='itemrenderer'/><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='numericStepper'/><category scheme='http://www.blogger.com/atom/ns#' term='datagrid'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='itemEditor'/><category scheme='http://www.blogger.com/atom/ns#' term='radioButton'/><category scheme='http://www.blogger.com/atom/ns#' term='button'/><title type='text'>Utilizando un ItemEditor para modificar las filas de un DataGrid</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8AfDk4OYg00/SZoUKVtGAVI/AAAAAAAAAM8/6uw1XpziD3A/s1600-h/DatagridItemEditorRender.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 101px;" src="http://4.bp.blogspot.com/_8AfDk4OYg00/SZoUKVtGAVI/AAAAAAAAAM8/6uw1XpziD3A/s200/DatagridItemEditorRender.JPG" alt="" id="BLOGGER_PHOTO_ID_5303573679039709522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Este post lo voy a realizar como una continuacion del post anterior &lt;a href="http://internetdeveloping.blogspot.com/2009/02/utilizando-un-itemrender-en-un-datagrid.html"&gt;Utilizando un ItemRender en un DataGrid&lt;/a&gt; pero en este caso vamos a ampliar el ejemplo utilizando una propiedad llamada &lt;a style="font-weight: bold;" href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflex%2F3%2Fhtml%2Fcelleditor_8.html&amp;amp;ei=RxSaSd2SHdKgtweZmailCw&amp;amp;usg=AFQjCNGK3uQKabfBHB3fwIP553RinUbIdQ&amp;amp;sig2=fPiw0KfIQWj93WMwR7I4zQ"&gt;itemEditor&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Un &lt;a style="font-weight: bold;" href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflex%2F3%2Fhtml%2Fcelleditor_8.html&amp;amp;ei=RxSaSd2SHdKgtweZmailCw&amp;amp;usg=AFQjCNGK3uQKabfBHB3fwIP553RinUbIdQ&amp;amp;sig2=fPiw0KfIQWj93WMwR7I4zQ"&gt;itemEditor &lt;/a&gt;es un componente que se utiliza para modificar informacion, a diferencia de un &lt;a href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=8&amp;amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflex%2F2%2Fdocs%2F00000827.html&amp;amp;ei=cRSaSYqfCY-EtgeO05GhCw&amp;amp;usg=AFQjCNGMVcfdqkql5c1Y3yEX1ZqeH6knvA&amp;amp;sig2=Unbe5j5Hdz-wFAs7Ja0vMw"&gt;itermRenderer &lt;/a&gt;(que se utiliza unicamente para mostrar informacion) el &lt;span style="font-weight: bold;"&gt;itemEditor &lt;/span&gt;es ideal para realizar modificaciones a datos utilizando los componentes mas idoneos para facilitar la modificacion.&lt;span class="fullpost"&gt; La mejor manera de que se vea lo que trato de decir es mostrando el ejemplo que vamos a realizar:&lt;br /&gt;&lt;embed pluginspage=" http://www.macromedia.com/go/getflashplayer" src="http://aalejo.googlepages.com/DataGridItemEditor.swf" height="210" width="370"&gt;&lt;/embed&gt; Como pueden notar al hacer click sobre alguna de las celdas los datos que se visualizaban ahora se renderizan de otra manera ideal para su manipulacion.&lt;br /&gt;&lt;br /&gt;Para lograr esto debemos colocar en cada columna una propiedad llamada itemEditor que contendrá la ruta hacia la clase o componente que queremos utilizar para renderizar los datos en el momento de la modificacion de la celda. En el caso de este ejemplo la estructura del &lt;a href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflex%2F2%2Flangref%2Fmx%2Fcontrols%2FDataGrid.html&amp;amp;ei=uhSaSdebE4H8tge-oZybCw&amp;amp;usg=AFQjCNEIm91y5FVA7kduhRgAYkMHn5hAog&amp;amp;sig2=ZLWUVBx_B1f3LJE9PmXhNw"&gt;DataGrid&lt;/a&gt; queradía de la siguiente manera.&lt;br /&gt;&lt;pre name="code" class="html"&gt;&lt;br /&gt;&amp;lt;mx:DataGrid id="dg" x="10" y="10" columnWidth="20" dataProvider="{datos}" rowHeight="25" editable="true" width="357"&amp;gt;&lt;br /&gt;&amp;lt;mx:columns&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="RadioButton" dataField="radioValue" editable="false" itemRenderer="mx.controls.RadioButton"/&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="NumericStepper" dataField="numeriValue" editorDataField="value" itemEditor="mx.controls.NumericStepper"/&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="Image" dataField="url" itemRenderer="mx.controls.Image" itemEditor="mx.controls.TextInput"/&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="CheckBox" dataField="checkBoxValue" editable="false" itemRenderer="mx.controls.CheckBox"/&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="TextInput" dataField="textValue" editable="true" itemEditor="mx.controls.TextInput"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:columns&amp;gt;&lt;br /&gt;&amp;lt;/mx:DataGrid&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Si no queremos que una columna en especifica se pueda editar debemos asignarle la propiedad editable=false.&lt;br /&gt;&lt;br /&gt;Bueno esto es todo en este ejemplo, como pueden ver es muy facil utilizar estos itemEditors para modificar las filas del DataGrid. Cualquier duda no duden en escribirme al correo aalejo@gmail.com.&lt;br /&gt;&lt;a href="http://ejemplos.net78.net/downloads/cont_descargas.php?archivo=DataGridItemEditor.rar"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 125px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SSDhcJ7C_NI/AAAAAAAAAI8/gGFwsT168AY/s400/descargar.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459437839645906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-4348297034961391703?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/4348297034961391703/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/02/utilizando-un-itemeditor-para-modificar.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/4348297034961391703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/4348297034961391703'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/02/utilizando-un-itemeditor-para-modificar.html' title='Utilizando un ItemEditor para modificar las filas de un DataGrid'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_8AfDk4OYg00/SZoUKVtGAVI/AAAAAAAAAM8/6uw1XpziD3A/s72-c/DatagridItemEditorRender.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-4922695389941631266</id><published>2009-02-15T04:09:00.008-04:30</published><updated>2009-05-27T00:45:02.260-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='itemrenderer'/><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='example'/><category scheme='http://www.blogger.com/atom/ns#' term='numericStepper'/><category scheme='http://www.blogger.com/atom/ns#' term='checkbox'/><category scheme='http://www.blogger.com/atom/ns#' term='datagrid'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='Image'/><category scheme='http://www.blogger.com/atom/ns#' term='radioButton'/><title type='text'>Utilizando un ItemRender en un DataGrid</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SZjjIF40mmI/AAAAAAAAAM0/t73w6k3rK64/s1600-h/DatagridSimpleItemRender.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 124px;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SZjjIF40mmI/AAAAAAAAAM0/t73w6k3rK64/s200/DatagridSimpleItemRender.JPG" alt="" id="BLOGGER_PHOTO_ID_5303238289387723362" border="0" /&gt;&lt;/a&gt;En este ejemplo vamos llenar un DataGrid como lo hacemos normalmente, es decir, a través de su propiedad &lt;span style="font-weight: bold;"&gt;dataProvider&lt;/span&gt;. Lo que tendrá de particular será la manera como mostraremos la informacion dentro del &lt;a href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflex%2F2%2Flangref%2Fmx%2Fcontrols%2FDataGrid.html&amp;amp;ei=TuyYScr8FJaitgfniOWlCw&amp;amp;usg=AFQjCNEIm91y5FVA7kduhRgAYkMHn5hAog&amp;amp;sig2=ZRESdKL0M_DLUkhfA9i7iQ"&gt;DataGrid&lt;/a&gt;. Los datos seran mostrados de 5 maneras diferentes (Una manera por cada columna) utilizando la propiedad &lt;a href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fwww.adobe.com%2Fdevnet%2Fflex%2Fquickstart%2Fusing_item_renderers%2F&amp;amp;ei=kOyYScWZE43BtgelmISgCw&amp;amp;usg=AFQjCNGvwbOXK-Mc6mffR_7lC0iQpL6iwA&amp;amp;sig2=MamUGBHEzUsABrJ_VoeYAA"&gt;ItemRenderer &lt;/a&gt;de las columnas del DataGrid (&lt;a href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflex%2F2%2Flangref%2Fmx%2Fcontrols%2FdataGridClasses%2FDataGridColumn.html&amp;amp;ei=Y-yYSYSBHIOftwf5u5S6Cw&amp;amp;usg=AFQjCNFXhURbULVFGYROeq_truHoZH7RVQ&amp;amp;sig2=LyFZ0j1qxm3BJxbY2Dagww"&gt;DatagridColumns&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Los ItemRenderer que utilizaremos para mostrar la información serán los siguientes: RadioButton, NumericStepper, Image, CheckBox, TextInput. Si quieres saber como utilizar un ItermRender propio y mas complejo te recomiendo el tutorial &lt;a href="http://internetdeveloping.blogspot.com/2009/02/datagrid-con-un-itemrender-propio.html"&gt;Datagrid con un ItemRenderer Propio (Personalizado)&lt;/a&gt;.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Bueno para empezar vamos a crear un nuevo proyecto en flex llamado DataGridSimpleItemrenderer, dentro de esta aplicacion vamos a agregar un nuevo Datagrid que va a contener 5 columnas, a cada una de las columnas le vamos a colocar la propiedad &lt;span style="font-weight: bold;"&gt;itemRenderer &lt;/span&gt;con la ruta a la clase de flex que vamos a utilizar para renderizar, por ejemplo, si se trata de un RadioButton debemos colocar &lt;span style="font-style: italic;"&gt;mx.controls.RadioButton&lt;/span&gt;. Tambien debemos colocar la propiedad &lt;span style="font-weight: bold;"&gt;dataField &lt;/span&gt;con el nombre del atributo que va a contener la data que va a utilizar ese RadioButton para renderizarse, recuerden que el DataGrid se va a llenar con un arreglo de objetos (cada objeto va a tener un atributo que se va a user para renderizar una columna, ese atributo será el que colocaremos como dataField segun sea el caso). Por ultimo llenamos la pripiedad &lt;span style="font-weight: bold;"&gt;headerText &lt;/span&gt;con el mobre que le queremos dar a esa columna.&lt;br /&gt;&lt;br /&gt;Una vez creado el DataGrid y colocados estos atributos en las columnas del DataGrid tendremos el siguiente codigo:&lt;br /&gt;&lt;pre name="code" class="html"&gt;&lt;br /&gt;&amp;lt;mx:DataGrid id="dg" x="10" y="10" dataProvider="{datos}" rowHeight="25" width="288"&amp;gt;&lt;br /&gt;&amp;lt;mx:columns&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="RadioButton" dataField="radioValue" itemRenderer="mx.controls.RadioButton"/&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="NumericStepper" dataField="numeriValue" itemRenderer="mx.controls.NumericStepper"/&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="Image" dataField="url" itemRenderer="mx.controls.Image"/&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="CheckBox" dataField="checkBoxValue" itemRenderer="mx.controls.CheckBox"/&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="TextInput" dataField="textValue" itemRenderer="mx.controls.TextInput"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:columns&amp;gt;&lt;br /&gt;&amp;lt;/mx:DataGrid&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ahora debemos crear una funcion llamada "init" que llamaremos cuando ocurra el evento CreationComplete de la aplicación, esta función se encargara de llenar el arreglo dataProvider que contendrá el DataGrid, recuerden que los objetos que le vamos a insertar a este dataProvider deben tener atributos iguales a los que mencionamos como dataField en las columnas del DataGrid. Al final tendremos todo el codigo de la aplicación como lo siguiente:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"&amp;gt;&lt;br /&gt;&amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;lt;![CDATA[&lt;br /&gt;import mx.controls.Alert;&lt;br /&gt;import mx.collections.ArrayCollection;&lt;br /&gt;&lt;br /&gt;[Bindable] public var datos : ArrayCollection = new ArrayCollection();&lt;br /&gt;&lt;br /&gt;public function init() : void&lt;br /&gt;{&lt;br /&gt;var obj : Object = new Object();&lt;br /&gt;obj.checkBoxValue = true;&lt;br /&gt;obj.radioValue = false;&lt;br /&gt;obj.numeriValue = 7;&lt;br /&gt;obj.textValue = "Hola Mundo";&lt;br /&gt;obj.url = "http://aalejo.googlepages.com/idea.jpg";&lt;br /&gt;&lt;br /&gt;datos.addItem(obj);&lt;br /&gt;}&lt;br /&gt;]]&amp;gt;&lt;br /&gt;&amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGrid id="dg" x="10" y="10" dataProvider="{datos}" rowHeight="25" width="288"&amp;gt;&lt;br /&gt;&amp;lt;mx:columns&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="RadioButton" dataField="radioValue" itemRenderer="mx.controls.RadioButton"/&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="NumericStepper" dataField="numeriValue" itemRenderer="mx.controls.NumericStepper"/&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="Image" dataField="url" itemRenderer="mx.controls.Image"/&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="CheckBox" dataField="checkBoxValue" itemRenderer="mx.controls.CheckBox"/&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="TextInput" dataField="textValue" itemRenderer="mx.controls.TextInput"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:columns&amp;gt;&lt;br /&gt;&amp;lt;/mx:DataGrid&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Bueno esto es todo, de todas maneras aqui les dejo el codigo de la aplicacion para que lo puedan descargar, y tambien pueden ver el ejemplo en funcionamiento. Cualquier duda me pueden escribir a mi email aalejo@gmail.com.&lt;br /&gt;&lt;embed pluginspage=" http://www.macromedia.com/go/getflashplayer" src="http://aalejo.googlepages.com/DatagridSimpleRender.swf" height="270" width="300"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;a href="http://ejemplos.net78.net/downloads/cont_descargas.php?archivo=DatagridSimpleRender.rar"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 125px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SSDhcJ7C_NI/AAAAAAAAAI8/gGFwsT168AY/s400/descargar.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459437839645906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-4922695389941631266?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/4922695389941631266/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/02/utilizando-un-itemrender-en-un-datagrid.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/4922695389941631266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/4922695389941631266'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/02/utilizando-un-itemrender-en-un-datagrid.html' title='Utilizando un ItemRender en un DataGrid'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_8AfDk4OYg00/SZjjIF40mmI/AAAAAAAAAM0/t73w6k3rK64/s72-c/DatagridSimpleItemRender.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-1837837662860845053</id><published>2009-02-14T14:15:00.003-04:30</published><updated>2009-02-14T22:08:00.785-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='patrones de diseño'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='sessiones'/><title type='text'>Carrito de compras con PHP (Orientado a Objetos)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SZd_1ewMlPI/AAAAAAAAAMk/aLQZgeKngg4/s1600-h/j0432633.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 180px; height: 180px;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SZd_1ewMlPI/AAAAAAAAAMk/aLQZgeKngg4/s320/j0432633.png" alt="" id="BLOGGER_PHOTO_ID_5302847643017057522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En este tutorial vamos a crear y utilizar las clases necesarias para manejar un&lt;span style="font-weight: bold;"&gt; carrito de compras&lt;/span&gt; en PHP. Las funciones que esta clase "Carrito" tendrá serán:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Agregar un producto.&lt;/li&gt;&lt;li&gt;Eliminar un producto.&lt;/li&gt;&lt;li&gt;Modificar un producto.&lt;/li&gt;&lt;li&gt;Imprimir el carrito.&lt;/li&gt;&lt;/ul&gt;Por fines didácticos quiero utilizar el patrón de diseño &lt;a href="http://es.wikipedia.org/wiki/Iterador_%28patr%C3%B3n_de_dise%C3%B1o%29"&gt;Iterator &lt;/a&gt;en esta clase "Carrito", ese patrón de diseño nos permitie recorrer los arreglos, collecciones, etc. Sin exponer sus estructuras, es decir, vamos a estandarizar la manejar de recorrer ese tipo de objetos, siempre que queramos recorrer un arreglo, coleccion, etc. Vamos a hacerlo de la misma manera sin importar que clase es.&lt;br /&gt;&lt;br /&gt;Tambien vamos a trabajar el carrito creado como una &lt;a href="http://www.desarrolloweb.com/articulos/321.php"&gt;variable de sesion&lt;/a&gt;, para que este presente durante toda la aplicación (mientras el usuario realiza sus compras).&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Creando la clase Producto&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Esta clase se encargará de guardar la informacion relativa a cada producto en especifibo, cada que que queramos un nuevo producto debemos crear una instancia de esta clase y pasarle sus atributos: codigo (para la identificacion unica), cantidad, precio, nombre, etc.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt; &lt;span style="color: rgb(0, 0, 102); font-weight: bold;font-size:130%;" &gt;Archivo Producto.php&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="php"&gt;&lt;br /&gt;class Producto&lt;br /&gt;{&lt;br /&gt;var $codigo;&lt;br /&gt;var $nombre;&lt;br /&gt;var $cantidad;&lt;br /&gt;var $precio;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Creando la clase Carrito&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;La clase Carrito&lt;/span&gt; no es mas que una collección de objetos Producto y los metodos para manejar esos productos:&lt;br /&gt;&lt;br /&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt; &lt;span style="color: rgb(0, 0, 102); font-weight: bold;font-size:130%;" &gt;Archivo Carrito.php&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="php"&gt;&lt;br /&gt;/**&lt;br /&gt;* Esta clase permite manejar funciones basicas de un carrito de&lt;br /&gt;* compras, esta desarrollada usando el patron de diseño iterator&lt;br /&gt;* para orfecer mayor encapsulamiento y orden en los datos&lt;br /&gt;* para utilizarla deben tener una clase producto que contenga&lt;br /&gt;* el atributo "codigo" representando la identificacion del producto&lt;br /&gt;*&lt;br /&gt;* Cualquier duda pueden escribir a aalejo@gmail.com&lt;br /&gt;* o entrar en la explicacion de esta clase en&lt;br /&gt;* www.internetdeveloping.blogspot.com&lt;br /&gt;*/&lt;br /&gt;require('Collection.php');&lt;br /&gt;require('Producto.php');&lt;br /&gt;&lt;br /&gt;Class Carrito&lt;br /&gt;{&lt;br /&gt;/**&lt;br /&gt;* Viene representando la lista de productos del carrito&lt;br /&gt;* @var Collection&lt;br /&gt;*/&lt;br /&gt;var $productos;&lt;br /&gt;&lt;br /&gt;function Carrito()&lt;br /&gt;{&lt;br /&gt;$this-&gt;productos = new Collection('Producto');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Esta funcion devuelve un producto a partir del codigo&lt;br /&gt;* @param $codigo&lt;br /&gt;* @return Producto&lt;br /&gt;*/&lt;br /&gt;public function getProducto($codigo)&lt;br /&gt;{&lt;br /&gt;$iterator = $this-&gt;productos-&gt;getIterator();&lt;br /&gt;while($iterator-&gt;valid())&lt;br /&gt;{&lt;br /&gt; $prod = $iterator-&gt;current();&lt;br /&gt;&lt;br /&gt; if($prod-&gt;codigo == $codigo)&lt;br /&gt; {&lt;br /&gt;  return $prod;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; $iterator-&gt;next();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Permite agregar un producto al carrito de compras&lt;br /&gt;* @param $producto&lt;br /&gt;* @return null&lt;br /&gt;*/&lt;br /&gt;public function agregarProducto($producto)&lt;br /&gt;{&lt;br /&gt;$prod = $this-&gt;getProducto($producto-&gt;codigo);&lt;br /&gt;if($prod) $prod-&gt;cantidad++;&lt;br /&gt;else&lt;br /&gt; $this-&gt;productos-&gt;add($producto);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Elimina un producto del carrito, a partir de un codigo&lt;br /&gt;* @param $codigo&lt;br /&gt;* @return null&lt;br /&gt;*/&lt;br /&gt;public function eliminarProducto($codigo)&lt;br /&gt;{&lt;br /&gt;$existe = false;&lt;br /&gt;$iterator = $this-&gt;productos-&gt;getIterator();&lt;br /&gt;while($iterator-&gt;valid())&lt;br /&gt;{&lt;br /&gt; $prod = $iterator-&gt;current();&lt;br /&gt; if($prod-&gt;codigo == $codigo)&lt;br /&gt; {&lt;br /&gt;  if($prod-&gt;cantidad &gt; 1)&lt;br /&gt;   $prod-&gt;cantidad--;&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;   $this-&gt;productos-&gt;remove($iterator-&gt;key());&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; $iterator-&gt;next();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Se utiliza solo con fines de desarrollo, imprime la lista&lt;br /&gt;* de productos del carrito, se puede modificar para imprimir&lt;br /&gt;* toda la informacion de cada producto&lt;br /&gt;* @return String&lt;br /&gt;*/&lt;br /&gt;public function trace()&lt;br /&gt;{&lt;br /&gt;$out = "";&lt;br /&gt;$iterator = $this-&gt;productos-&gt;getIterator();&lt;br /&gt;while($iterator-&gt;valid())&lt;br /&gt;{&lt;br /&gt; $prod = $iterator-&gt;current();&lt;br /&gt;&lt;br /&gt; $out .= "Producto ".$prod-&gt;nombre." -&gt; ".$prod-&gt;cantidad."&lt;br /&gt;";&lt;br /&gt;&lt;br /&gt; $iterator-&gt;next();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return $out;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Seguramente se preguntan porque la variables $productos es de tipo Collection, bueno esto es muy simple, para no trabajar con arreglos tediosos decidi utilizar una clase que encontre en internet llamada Collection.php, lo bueno de esta clase es que implementa la interaz IteratorAggregate que nos permitirá utilizar el patron de diseño Iterator que explique anteriormente, por otro lado, sus metodos son mucho mas intuitivos que los de un arreglo. A continuación les dejo el codigo de la clase Collection.php&lt;br /&gt;&lt;br /&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt; &lt;span style="color: rgb(0, 0, 102); font-weight: bold;font-size:130%;" &gt;Archivo Collection.php&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="php"&gt;&lt;br /&gt;class Collection implements Countable, IteratorAggregate, ArrayAccess&lt;br /&gt;{&lt;br /&gt;protected $_valueType;&lt;br /&gt;protected $_collection = array();&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Construct a new typed collection&lt;br /&gt;* @param string valueType collection value type&lt;br /&gt;*/&lt;br /&gt;public function __construct($valueType)&lt;br /&gt;{&lt;br /&gt;$this-&gt;_valueType = $valueType;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Add a value into the collection&lt;br /&gt;* @param string $value&lt;br /&gt;* @throws InvalidArgumentException when wrong type&lt;br /&gt;*/&lt;br /&gt;public function add($value)&lt;br /&gt;{&lt;br /&gt;if(!$this-&gt;isValidType($value))&lt;br /&gt; throw new InvalidArgumentException('Trying to add a value of wrong type');&lt;br /&gt;&lt;br /&gt;$this-&gt;_collection[] = $value;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Set index's value&lt;br /&gt;* @param integer $index&lt;br /&gt;* @param mixed $value&lt;br /&gt;* @throws OutOfRangeException&lt;br /&gt;* @throws InvalidArgumentException&lt;br /&gt;*/&lt;br /&gt;public function set($index, $value)&lt;br /&gt;{&lt;br /&gt;if($index &gt;= $this-&gt;count())&lt;br /&gt; throw new OutOfRangeException('Index out of range');&lt;br /&gt;&lt;br /&gt;if(!$this-&gt;isValidType($value))&lt;br /&gt; throw new InvalidArgumentException('Trying to add a value of wrong type');&lt;br /&gt;&lt;br /&gt;$this-&gt;_collection[$index] = $value;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Remove a value from the collection&lt;br /&gt;* @param integer $index index to remove&lt;br /&gt;* @throws OutOfRangeException if index is out of range&lt;br /&gt;*/&lt;br /&gt;public function remove($index)&lt;br /&gt;{&lt;br /&gt;if($index &gt;= $this-&gt;count())&lt;br /&gt; throw new OutOfRangeException('Index out of range');&lt;br /&gt;&lt;br /&gt;array_splice($this-&gt;_collection, $index, 1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Return value at index&lt;br /&gt;* @param integer $index&lt;br /&gt;* @return mixed&lt;br /&gt;* @throws OutOfRangeException&lt;br /&gt;*/&lt;br /&gt;public function get($index)&lt;br /&gt;{&lt;br /&gt;if($index &gt;= $this-&gt;count())&lt;br /&gt; throw new OutOfRangeException('Index out of range');&lt;br /&gt;&lt;br /&gt;return $this-&gt;_collection[$index];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Determine if index exists&lt;br /&gt;* @param integer $index&lt;br /&gt;* @return boolean&lt;br /&gt;*/&lt;br /&gt;public function exists($index)&lt;br /&gt;{&lt;br /&gt;if($index &gt;= $this-&gt;count())&lt;br /&gt; return false;&lt;br /&gt;&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;/**&lt;br /&gt;* Return count of items in collection&lt;br /&gt;* Implements countable&lt;br /&gt;* @return integer&lt;br /&gt;*/&lt;br /&gt;public function count()&lt;br /&gt;{&lt;br /&gt;return count($this-&gt;_collection);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Determine if this value can be added to this collection&lt;br /&gt;* @param string $value&lt;br /&gt;* @return boolean&lt;br /&gt;*/&lt;br /&gt;public function isValidType($value)&lt;br /&gt;{&lt;br /&gt;$baseType = gettype($value);&lt;br /&gt;if($this-&gt;_valueType == $baseType)&lt;br /&gt; return true;&lt;br /&gt;&lt;br /&gt;if($baseType == 'object')&lt;br /&gt;{&lt;br /&gt; $class = get_class($value);&lt;br /&gt;&lt;br /&gt; if($this-&gt;_valueType == $class)&lt;br /&gt;  return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Return an iterator&lt;br /&gt;* Implements IteratorAggregate&lt;br /&gt;* @return ArrayIterator&lt;br /&gt;*/&lt;br /&gt;public function getIterator()&lt;br /&gt;{&lt;br /&gt;return new ArrayIterator($this-&gt;_collection);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Set offset to value&lt;br /&gt;* Implements ArrayAccess&lt;br /&gt;* @see set&lt;br /&gt;* @param integer $offset&lt;br /&gt;* @param mixed $value&lt;br /&gt;*/&lt;br /&gt;public function offsetSet($offset, $value)&lt;br /&gt;{&lt;br /&gt;$this-&gt;set($offset, $value);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Unset offset&lt;br /&gt;* Implements ArrayAccess&lt;br /&gt;* @see remove&lt;br /&gt;* @param integer $offset&lt;br /&gt;*/&lt;br /&gt;public function offsetUnset($offset)&lt;br /&gt;{&lt;br /&gt;$this-&gt;remove($offset);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* get an offset's value&lt;br /&gt;* Implements ArrayAccess&lt;br /&gt;* @see get&lt;br /&gt;* @param integer $offset&lt;br /&gt;* @return mixed&lt;br /&gt;*/&lt;br /&gt;public function offsetGet($offset)&lt;br /&gt;{&lt;br /&gt;return $this-&gt;get($offset);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Determine if offset exists&lt;br /&gt;* Implements ArrayAccess&lt;br /&gt;* @see exists&lt;br /&gt;* @param integer $offset&lt;br /&gt;* @return boolean&lt;br /&gt;*/&lt;br /&gt;public function offsetExists($offset)&lt;br /&gt;{&lt;br /&gt;return $this-&gt;exists($offset);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Utilizando del carrito de compras&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Bueno ya estamos listos, ahora solo falta probar nuestra clase, para eso vamos a crear un arrchivo llamado VistaCarrito.php donde vamos a crear una instancia de la clase Carrito y vamos a agregarle, eliminarle y modiicarle produtos&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt; &lt;span style="color: rgb(0, 0, 102); font-weight: bold;font-size:130%;" &gt;Archivo VistaCarrito.php&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="php"&gt;&lt;br /&gt;session_start();&lt;br /&gt;require("Carrito.php");&lt;br /&gt;&lt;br /&gt;$carrito = new Carrito();&lt;br /&gt;$_SESSION["carrito"] = $carrito;&lt;br /&gt;//Creo dos productos para jugar con ellos&lt;br /&gt;$prod = new Producto();&lt;br /&gt;$prod-&gt;codigo = 1;&lt;br /&gt;$prod-&gt;cantidad = 1;&lt;br /&gt;$prod-&gt;nombre = "Cama";&lt;br /&gt;$prod-&gt;precio = 50;&lt;br /&gt;&lt;br /&gt;$prod2 = new Producto();&lt;br /&gt;$prod2-&gt;codigo = 2;&lt;br /&gt;$prod2-&gt;cantidad = 1;&lt;br /&gt;$prod2-&gt;nombre = "Silla";&lt;br /&gt;$prod2-&gt;precio = 23;&lt;br /&gt;&lt;br /&gt;echo "Agregando dos productos...&lt;br /&gt;";&lt;br /&gt;$_SESSION["carrito"]-&gt;agregarProducto($prod);&lt;br /&gt;$_SESSION["carrito"]-&gt;agregarProducto($prod2);&lt;br /&gt;&lt;br /&gt;echo $_SESSION["carrito"]-&gt;trace();&lt;br /&gt;&lt;br /&gt;echo "Modificando el producto de codigo 1...&lt;br /&gt;";&lt;br /&gt;$auxProd = $_SESSION["carrito"]-&gt;getProducto("1");&lt;br /&gt;$auxProd-&gt;cantidad++;&lt;br /&gt;&lt;br /&gt;echo $_SESSION["carrito"]-&gt;trace();&lt;br /&gt;&lt;br /&gt;echo "Eliminando el producto de codigo 2...&lt;br /&gt;";&lt;br /&gt;$_SESSION["carrito"]-&gt;eliminarProducto("2");&lt;br /&gt;&lt;br /&gt;echo $_SESSION["carrito"]-&gt;trace();&lt;br /&gt;&lt;br /&gt;echo "Listo...";&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Recuerden que antes de empezar a utilizar las variables de session siempre debemos llamar a la funcion &lt;a href="http://es.php.net/manual/en/function.session-start.php"&gt;session_start()&lt;/a&gt;. Creamos la variable carrito como un objeto de sesion para poder utilizarlo durante toda la paigna web.&lt;br /&gt;&lt;br /&gt;Bueno espero que todo haya quedado claro, aqui les dejo el codigo fuente de la clase para los que la quieran utilizar, cualquier duda me pueden escribir a mi correro aalejo@gmail.com.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://aalejo.googlepages.com/CarritoDeCompras.rar" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 125px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SSDhcJ7C_NI/AAAAAAAAAI8/gGFwsT168AY/s400/descargar.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459437839645906" border="0" /&gt;&lt;/a&gt;&lt;a href="http://ejemplos.net78.net/carrito/VistaCarrito.php" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 145px; height: 125px;" src="http://2.bp.blogspot.com/_8AfDk4OYg00/SSDhhAH7C2I/AAAAAAAAAJE/vDxkqZwO6Cw/s400/vistaprevia.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459521108642658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-1837837662860845053?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/1837837662860845053/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/02/carrito-de-compras-con-php-orientado.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/1837837662860845053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/1837837662860845053'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/02/carrito-de-compras-con-php-orientado.html' title='Carrito de compras con PHP (Orientado a Objetos)'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_8AfDk4OYg00/SZd_1ewMlPI/AAAAAAAAAMk/aLQZgeKngg4/s72-c/j0432633.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-2889552801325985860</id><published>2009-02-05T23:47:00.009-04:30</published><updated>2009-05-27T00:47:58.242-04:30</updated><title type='text'>Datagrid con un ItemRenderer Propio (Personalizado)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SYu6mwkWmxI/AAAAAAAAAMc/tl6qyEsr3Pc/s1600-h/datagridItemRender.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 247px;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SYu6mwkWmxI/AAAAAAAAAMc/tl6qyEsr3Pc/s320/datagridItemRender.JPG" alt="" id="BLOGGER_PHOTO_ID_5299534561566694162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En esta oportunidad vamos a colocar un &lt;a style="font-weight: bold;" href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fwww.adobe.com%2Fdevnet%2Fflex%2Fquickstart%2Fusing_item_renderers%2F&amp;amp;ei=3LuLSfK6LoG4twev9-iGCw&amp;amp;usg=AFQjCNGvwbOXK-Mc6mffR_7lC0iQpL6iwA&amp;amp;sig2=rmHh-YhWf3v7OzGfI1zJMw"&gt;ItemRenderer &lt;/a&gt;personalizado dentro de un &lt;a href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fwww.adobe.com%2Fdevnet%2Fflex%2Fquickstart%2Fusing_item_renderers%2F&amp;amp;ei=3LuLSfK6LoG4twev9-iGCw&amp;amp;usg=AFQjCNGvwbOXK-Mc6mffR_7lC0iQpL6iwA&amp;amp;sig2=rmHh-YhWf3v7OzGfI1zJMw"&gt;&lt;span style="font-weight: bold;"&gt;DataGrid &lt;/span&gt;&lt;/a&gt;y que sin embargo los datos se sigan pasando de manera automatica a través del dataSource y utilizando Binding.&lt;br /&gt;&lt;br /&gt;El &lt;a style="font-weight: bold;" href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fwww.adobe.com%2Fdevnet%2Fflex%2Fquickstart%2Fusing_item_renderers%2F&amp;amp;ei=3LuLSfK6LoG4twev9-iGCw&amp;amp;usg=AFQjCNGvwbOXK-Mc6mffR_7lC0iQpL6iwA&amp;amp;sig2=rmHh-YhWf3v7OzGfI1zJMw"&gt;ItemRenderer &lt;/a&gt;que vamos a utilizar va a ser un componente flex creado completamente aparte y a nuestro gusto, y le vamos a pasar sus datos a renderizar a través de la propiedad Data que tienen todos los objetos que implementan la interfaz &lt;a style="font-weight: bold;" href="http://livedocs.adobe.com/flex/201/langref/mx/core/IDataRenderer.html"&gt;IDataRender&lt;/a&gt;.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Para empezar vamos a entender un poco sobre la interfaz &lt;a style="font-weight: bold;" href="http://livedocs.adobe.com/flex/201/langref/mx/core/IDataRenderer.html"&gt;IDataRenderer&lt;/a&gt;, cualquier objeto que la implemente contiene una propiedad llamada &lt;span style="font-weight: bold;"&gt;data&lt;/span&gt;, por donde recibe toda la información a renderizar (a pintar, graficar, como lo quieran llamar), la única informacion que un objeto de este tipo deberia recibir a través de otras propiedades seria la concerniente a su comportamiento.&lt;br /&gt;&lt;br /&gt;En nuestro ejemplo la informacion a renderizar son dos datos:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;url: Contiene la direccion donde se encuentra alojada la fotografia del producto.&lt;/li&gt;&lt;li&gt;nombre:  El nombre del objeto.&lt;/li&gt;&lt;/ul&gt;El &lt;span style="font-weight: bold;"&gt;ItemRenderer &lt;/span&gt;por defecto en el DataGrid es el componente "Label", aunque a veces no nos damos cuenta. Si queremos cambiar el itemrenderer de una columna solo debemos setearle la propiedad "itemrenderer" igual a la dirección donde se encuentra nuestra clase (o componente), esta dirección debe incluir la ruta desde la raiz del proyecto. Una vez hecho esto el itemrenderer recibirá la información a través de la propiedad "data" de la que hablamos anteriormente.&lt;br /&gt;&lt;br /&gt;Bueno basta de hablar tanto y vamos a empezar. Creamos el componente de flex que va a renderizar los datos:&lt;br /&gt;&lt;/span&gt;&lt;span class="fullpost"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt; &lt;span style="color: rgb(0, 0, 102); font-weight: bold;font-size:130%;" &gt;Archivo pictureRender.mxml&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="112" height="126"&amp;gt;&lt;br /&gt;&amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;lt;![CDATA[&lt;br /&gt;&lt;br /&gt;[Bindable]&lt;br /&gt;public var nombre : String = "Ramon";&lt;br /&gt;[Bindable]&lt;br /&gt;public var url : String = "assets/1.jpg";&lt;br /&gt;&lt;br /&gt;public override function set data(value:Object):void&lt;br /&gt;{&lt;br /&gt;nombre = value.data.nombre;&lt;br /&gt;url = value.data.url;&lt;br /&gt;&lt;br /&gt;super.data = value;&lt;br /&gt;}&lt;br /&gt;public override function get data():Object&lt;br /&gt;{&lt;br /&gt;return super.data;&lt;br /&gt;}&lt;br /&gt; ]]&amp;gt;&lt;br /&gt;&amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&amp;lt;mx:Image x="10" y="10" width="89" height="89" source="{url}"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Label x="10" y="104" width="92" text="{nombre}"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:Canvas&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El componente lo hemos creado a partir de la clase &lt;a href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflex%2F2%2Flangref%2Fmx%2Fcontainers%2FCanvas.html&amp;amp;ei=hySPSZmWGeCKmQfErqnGDA&amp;amp;usg=AFQjCNE-HSk8GEHuylEb_8FR_6MX9xuQkA&amp;amp;sig2=GK1b1cl03edy6U6h-b__4g"&gt;Canvas&lt;/a&gt;, como esta clase implementa la interfaz &lt;a style="font-weight: bold;" href="http://www.google.co.ve/url?q=http://livedocs.adobe.com/flex/201/langref/mx/core/IDataRenderer.html&amp;amp;ei=mySPSdOANZDamQfdrbCMAQ&amp;amp;sa=X&amp;amp;oi=spellmeleon_result&amp;amp;resnum=1&amp;amp;ct=result&amp;amp;cd=1&amp;amp;usg=AFQjCNFTWTUpGolmP-tjaN05mzgODpnVqQ"&gt;IDataRenderer&lt;/a&gt;, sobreescribi los metodos get y set de la propiedad &lt;span style="font-weight: bold;"&gt;data &lt;/span&gt;para aplicarle una logica especial a estos datos, ya que debemos extraer el campo "nombre" y "url" de este objeto para colocarlo en las respectivas variables del componente, estas variables deben ser declaradas como [Binding] en el momento de su definición, ya que de esta manera los datos que ellas contengan serán transferidos al objeto Image (en el caso de la url) y Label (en el caso del nombre) sin nosotros tener que ocuparnos de eso, es decir, en el momento en que cambie la variable url entonces cambiara el valor de la propiedad "source" del objeto Image. Para aprender un poco mas sobre el metatag [Binding] puede hacer &lt;a href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflex%2F201%2Fhtml%2Fdatabinding_091_02.html&amp;amp;ei=0SSPSaW8ItzimQfvu-XCDA&amp;amp;usg=AFQjCNECFLwltGtVDEnyhxysW0G2gRm7Ag&amp;amp;sig2=jsBUQLp9jMj4wPu0ipbw3w"&gt;click aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Ahora procedemos a llenar el archivo de la aplicacion:&lt;br /&gt;&lt;/span&gt;&lt;span class="fullpost"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt; &lt;span style="color: rgb(0, 0, 102); font-weight: bold;font-size:130%;" &gt;Archivo DatagridDataRender.mxml&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"&amp;gt;&lt;br /&gt;&amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;lt;![CDATA[&lt;br /&gt;import mx.core.IDataRenderer;&lt;br /&gt;import mx.collections.ArrayCollection;&lt;br /&gt;&lt;br /&gt;[Bindable]&lt;br /&gt;public var renderData : ArrayCollection = new ArrayCollection( [&lt;br /&gt;{url:'assets/1.png', nombre:'Monitor Daslex'},&lt;br /&gt;{url:'assets/2.png', nombre:'Maletin Ladrix'}]);&lt;br /&gt; [Bindable]&lt;br /&gt;public var datosDG : ArrayCollection = new ArrayCollection();&lt;br /&gt; public function init() : void&lt;br /&gt;{&lt;br /&gt;var obj1 : Object = new Object();&lt;br /&gt;obj1.data = renderData.getItemAt(0);&lt;br /&gt;obj1.descripcion = "Producto de buena calidad.";&lt;br /&gt; var obj2 : Object = new Object();&lt;br /&gt;obj2.data = renderData.getItemAt(1);&lt;br /&gt;obj2.descripcion = "Producto de mala calidad.";&lt;br /&gt;&lt;br /&gt;datosDG.addItem(obj1);&lt;br /&gt;datosDG.addItem(obj2);&lt;br /&gt;}&lt;br /&gt; ]]&amp;gt;&lt;br /&gt;&amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGrid x="10" y="10" dataProvider="{datosDG}" rowHeight="130" width="373" rowCount="2"&amp;gt;&lt;br /&gt;&amp;lt;mx:columns&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="Producto" dataField="data" itemRenderer="pictureRender" /&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="Descripcion" dataField="descripcion"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:columns&amp;gt;&lt;br /&gt;&amp;lt;/mx:DataGrid&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;Este archivo tiene dos partes fundamentales, en la primera seccion definimos dos &lt;a href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflex%2F2%2Flangref%2Fmx%2Fcollections%2FArrayCollection.html&amp;amp;ei=LyWPSfONC5C4MvuTtakL&amp;amp;usg=AFQjCNFBlJ6LXzx8hIDzTAGPuNZy2kzlUA&amp;amp;sig2=sjsaune1qR1J11g0-ZmZAg"&gt;ArrayCollection&lt;/a&gt; llamados "renderData" y "datosDG". El primero de ellos contiene los objetos "data" que se van a utilizar para enviar informacion a los ItemRenderer, el segundo de ellos va a ser sincronizado con la propiedad dataProvider del DataGrid (contendrá una lista donde cada item será equivalente a una fila en el datagrid.)&lt;br /&gt;&lt;br /&gt;La función init, que se llama cuando se dispara el evento creationComplete de la aplicación, se encarga de llenar el &lt;a href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflex%2F2%2Flangref%2Fmx%2Fcollections%2FArrayCollection.html&amp;amp;ei=LyWPSfONC5C4MvuTtakL&amp;amp;usg=AFQjCNFBlJ6LXzx8hIDzTAGPuNZy2kzlUA&amp;amp;sig2=sjsaune1qR1J11g0-ZmZAg"&gt;ArrayCollection &lt;/a&gt;datosDG, especificamente crea objetos con dos variables principales "data" y "descripcion", estas variables deben ser colocadas como "dataFields" en las columnas del &lt;a href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflex%2F2%2Flangref%2Fmx%2Fcontrols%2FDataGrid.html&amp;amp;ei=UCWPSemfE4TSMb_I6KQL&amp;amp;usg=AFQjCNEIm91y5FVA7kduhRgAYkMHn5hAog&amp;amp;sig2=rfjD5PDZCSu1UD-LyImzBQ"&gt;DataGrid &lt;/a&gt;para que el &lt;a href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflex%2F2%2Flangref%2Fmx%2Fcontrols%2FDataGrid.html&amp;amp;ei=UCWPSemfE4TSMb_I6KQL&amp;amp;usg=AFQjCNEIm91y5FVA7kduhRgAYkMHn5hAog&amp;amp;sig2=rfjD5PDZCSu1UD-LyImzBQ"&gt;DataGrid &lt;/a&gt;haga la carga de datos automaticamente. Si se fijan, la pripiedad data es llenada con la información a renderizar por el ItemRederer.&lt;br /&gt;&lt;br /&gt;Bueno ya hemos finalizado nuestra aplicación, cualquier duda me pueden escribir a mi correo aalejo@gmail.com, si todo los hicieron correctamente su aplicacion debería verse de la siguiente manera:&lt;br /&gt;&lt;embed pluginspage=" http://www.macromedia.com/go/getflashplayer" src="http://aalejo.googlepages.com/DatagridDataRender.swf" height="370" width="520"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;a href="http://ejemplos.net78.net/downloads/cont_descargas.php?archivo=DatagridDataRender.rar"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 125px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SSDhcJ7C_NI/AAAAAAAAAI8/gGFwsT168AY/s400/descargar.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459437839645906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-2889552801325985860?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/2889552801325985860/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/02/datagrid-con-un-itemrender-propio.html#comment-form' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/2889552801325985860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/2889552801325985860'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/02/datagrid-con-un-itemrender-propio.html' title='Datagrid con un ItemRenderer Propio (Personalizado)'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_8AfDk4OYg00/SYu6mwkWmxI/AAAAAAAAAMc/tl6qyEsr3Pc/s72-c/datagridItemRender.JPG' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-8027019042061253485</id><published>2009-02-05T21:37:00.005-04:30</published><updated>2009-02-05T22:46:03.281-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='binding'/><category scheme='http://www.blogger.com/atom/ns#' term='datagrid'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='arraycollection'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><title type='text'>Obtener una celda o dato de un Datagid</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SYurSXmQgDI/AAAAAAAAAMM/DDCXRDcWW3c/s1600-h/DataGrid.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 97px;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SYurSXmQgDI/AAAAAAAAAMM/DDCXRDcWW3c/s200/DataGrid.JPG" alt="" id="BLOGGER_PHOTO_ID_5299517718591995954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Un breve ejemplo de como obtener los datos de un datagrid por medio de su propiedad dataProvider.&lt;br /&gt;&lt;br /&gt;En el ejemplo vamos a usar un &lt;a style="font-weight: bold;" href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflex%2F2%2Flangref%2Fmx%2Fcollections%2FArrayCollection.html&amp;amp;ei=qaSLSaH1Kpy6MoT55N4H&amp;amp;usg=AFQjCNFBlJ6LXzx8hIDzTAGPuNZy2kzlUA&amp;amp;sig2=ym2FkmvZn18T4zqFYa45Cw"&gt;ArrayCollection &lt;/a&gt;para llenar un &lt;a style="font-weight: bold;" href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflex%2F2%2Flangref%2Fmx%2Fcontrols%2FDataGrid.html&amp;amp;ei=u6SLSZzEKZCCNe-f5MoH&amp;amp;usg=AFQjCNEIm91y5FVA7kduhRgAYkMHn5hAog&amp;amp;sig2=ykdspKu7ZEZGeVViGiQL2A"&gt;Datagrid&lt;/a&gt;, luego vamos a obtener la fila deseada del &lt;a style="font-weight: bold;" href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflex%2F2%2Flangref%2Fmx%2Fcontrols%2FDataGrid.html&amp;amp;ei=u6SLSZzEKZCCNe-f5MoH&amp;amp;usg=AFQjCNEIm91y5FVA7kduhRgAYkMHn5hAog&amp;amp;sig2=ykdspKu7ZEZGeVViGiQL2A"&gt;Datagrid &lt;/a&gt;segun el "numero de fila". Tambien vamos a ser capaces de detectar cual es la fila que esta seleccionada y obtener su informacion con la propierar selectedIndex de la clase &lt;a style="font-weight: bold;" href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflex%2F2%2Flangref%2Fmx%2Fcontrols%2FDataGrid.html&amp;amp;ei=u6SLSZzEKZCCNe-f5MoH&amp;amp;usg=AFQjCNEIm91y5FVA7kduhRgAYkMHn5hAog&amp;amp;sig2=ykdspKu7ZEZGeVViGiQL2A"&gt;Datagrid&lt;/a&gt;.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Para empezar vamos a crear una clase Persona con los datos: Nombre, Apellido y cedula:&lt;br /&gt;&lt;br /&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt; &lt;span style="color: rgb(0, 0, 102); font-weight: bold;font-size:130%;" &gt;Archivo clase Persona.as&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com&lt;br /&gt;{&lt;br /&gt;public class Persona&lt;br /&gt;{&lt;br /&gt;public var nombre : String;&lt;br /&gt;public var apellido : String;&lt;br /&gt;public var cedula : String;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public function Persona()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Luego debemos en la aplicacion principal crear una funcion handler llamada "init" para el evento &lt;a href="http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&amp;amp;file=containers_intro_063_12.html"&gt;creationComplete&lt;/a&gt;, este evento se dispara apenas la aplicacion se acaba de terminar de crear y esta lista para empezar a ejecutarse, creamos un &lt;a href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflex%2F2%2Flangref%2Fmx%2Fcollections%2FArrayCollection.html&amp;amp;ei=RqiLSZHFJdW5twfvsPygBw&amp;amp;usg=AFQjCNFBlJ6LXzx8hIDzTAGPuNZy2kzlUA&amp;amp;sig2=4odvCDCeMuwyi6EUkIxv-A"&gt;ArrayCollection &lt;/a&gt;y agregarle por ejemplo, dos personas cuales quiera:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public function init() : void&lt;br /&gt;{&lt;br /&gt;var persona1 : Persona = new Persona();&lt;br /&gt;persona1.nombre = "Alejandro";&lt;br /&gt;persona1.apellido = "Sanchez";&lt;br /&gt;persona1.cedula = "17405689";&lt;br /&gt;&lt;br /&gt;var persona2 : Persona = new Persona();&lt;br /&gt;persona2.nombre = "Ramon";&lt;br /&gt;persona2.apellido = "Ramos";&lt;br /&gt;persona2.cedula = "14758243";&lt;br /&gt;&lt;br /&gt;personas.addItem(persona1);&lt;br /&gt;personas.addItem(persona2);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Recuerden colocar esta funcion como handler del evento creationComplete de la aplicacion.&lt;br /&gt;&lt;br /&gt;Ahora debemos decirle al &lt;a href="http://livedocs.adobe.com/flex/2/langref/mx/controls/DataGrid.html"&gt;Datagrid &lt;/a&gt;que debe llenarse con la informacion de ese &lt;a href="http://livedocs.adobe.com/flex/2/langref/mx/collections/ArrayCollection.html"&gt;ArrayCollection&lt;/a&gt;, para eso utilizamos la propiedad dataProvider del &lt;a href="http://livedocs.adobe.com/flex/2/langref/mx/controls/DataGrid.html"&gt;Datagrid&lt;/a&gt;, ademas debemos decirle como manejar esa informacion, debemos crear tres columnas (&lt;a href="http://livedocs.adobe.com/flex/2/langref/mx/controls/dataGridClasses/DataGridColumn.html"&gt;DataGridColumn&lt;/a&gt;) dandole valores a las propiedades &lt;span style="font-weight: bold;"&gt;headerText &lt;/span&gt;(el nombre que queremos mostrar en el tope de esa columna) y &lt;span style="font-weight: bold;"&gt;dataField &lt;/span&gt;(el nombre de la propiedad de la clase persona que contiene el dato a mostrar):&lt;br /&gt;&lt;pre name="code" class="html"&gt;&lt;br /&gt;&amp;lt;mx:DataGrid id="dg" x="10" y="10" dataProvider="{personas}"&amp;gt;&lt;br /&gt;&amp;lt;mx:columns&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="Nombre" dataField="nombre"/&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="Apellido" dataField="apellido"/&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="Cedula" dataField="cedula"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:columns&amp;gt;&lt;br /&gt;&amp;lt;/mx:DataGrid&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ahora procedemos a crear un pequeño formulario donde se van a mostrar los datos que vamos a obtener de la fila que se introduzca. Para eso vmos a crea el siguente fomulario:&lt;br /&gt;&lt;pre name="code" class="html"&gt;&lt;br /&gt;&amp;lt;mx:TextInput id="nro" x="10" y="195" width="41"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Button x="59" y="195" label="Obtener" click="obtener()"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Label x="10" y="169" text="¿Qué fila deseas obtener?"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Canvas x="10" y="225" width="287" height="96" backgroundColor="#FFFFFF"&amp;gt;&lt;br /&gt;&amp;lt;mx:Label x="10" y="10" text="Nombre"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Label x="10" y="36" text="Apellido"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Label x="10" y="62" text="Cédula"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Label id="labelNombre" x="62" y="10" text="No definido"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Label id="labelApellido" x="62" y="36" text="No definido"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Label id="labelCedula" x="62" y="62" text="No definido"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:Canvas&amp;gt;&lt;br /&gt;&amp;lt;mx:Button x="140" y="195" label="La fila seleccionada" width="157" click="filaSeleccionada()"/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Si se fijan hay dos cosas importantes aqui: La llamada a los metodos obtener() y filaSeleccionada() cuando el usuario haga click en cada uno de los botones, y que hemos identificado los controles que vamos a trabajar desde el codigo Action Script asignandoles una identificado String en la propiedad "id". Ahora debemos definir que van a realizar los metodos handlers que hemos colocado para manejar los eventos click.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public function obtener() : void&lt;br /&gt;{&lt;br /&gt;if(personas.length&gt;Number(nro.text) &amp;amp;&amp;amp; Number(nro.text)&gt;=0)&lt;br /&gt;{&lt;br /&gt;var auxPersona : Persona = Persona(personas.getItemAt(Number(nro.text)));&lt;br /&gt;&lt;br /&gt;labelApellido.text = auxPersona.apellido;&lt;br /&gt;labelCedula.text = auxPersona.cedula;&lt;br /&gt;labelNombre.text = auxPersona.nombre;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;Alert.show('El indice excede el numero de filas o es negativo, recuerda que se empieza por el numero 0');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public function filaSeleccionada() : void&lt;br /&gt;{&lt;br /&gt;if(dg.selectedItem) nro.text = dg.selectedIndex.toString();&lt;br /&gt;else Alert.show("Debes seleccionar un item");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El primer metodo (obtener) se encarga de obtener los datos del numero de fila que contenga el &lt;a href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflex%2F2%2Flangref%2Fmx%2Fcontrols%2FTextInput.html&amp;amp;ei=96iLSefoFYH8tgfJmI2VBw&amp;amp;usg=AFQjCNFIYwSXJm-Ufpq95qqEAcykeVye7w&amp;amp;sig2=3EzVJ5gd1XB_Hx1BYEFQDw"&gt;textInput &lt;/a&gt;llamado "nro". El segundo metodo obtiene el indice de la fila seleccionada (Si hay alguna, por supuesto).&lt;br /&gt;&lt;br /&gt;Bueno al final el codigo de nuestro archivo aplicacion llamado ejemploDataGrid.mxml queda de la siguiente manera:&lt;br /&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt; &lt;span style="color: rgb(0, 0, 102); font-weight: bold;font-size:130%;" &gt;Archivo clase ejemploDatagrid.mxml&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="html"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"&amp;gt;&lt;br /&gt;&amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;lt;![CDATA[&lt;br /&gt;import mx.controls.Alert;&lt;br /&gt;import mx.collections.ArrayCollection;&lt;br /&gt;import com.Persona;&lt;br /&gt;&lt;br /&gt;[Bindable]&lt;br /&gt;public var personas : ArrayCollection = new ArrayCollection();&lt;br /&gt;&lt;br /&gt;public function init() : void&lt;br /&gt;{&lt;br /&gt;var persona1 : Persona = new Persona();&lt;br /&gt;persona1.nombre = "Alejandro";&lt;br /&gt;persona1.apellido = "Sanchez";&lt;br /&gt;persona1.cedula = "17405689";&lt;br /&gt;&lt;br /&gt;var persona2 : Persona = new Persona();&lt;br /&gt;persona2.nombre = "Ramon";&lt;br /&gt;persona2.apellido = "Ramos";&lt;br /&gt;persona2.cedula = "14758243";&lt;br /&gt;&lt;br /&gt;personas.addItem(persona1);&lt;br /&gt;personas.addItem(persona2);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public function obtener() : void&lt;br /&gt;{&lt;br /&gt;if(personas.length&amp;gt;Number(nro.text) &amp;amp;&amp;amp; Number(nro.text)&amp;gt;=0)&lt;br /&gt;{&lt;br /&gt;var auxPersona : Persona = Persona(personas.getItemAt(Number(nro.text)));&lt;br /&gt;&lt;br /&gt;labelApellido.text = auxPersona.apellido;&lt;br /&gt;labelCedula.text = auxPersona.cedula;&lt;br /&gt;labelNombre.text = auxPersona.nombre;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;Alert.show('El indice excede el numero de filas o es negativo, recuerda que se empieza por el numero 0');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public function filaSeleccionada() : void&lt;br /&gt;{&lt;br /&gt;if(dg.selectedItem) nro.text = dg.selectedIndex.toString();&lt;br /&gt;else Alert.show("Debes seleccionar un item");&lt;br /&gt;}&lt;br /&gt;]]&amp;gt;&lt;br /&gt;&amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGrid id="dg" x="10" y="10" dataProvider="{personas}"&amp;gt;&lt;br /&gt;&amp;lt;mx:columns&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="Nombre" dataField="nombre"/&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="Apellido" dataField="apellido"/&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="Cedula" dataField="cedula"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:columns&amp;gt;&lt;br /&gt;&amp;lt;/mx:DataGrid&amp;gt;&lt;br /&gt;&amp;lt;mx:TextInput id="nro" x="10" y="195" width="41"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Button x="59" y="195" label="Obtener" click="obtener()"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Label x="10" y="169" text="¿Qué fila deseas obtener?"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Canvas x="10" y="225" width="287" height="96" backgroundColor="#FFFFFF"&amp;gt;&lt;br /&gt;&amp;lt;mx:Label x="10" y="10" text="Nombre"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Label x="10" y="36" text="Apellido"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Label x="10" y="62" text="Cédula"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Label id="labelNombre" x="62" y="10" text="No definido"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Label id="labelApellido" x="62" y="36" text="No definido"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Label id="labelCedula" x="62" y="62" text="No definido"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:Canvas&amp;gt;&lt;br /&gt;&amp;lt;mx:Button x="140" y="195" label="La fila seleccionada" width="157" click="filaSeleccionada()"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El ejemplo en funcionamiento luce asi:&lt;br /&gt;&lt;embed pluginspage=" http://www.macromedia.com/go/getflashplayer" src="http://aalejo.googlepages.com/ejemploDatagrid.swf" height="370" width="520"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://aalejo.googlepages.com/obtenerFilaDatagrid.rar"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 125px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SSDhcJ7C_NI/AAAAAAAAAI8/gGFwsT168AY/s400/descargar.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459437839645906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-8027019042061253485?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/8027019042061253485/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/02/obtener-una-celda-o-dato-de-un-datagid.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/8027019042061253485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/8027019042061253485'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/02/obtener-una-celda-o-dato-de-un-datagid.html' title='Obtener una celda o dato de un Datagid'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_8AfDk4OYg00/SYurSXmQgDI/AAAAAAAAAMM/DDCXRDcWW3c/s72-c/DataGrid.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-6814885759319798222</id><published>2009-02-02T22:19:00.015-04:30</published><updated>2009-02-02T23:41:43.136-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='componentes'/><title type='text'>Video tutorial Creacion de un componente Flex</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_8AfDk4OYg00/SYezlVpjWtI/AAAAAAAAAL0/pLlBW3Zv230/s1600-h/flex.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 134px; height: 118px;" src="http://2.bp.blogspot.com/_8AfDk4OYg00/SYezlVpjWtI/AAAAAAAAAL0/pLlBW3Zv230/s400/flex.gif" alt="" id="BLOGGER_PHOTO_ID_5298400940672637650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En este tutorial voy a explicar los principios básicos a seguir para la creación de un &lt;a href="http://www.adobe.com/devnet/flex/articles/creating_comp.html"&gt;componete flex&lt;/a&gt;. Para lograr esto vamos a crear un componente que cotenga un rectangulo que se mueva. Cada vez que este componente sea agregado a una aplicacion flex, entonces la aplciación tendrá un cuadrado que se mueva hacia la derecha. Por mas inutil que resulte este componente, me parece perfecto ejemplo didáctico. De todas maneras próximamente prometo crear componentes mas utiles y explicar como los hice.&lt;br /&gt;&lt;br /&gt;Para empezar el tutorial debemos entender los conceptos básicos que estan presentes en todos los componentes flex, es decir, en todas las clases de flex que heredan de la clase &lt;a href="http://livedocs.adobe.com/flex/2/langref/mx/core/UIComponent.html"&gt;UIComponent &lt;/a&gt;(que es el componente mas básico).&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Parte I&lt;br /&gt;&lt;object height="350" width="425"&gt; &lt;param name="movie" value="http://www.youtube.com/v/0KMIbAdF_UA"&gt;  &lt;embed src="http://www.youtube.com/v/0KMIbAdF_UA" type="application/x-shockwave-flash" height="350" width="425"&gt;&lt;/embed&gt;  &lt;/object&gt;&lt;br /&gt;Parte II&lt;br /&gt;&lt;object height="350" width="425"&gt; &lt;param name="movie" value="http://www.youtube.com/v/FsdyJM93y9s"&gt;  &lt;embed src="http://www.youtube.com/v/FsdyJM93y9s" type="application/x-shockwave-flash" height="350" width="425"&gt;&lt;/embed&gt;  &lt;/object&gt;&lt;br /&gt;&lt;br /&gt;La clase UIComponente propone 5 métodos fundamentales a utilizar:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://es.wikipedia.org/wiki/Constructor_%28inform%C3%A1tica%29"&gt;&lt;span style="font-weight: bold;"&gt;contructor&lt;/span&gt;&lt;/a&gt;: Este metodo se llama de primero en todos los componentes flex, lleva el mismo nombre que la clase que se esta creando. Permite inicializar variables entre otras coas.&lt;/li&gt;&lt;li&gt;&lt;a href="http://livedocs.adobe.com/flash/9.0_es/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;amp;file=00002509.html"&gt;&lt;span style="font-weight: bold;"&gt;createChildren&lt;/span&gt;&lt;/a&gt;: Este metodo se utiliza para agregar hijos al componente, todos los componentes tienen una lista de hijos dentro de si, todos estos hijos son actualizados por otros métodos como updateDisplayList, para que un objeto pueda ser hijo de un componente debe heredar de la clase DisplayObject. Este metodo solo se ejecuta una vez al inicializarse el componente. Los hijos que se quieran agregar después deben agregarse en otros segmentos de código. &lt;/li&gt;&lt;li&gt;&lt;a href="http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&amp;amp;file=ascomponents_advanced_148_12.html"&gt;&lt;span style="font-weight: bold;"&gt;commitProperties&lt;/span&gt;&lt;/a&gt;: Este metodo se invoca para definir o actualizar las propiedades del componente. Se puede ejecutar varias veces, y siempre se ejecuta la rimera vez justo despues del metodo createChildren.&lt;/li&gt;&lt;li&gt;&lt;a href="http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&amp;amp;file=ascomponents_advanced_148_13.html"&gt;&lt;span style="font-weight: bold;"&gt;measure&lt;/span&gt;&lt;/a&gt;: Este metodo se utiliza para definir el tamaño del componente, cada vez que flex no sabe que tamaño tiene el componente entra en este método. Es importante saber que si se define un tamaño explicito (width y height) al componente entonces flex no entrará mas en este método.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&amp;amp;file=ascomponents_advanced_148_16.html"&gt;&lt;span style="font-weight: bold;"&gt;updateDisplayList&lt;/span&gt;&lt;/a&gt;: Este método se encarga de pintar el componente, en este lugar se ejecutan todas las sentencias de coódigo que tengan que ver con la visualizacion del componente. Tambien se ejecuta muchas veces.&lt;/li&gt;&lt;/ol&gt;Cuando un componente es creado por primera vez por flex todos estos metodos se ejecutan en el siguiente orden:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SYe2o0re47I/AAAAAAAAAL8/i7AwrRCWhSw/s1600-h/Dibujo.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 257px;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SYe2o0re47I/AAAAAAAAAL8/i7AwrRCWhSw/s400/Dibujo.JPG" alt="" id="BLOGGER_PHOTO_ID_5298404299076723634" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Es importante saber que estos tres últimos métodos mencionados no se pueden invocar directamente, si queremos llamarlos debemos utilizar unas funciones pensadas para eso:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_8AfDk4OYg00/SYe3A53M8rI/AAAAAAAAAME/N3fCg_Iotus/s1600-h/Dibujo2.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 212px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SYe3A53M8rI/AAAAAAAAAME/N3fCg_Iotus/s400/Dibujo2.JPG" alt="" id="BLOGGER_PHOTO_ID_5298404712784917170" border="0" /&gt;&lt;/a&gt;La razón de no llamar a estos métodos directamente es porque el framewor de flex debe llamarlos cuando lo considere pertinente, es decir, con los métodos &lt;span style="font-weight: bold;"&gt;invalidateProperties&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;invalidateSize &lt;/span&gt;e &lt;span style="font-weight: bold;"&gt;invalidateDisplayList &lt;/span&gt;del &lt;a href="http://livedocs.adobe.com/flex/gumbo/langref/mx/managers/LayoutManager.html"&gt;LayoutManager&lt;/a&gt; nosotros le decimos a flesx que porfavor los llame, a partir de ese momento flex esperará el momento adecuado para llamarlos. Esto debemos tenerlo siempre en cuanta para que no valla a darnos problemas en un futuro.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Creando nuestro componente.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Recuerden que el componente que vamos a crear se encargará de dibujar un rectangulo e irlo moviendo hacia la derecha. Para crear el componente vamos a agregar una nueva &lt;span style="font-weight: bold;"&gt;actionScript Class &lt;/span&gt;que llamaremos MyFirstComponent.as donde colocaremos el siguiente código:&lt;br /&gt;&lt;/span&gt;&lt;span class="fullpost"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s1600-h/code.gif"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:180%;"&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;Código &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);font-size:180%;" class="fullpost" &gt;MyFirstComponent.as&lt;/span&gt;&lt;span class="fullpost"&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;&lt;p&gt;package com.view&lt;br /&gt;{&lt;br /&gt;import flash.events.TimerEvent;&lt;br /&gt;import flash.utils.Timer;&lt;br /&gt;&lt;br /&gt;import mx.core.UIComponent;&lt;br /&gt;import mx.skins.ProgrammaticSkin;&lt;/p&gt;&lt;br /&gt;&lt;p&gt; public class MyFirstComponent extends UIComponent&lt;br /&gt;{&lt;br /&gt;/*&lt;br /&gt;Defino las variables que voy a utilizar en este componente.&lt;br /&gt;*/&lt;br /&gt;private var bloque : ProgrammaticSkin;&lt;br /&gt;private var _timer : Timer = new Timer(50);&lt;br /&gt;private var procesarBloque : Boolean = false;&lt;br /&gt;&lt;br /&gt;public function MyFirstComponent()&lt;br /&gt;{&lt;br /&gt;super();&lt;br /&gt;trace("constructor");&lt;br /&gt;/*&lt;br /&gt;Empiezo el timer y defino un handler llamado pintar para el evento&lt;br /&gt;TimerEvent.TIMER que es disparado por el timer cada 50 miliseg.&lt;br /&gt;&lt;br /&gt;*/&lt;br /&gt;_timer.addEventListener(TimerEvent.TIMER,pintar);&lt;br /&gt;_timer.start();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;override protected function createChildren() : void&lt;br /&gt;{&lt;br /&gt;super.createChildren();&lt;br /&gt;/*&lt;br /&gt;Creo un ProgrammaticSkin y lo agrego a la lista de hijos del&lt;br /&gt;componente.&lt;br /&gt;*/&lt;br /&gt;bloque = new ProgrammaticSkin();&lt;br /&gt;this.addChild(bloque);&lt;br /&gt;&lt;br /&gt;trace("createChildren");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Utilizamos este metodo para cambiar el tamaño de nuestro componente&lt;br /&gt;*/&lt;br /&gt;override protected function measure() : void&lt;br /&gt;{&lt;br /&gt;super.measure();&lt;br /&gt;trace("measure");&lt;br /&gt;&lt;br /&gt;measuredWidth += 30;&lt;br /&gt;measuredHeight += 30;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt; override protected function commitProperties() : void&lt;br /&gt;{&lt;br /&gt;super.commitProperties();&lt;br /&gt;trace("commitProperties");&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Debemos asegurarnos de que "bloque" este creado.&lt;br /&gt;*/&lt;br /&gt;if(bloque)&lt;br /&gt;{&lt;br /&gt;//Solo queremos aumentar la coordenada x de "bloque" si es menor a 100.&lt;br /&gt;if(bloque.x&amp;lt;100) procesarBloque = true;&lt;br /&gt;else procesarBloque = false;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Esta condicional nos permite restringir los bloques que deseamos que sean procesados&lt;br /&gt;esto se puede usar para mejorar el rendimiento del componente ya que de esta manera&lt;br /&gt;podemos controlar la ejecucion de las porciones de codigo, no se debe ejecutar la&lt;br /&gt;porcion que no sea necesaria.&lt;br /&gt;*/&lt;br /&gt;if(procesarBloque)&lt;br /&gt;{&lt;br /&gt;bloque.x++;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt; override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number) : void&lt;br /&gt;{&lt;br /&gt;super.updateDisplayList(unscaledWidth, unscaledHeight);&lt;br /&gt;&lt;br /&gt;trace("updateDisplayList");&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;En este punto pintamos nuestro bloque con el el ancho y alto de 200.&lt;br /&gt;es importante dear de pintar a "bloque si no han ocurrido modificaciones de sus propiedads,&lt;br /&gt;para eso usamos la bandera "procesarBloque" que tambien la utilizamos en el commmitproperties&lt;br /&gt;*/&lt;br /&gt;if(procesarBloque)&lt;br /&gt;{&lt;br /&gt;//bloque.graphics.clear();&lt;br /&gt;bloque.graphics.lineStyle(1,0x000000,1);&lt;br /&gt;bloque.graphics.beginFill(Math.random() * 20000000, 1);&lt;br /&gt;bloque.graphics.moveTo(unscaledWidth,unscaledHeight);&lt;br /&gt;bloque.graphics.lineTo(unscaledWidth,0);&lt;br /&gt;bloque.graphics.lineTo(0,0);&lt;br /&gt;bloque.graphics.lineTo(0,unscaledHeight);&lt;br /&gt;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt; }&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Esta funcion se llama cada 50 milisegundos.&lt;br /&gt;*/&lt;br /&gt;public function pintar(e : TimerEvent) : void&lt;br /&gt;{&lt;br /&gt;//Le digo a flex que cuando considere pertinente puede hacer&lt;br /&gt;//un llamado a la funcion "commitProperties".&lt;br /&gt;this.invalidateProperties();&lt;br /&gt;this.invalidateDisplayList();&lt;br /&gt;this.invalidateSize();&lt;/p&gt;&lt;br /&gt;&lt;p&gt; }&lt;br /&gt;}&lt;br /&gt;}&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;Las variable bloque será donde pintaremos todo nuestro cuadrado, un ProgrammaticSkin es una clase muy liviana que permite utilizar shapes sobre ellas, es decir, pintar lineas y rellenarlas.&lt;br /&gt;&lt;br /&gt;La variable _timer se encargará de hacer una llamada a las funciones invalidateProperties, invalidateSize e invalidateDisplayList cada 50 milisegundos para que el cuadrado pintado se refresque visualmente y para que se le modifique su tamaño y propiedades.&lt;br /&gt;&lt;br /&gt;La variable procesarBloque se definió para restringir los bloques de codigo que seran ejecutados cada vez que se llame al método commitproperties y updateDisplayList (ya que como estos métodos los vamos a llamar frecuentemente, es mejor que no se ejecute todo el codigo que ellos contienen constantemente.).&lt;br /&gt;&lt;br /&gt;En el método create children debemos instanciar y agregar el ProgrammaticSkin que definimos ("bloque") al componente (para que pueda ser visualizado).&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;override protected function createChildren() : void&lt;br /&gt;{&lt;br /&gt;   super.createChildren();&lt;br /&gt;/*&lt;br /&gt;Creo un ProgrammaticSkin y lo agrego a la lista de hijos del&lt;br /&gt;componente.&lt;br /&gt;*/&lt;br /&gt;bloque = new ProgrammaticSkin();&lt;br /&gt;this.addChild(bloque);&lt;br /&gt;&lt;br /&gt;trace("createChildren");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;En el método commitProperties se encargará de aumentar la propiedad "x" de la variable "bloque" para que el cuadradro que esta represente se mueva hacia la derecha.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;  override protected function commitProperties() : void &lt;br /&gt;  {&lt;br /&gt;      super.commitProperties();&lt;br /&gt;      trace("commitProperties");&lt;br /&gt;      &lt;br /&gt;      /*&lt;br /&gt;       Debemos asegurarnos de que "bloque" este creado.&lt;br /&gt;      */&lt;br /&gt;      if(bloque)&lt;br /&gt;    {&lt;br /&gt;     //Solo queremos aumentar la coordenada x de "bloque" si es menor a 100.&lt;br /&gt;     if(bloque.x&lt;100) procesarBloque = true;&lt;br /&gt;     else procesarBloque = false;&lt;br /&gt;     &lt;br /&gt;     /*&lt;br /&gt;        Esta condicional nos permite restringir los bloques que deseamos que sean procesados&lt;br /&gt;        esto se puede usar para mejorar el rendimiento del componente ya que de esta manera&lt;br /&gt;        podemos controlar la ejecucion de las porciones de codigo, no se debe ejecutar la&lt;br /&gt;        porcion que no sea necesaria.&lt;br /&gt;       */&lt;br /&gt;     if(procesarBloque)&lt;br /&gt;       {&lt;br /&gt;        bloque.x++; &lt;br /&gt;       }&lt;br /&gt;    }&lt;br /&gt;      &lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El metodo updateDisplayList se encargara de volver a pintar el cuadrado ahora que esta un podo mas a la derecha (porque commitProperties lo movio hacia la derecha.).&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number) : void&lt;br /&gt;{&lt;br /&gt;    super.updateDisplayList(unscaledWidth, unscaledHeight);&lt;br /&gt;&lt;br /&gt;    trace("updateDisplayList");&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;En este punto pintamos nuestro bloque con el el ancho y alto de 200.&lt;br /&gt;es importante dear de pintar a "bloque si no han ocurrido modificaciones de sus propiedads,para eso usamos la bandera "procesarBloque" que tambien la utilizamos en el commmitproperties&lt;br /&gt;*/&lt;br /&gt;   if(procesarBloque)&lt;br /&gt;  {&lt;br /&gt;    //bloque.graphics.clear();&lt;br /&gt; bloque.graphics.lineStyle(1,0x000000,1);&lt;br /&gt; bloque.graphics.beginFill(Math.random() * 20000000, 1);&lt;br /&gt; bloque.graphics.moveTo(unscaledWidth,unscaledHeight);&lt;br /&gt; bloque.graphics.lineTo(unscaledWidth,0);&lt;br /&gt; bloque.graphics.lineTo(0,0);&lt;br /&gt; bloque.graphics.lineTo(0,unscaledHeight);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El metodo measure le da el tamaño inicial al componente.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;override protected function measure() : void&lt;br /&gt;{&lt;br /&gt;    super.measure();&lt;br /&gt;trace("measure");&lt;br /&gt;&lt;br /&gt;    measuredWidth += 30;&lt;br /&gt;    measuredHeight += 30;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Luego de crear todos estos metodos debemos ejecutar la aplicacion en modo debugger (para que veamos lo que va arrojando la funcion trace).&lt;br /&gt;&lt;br /&gt;Espero que les haya servido este tutorial, cualquier duda que tengan pueden escribirme al mail aalejo@gmail.com o dejar un comentario en la parte de abajo de esta página.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_8AfDk4OYg00/SK-alXEeqJI/AAAAAAAAABo/a_rDcOKXRIM/s1600-h/Slide-Show-icon.jpg"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SK-alXEeqJI/AAAAAAAAABo/a_rDcOKXRIM/s320/Slide-Show-icon.jpg" alt="" id="BLOGGER_PHOTO_ID_5237574858293815442" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Ejemplo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;embed pluginspage=" http://www.macromedia.com/go/getflashplayer" src="http://aalejo.googlepages.com/FlexComponent.swf" height="370" width="520"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://aalejo.googlepages.com/FlexComponent.rar"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 125px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SSDhcJ7C_NI/AAAAAAAAAI8/gGFwsT168AY/s400/descargar.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459437839645906" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-6814885759319798222?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/6814885759319798222/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/02/creacion-de-un-componente-flex.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/6814885759319798222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/6814885759319798222'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/02/creacion-de-un-componente-flex.html' title='Video tutorial Creacion de un componente Flex'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_8AfDk4OYg00/SYezlVpjWtI/AAAAAAAAAL0/pLlBW3Zv230/s72-c/flex.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-4448007120625263733</id><published>2009-02-02T14:07:00.020-04:30</published><updated>2009-02-02T16:42:03.827-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='instalacion'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='componentes'/><title type='text'>Syntax Highlighter - Publicando ejemplos de codigos</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_8AfDk4OYg00/SYdG6Nrc8sI/AAAAAAAAALs/oDUubCwB-W4/s1600-h/sintaxhiglither_2.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 301px; height: 86px;" src="http://2.bp.blogspot.com/_8AfDk4OYg00/SYdG6Nrc8sI/AAAAAAAAALs/oDUubCwB-W4/s400/sintaxhiglither_2.JPG" alt="" id="BLOGGER_PHOTO_ID_5298281452542948034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Para &lt;span style="font-weight: bold;"&gt;publicar ejemplos de códigos en una página web&lt;/span&gt; (o en un blog como este), es necesario realizar una serie de pasos para evitar que el navegador web los interprete (en caso de ser html) o que elimine pequeños estractos creyendo que debe interpretarlos.&lt;br /&gt;&lt;br /&gt;Por otro lado, se pierde mucho la legibilidad del código como consecuencia de una pérdida de la identación (los espacios, tabs, etc.). Como yo siempre he sido partidario de hacer mis ejemplos lo mas entendibles que pueda, no estaba contento con&lt;a href="http://internetdeveloping.blogspot.com/2008/08/utilizando-etiqueta-para-publicar.html"&gt; la solución que habia resuelto&lt;/a&gt; para publicar ejemplos de códigos hasta la fecha, y estaba buscando como loco una solución que me coloreara los codigos (tal cual como lo hace DreamWeaver, Visual Studio, Eclipse, etc.), que me mantiviera la identacion y que me enumerara las lineas.&lt;br /&gt;&lt;br /&gt;Despues de buscar por casi 6 meses ¡¡¡&lt;a href="http://code.google.com/p/syntaxhighlighter/"&gt;Lo consegui&lt;/a&gt;!!! todo el problema era colocar las palabras correctas en google (como siempre), en este caso habia que colocar "&lt;span style="font-weight: bold;"&gt;Syntax Highlighter&lt;/span&gt;" y daríamos con la solución.&lt;br /&gt;&lt;br /&gt;Para que vean la diferencia les voy a colocar un ejemplo de como estaba publicando los ejemplos hasta hoy y de como los voy a publicar de aqui en adelante:&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s1600-h/code.gif"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:180%;"&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;Códigos hasta el dia de hoy :S&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre face="Courier" style="border-top: 2px solid rgb(170, 170, 170); border-bottom: 2px solid rgb(170, 170, 170); background-color: rgb(232, 242, 255); overflow-y: scroll; width: 600px; height: 200px;"&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;function sumar($a,$b)&lt;br /&gt;{&lt;br /&gt;return $a+$b;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function restar($a,$b)&lt;br /&gt;{&lt;br /&gt;return $a-$b;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;echo "La suma es: " . sumar(2,3) . "&amp;lt;/br&amp;gt;";&lt;br /&gt;echo "La resta es: " . restar(2,3);&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;/pre&gt;&lt;/pre&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s1600-h/code.gif"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:180%;"&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;Códigos a partir de hoy :)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="PHP:controls"&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;function sumar($a,$b)&lt;br /&gt;{&lt;br /&gt;return $a+$b;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function restar($a,$b)&lt;br /&gt;{&lt;br /&gt;return $a-$b;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;echo "La suma es: " . sumar(2,3) . "&amp;lt;/br&amp;gt;";&lt;br /&gt;echo "La resta es: " . restar(2,3);&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Como pueden ver hay una gran diferencia ademas de que ahora existe el boton para copiar el codigo de una sola vez sin tener que estar seleccionandolo. Espero que les guste porque todo es para que sea mas entendible. Ahora voy a explicar como instalar este plugin de blogger para los que quieran publicar codigos ejemplos como yo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Instalacion de Syntax Highlighter para Blogger (Blogspot)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Son unos pasos muy basicos:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ir a &lt;a href="http://fazibear.googlepages.com/blogger.html"&gt;esta pagina&lt;/a&gt; y hacer click en el botón "Add to Blogger".&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Serán redireccionados a bloger y deberán introducir el nombre del plugin, yo lo deje vacio para que no apareciera visualmente en el blog, únicamente me interesaba que el codigo javascript se ejecutara dentro de la pagina (y para eso hay que agregarlo al blog).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;De ahora en adelante pueden publicar códigos siempre que los coloquen dentro de los siguientes tags:&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;pre name="code" class="html"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;pre name="code" class="php"&amp;gt;&lt;br /&gt;... tu codigo transformado&lt;br /&gt;a caracteres que no sean interpretados&lt;br /&gt;por tu navegador va aqui...&lt;br /&gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Es importante cambiar el atributo "class" por el nombre del lenguaje que estemos utilizando, en la siguiente tabla se pueden conocer todos los alias de los lenguajes soportados:&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_8AfDk4OYg00/SYdEogxZ33I/AAAAAAAAALc/6lRJgQYSBwQ/s1600-h/sintaxhiglither.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 242px; height: 358px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SYdEogxZ33I/AAAAAAAAALc/6lRJgQYSBwQ/s400/sintaxhiglither.JPG" alt="" id="BLOGGER_PHOTO_ID_5298278949407285106" border="0" /&gt;&lt;/a&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;Por último es bueno saber que podemos configurar algunas opciones mas como si queremos un botón para expandir y contraer el bloque de codigo, el numero de line por el que deseamos empezar, etc. Para eso entramos a la &lt;a href="http://code.google.com/p/syntaxhighlighter/wiki/Configuration"&gt;pagina donde explican la configuracion&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;Bueno eso es todo amigos, les dejo un ejemplo de uso de la librería fuera de blogger, es decir, en mi máquina, para hacer esto no tienen mas que importar los javascript y css que vienen dentro de los directorios Scripts y Styles del archivo &lt;table class="results" id="resultstable" border="0" cellpadding="2" cellspacing="0" width="100%"&gt;&lt;tbody&gt;&lt;tr class="" onmouseover="_rowRolloverOn(this)" onmouseout="_rowRolloverOff(this); cancelBubble=false"&gt;&lt;/tr&gt;&lt;tr class="" onmouseover="_rowRolloverOn(this)" onmouseout="_rowRolloverOff(this); cancelBubble=false"&gt;           &lt;td class="vt id col_0"&gt;  &lt;a href="http://syntaxhighlighter.googlecode.com/files/SyntaxHighlighter_1.5.1.rar" style="white-space: nowrap;"&gt;    SyntaxHighlighter_1.5.1.rar.&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Espero que les haya sido de utilidad y cualquier duda no duden en escribirme a aalejo@gmail.com.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://aalejo.googlepages.com/posts.rar"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 125px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SSDhcJ7C_NI/AAAAAAAAAI8/gGFwsT168AY/s400/descargar.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459437839645906" border="0" /&gt;&lt;/a&gt;&lt;a href="http://ejemplos.net78.net/posts/"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 145px; height: 125px;" src="http://2.bp.blogspot.com/_8AfDk4OYg00/SSDhhAH7C2I/AAAAAAAAAJE/vDxkqZwO6Cw/s400/vistaprevia.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459521108642658" border="0" /&gt;&lt;/a&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-4448007120625263733?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/4448007120625263733/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/02/syntax-highlighter-para-bloggspot.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/4448007120625263733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/4448007120625263733'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/02/syntax-highlighter-para-bloggspot.html' title='Syntax Highlighter - Publicando ejemplos de codigos'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_8AfDk4OYg00/SYdG6Nrc8sI/AAAAAAAAALs/oDUubCwB-W4/s72-c/sintaxhiglither_2.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-7470769075555479405</id><published>2009-02-01T21:25:00.024-04:30</published><updated>2009-06-04T20:54:39.045-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='webservice'/><category scheme='http://www.blogger.com/atom/ns#' term='soap'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Video tutorial WebService basico con php</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SYZfIGhCxLI/AAAAAAAAALU/BVATl1YkrFo/s1600-h/XML.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 50px; height: 50px;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SYZfIGhCxLI/AAAAAAAAALU/BVATl1YkrFo/s400/XML.gif" alt="" id="BLOGGER_PHOTO_ID_5298026604440765618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En la version 5.0 de PHP (Desconosco si en las anteriores tambien, pero no lo creo) existe una libreria llamada &lt;span style="font-weight: bold;"&gt;php_soap.dll, &lt;/span&gt;esta librería permite, realizar llamadas a metodos y objetos remotos utilizando el &lt;a href="http://es.wikipedia.org/wiki/SOAP"&gt;protocolo SOAP&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;En este ejemplo veremos de una manera muy sencilla como invocar nuestros dos primeros metodos remotos Suma (Que dado dos numero devuelve la suma de ellos) y Resta (que dados dos numeros devuelve la resta de ellos).&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Parte I&lt;br /&gt;&lt;object height="350" width="425"&gt; &lt;param name="movie" value="http://www.youtube.com/v/s3igsOCMwcg"&gt;  &lt;embed src="http://www.youtube.com/v/s3igsOCMwcg" type="application/x-shockwave-flash" height="350" width="425"&gt;&lt;/embed&gt;  &lt;/object&gt;&lt;br /&gt;Parte II&lt;br /&gt;&lt;object height="350" width="425"&gt; &lt;param name="movie" value="http://www.youtube.com/v/TRg9zu9kuHw"&gt;  &lt;embed src="http://www.youtube.com/v/TRg9zu9kuHw" type="application/x-shockwave-flash" height="350" width="425"&gt;&lt;/embed&gt;  &lt;/object&gt;&lt;br /&gt;Para lograr esto debemos cumplir con los siguientes pasos:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Asegurarnos de tener activada la libreria php_soap.dll.&lt;/li&gt;&lt;li&gt;Definir el &lt;a href="http://es.wikipedia.org/wiki/WSDL"&gt;WSDL del Webservice&lt;/a&gt; que vamos a consumir.&lt;/li&gt;&lt;li&gt;Implementar el lado del servidor, donde codificaremos y registraremos las dos funciones.&lt;/li&gt;&lt;li&gt;Deinir el lado del cliente donde invocaremos las dos funciones.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Activando la libreria php_soap.dll&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para hacer esto nos vamos al archivo de configuracion de php llamado php.ini, en este archivo vamos a buscar el &lt;span style="font-size:100%;"&gt;php_soap.dll&lt;/span&gt; y verificamos que no este comentado, es decir, que no tenga un ";" punto y coma por delante. Algo asi:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;;extension=php_shmop.dll&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;;extension=php_snmp.dll&lt;/span&gt;&lt;br /&gt;extension=php_soap.dll&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;;extension=php_sockets.dll&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;extension=php_sqlite.dll&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Definir el WSDL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para aprender mejor como definir tu propio WSDL te recomiendo &lt;a href="http://www.desarrolloweb.com/articulos/1581.php"&gt;el siguiente artículo de Desarrolloweb.com&lt;/a&gt;. Les recomiendo tener este archivo alojado en el servidor donde se encontrará la funcion. En nuestro caso el WSDL quedará de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s1600-h/code.gif"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:180%;"&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;Código scramble&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;.wsdl&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size:100%;"&gt;&lt;span&gt;&lt;span&gt;&lt;pre face="Courier" style="border-top: 2px solid rgb(170, 170, 170); border-bottom: 2px solid rgb(170, 170, 170); background-color: rgb(232, 242, 255); overflow-y: scroll; width: 600px; height: 200px;"&gt;&lt;pre&gt;&lt;p&gt;&amp;lt;?xml version ='1.0' encoding ='UTF-8' ?&amp;gt;&lt;br /&gt;&amp;lt;definitions name='Scramble'&lt;br /&gt;targetNamespace='http://localhost/tutoriales/webservice/servidor/scramble.wdsl'&lt;br /&gt;xmlns:tns='http://localhost/tutoriales/webservice/servidor/scramble.wdsl'&lt;br /&gt;xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'&lt;br /&gt;xmlns='http://schemas.xmlsoap.org/wsdl/'&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;message name='sumarRequest'&amp;gt;&lt;br /&gt;&amp;lt;part name='symbol' type='xsd:string'/&amp;gt;&lt;br /&gt;&amp;lt;part name='symbol2' type='xsd:string'/&amp;gt;&lt;br /&gt;&amp;lt;/message&amp;gt;&lt;br /&gt;&amp;lt;message name='sumarResponse'&amp;gt;&lt;br /&gt;&amp;lt;part name='Result' type='xsd:string'/&amp;gt;&lt;br /&gt;&amp;lt;/message&amp;gt;&lt;br /&gt;&amp;lt;message name='restarRequest'&amp;gt;&lt;br /&gt;&amp;lt;part name='symbol' type='xsd:string'/&amp;gt;&lt;br /&gt;&amp;lt;part name='symbol2' type='xsd:string'/&amp;gt;&lt;br /&gt;&amp;lt;/message&amp;gt;&lt;br /&gt;&amp;lt;message name='restarResponse'&amp;gt;&lt;br /&gt;&amp;lt;part name='Result' type='xsd:string'/&amp;gt;&lt;br /&gt;&amp;lt;/message&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;portType name='ScramblePortType'&amp;gt;&lt;br /&gt;&amp;lt;operation name='sumar'&amp;gt;&lt;br /&gt;&amp;lt;input message='tns:sumarRequest'/&amp;gt;&lt;br /&gt;&amp;lt;output message='tns:sumarResponse'/&amp;gt;&lt;br /&gt;&amp;lt;/operation&amp;gt;&lt;br /&gt;&amp;lt;operation name='restar'&amp;gt;&lt;br /&gt;&amp;lt;input message='tns:restarRequest'/&amp;gt;&lt;br /&gt;&amp;lt;output message='tns:restarResponse'/&amp;gt;&lt;br /&gt;&amp;lt;/operation&amp;gt;&lt;br /&gt;&amp;lt;/portType&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;binding name='ScrambleBinding' type='tns:ScramblePortType'&amp;gt;&lt;br /&gt;&amp;lt;soap:binding style='rpc'&lt;br /&gt;transport='http://schemas.xmlsoap.org/soap/http'/&amp;gt;&lt;br /&gt;&amp;lt;operation name='sumar'&amp;gt;&lt;br /&gt;&amp;lt;soap:operation soapAction='urn:localhost-scramble#sumar'/&amp;gt;&lt;br /&gt;&amp;lt;input&amp;gt;&lt;br /&gt;&amp;lt;soap:body use='encoded' namespace='urn:localhost-scramble'&lt;br /&gt;encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/&amp;gt;&lt;br /&gt;&amp;lt;/input&amp;gt;&lt;br /&gt;&amp;lt;output&amp;gt;&lt;br /&gt;&amp;lt;soap:body use='encoded' namespace='urn:localhost-scramble'&lt;br /&gt;encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/&amp;gt;&lt;br /&gt;&amp;lt;/output&amp;gt;&lt;br /&gt;&amp;lt;/operation&amp;gt;&lt;br /&gt;&amp;lt;operation name='restar'&amp;gt;&lt;br /&gt;&amp;lt;soap:operation soapAction='urn:localhost-scramble#restar'/&amp;gt;&lt;br /&gt;&amp;lt;input&amp;gt;&lt;br /&gt;&amp;lt;soap:body use='encoded' namespace='urn:localhost-scramble'&lt;br /&gt;encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/&amp;gt;&lt;br /&gt;&amp;lt;/input&amp;gt;&lt;br /&gt;&amp;lt;output&amp;gt;&lt;br /&gt;&amp;lt;soap:body use='encoded' namespace='urn:localhost-scramble'&lt;br /&gt;encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/&amp;gt;&lt;br /&gt;&amp;lt;/output&amp;gt;&lt;br /&gt;&amp;lt;/operation&amp;gt;&lt;br /&gt;&amp;lt;/binding&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;service name='ScrambleService'&amp;gt;&lt;br /&gt;&amp;lt;port name='ScramblePort' binding='ScrambleBinding'&amp;gt;&lt;br /&gt;&amp;lt;soap:address location='http://localhost/tutoriales/webservice/servidor/sumar.php'/&amp;gt;&lt;br /&gt;&amp;lt;/port&amp;gt;&lt;br /&gt;&amp;lt;/service&amp;gt;&lt;br /&gt;&amp;lt;/definitions&amp;gt;&lt;/p&gt;&lt;/pre&gt;&lt;/pre&gt;El archivo scramble.wsdl debe tener el targetNamespace con la ubicacion de si mismo. Tambien debemos recordar colocar la direccion del archivo del servidor (que en este tutorial se llama sumar.php), esta direcicon se coloca en la seccion Service:&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;blockquote&gt;&amp;lt;service name="'ScrambleService'"&amp;gt;&lt;br /&gt;&amp;lt;port name="'ScramblePort'" binding="'ScrambleBinding'"&amp;gt;&lt;br /&gt;&amp;lt;soap:address location="'http://localhost/tutoriales/webservice/servidor/sumar.php'/"&amp;gt;&lt;br /&gt;&amp;lt;/soap:address&amp;gt;&lt;br /&gt;&amp;lt;/port&amp;gt;&amp;lt;/service&amp;gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;Implementando el lado del Servidor:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En este lado vamos a crear nuestras dos funciones Sumar y Restar:&lt;br /&gt;&lt;pre style="border-top: 2px solid rgb(170, 170, 170); border-bottom: 2px solid rgb(170, 170, 170); background-color: rgb(232, 242, 255); overflow-y: scroll; width: 600px; height: 200px; font-family: Courier;"&gt;&lt;pre&gt;&lt;span style="font-size:100%;"&gt;function sumar($a,$b)&lt;br /&gt;{&lt;br /&gt;return $a+$b;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function restar($a,$b)&lt;br /&gt;{&lt;br /&gt;return $a-$b;&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/span&gt;Tambien es necesario decirle al cache del SOAP cuales son las funciones de las que le hablamos en el WSDL, para eso colocaremos el siguiente codigo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;pre face="Courier" style="border-top: 2px solid rgb(170, 170, 170); border-bottom: 2px solid rgb(170, 170, 170); background-color: rgb(232, 242, 255); overflow-y: scroll; width: 600px; height: 200px;"&gt;&lt;pre&gt;// turn off the wsdl cache&lt;br /&gt;ini_set("soap.wsdl_cache_enabled", "0");&lt;br /&gt;&lt;br /&gt;$server = new SoapServer("scramble.wsdl");&lt;br /&gt;&lt;br /&gt;$server-&gt;addFunction("sumar");&lt;br /&gt;$server-&gt;addFunction("restar");&lt;br /&gt;&lt;br /&gt;$server-&gt;handle();&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;Al final tendremos un archivo llamado "sumar.php" con el siguiente codigo:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s1600-h/code.gif"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:180%;"&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;Código sumar.php&lt;/span&gt;&lt;/span&gt;&lt;pre face="Courier" style="border-top: 2px solid rgb(170, 170, 170); border-bottom: 2px solid rgb(170, 170, 170); background-color: rgb(232, 242, 255); overflow-y: scroll; width: 600px; height: 200px;"&gt;&lt;pre&gt;&lt;p&gt;&amp;lt;?php&lt;/p&gt;&lt;p&gt;function sumar($a,$b)&lt;br /&gt;{&lt;br /&gt;return $a+$b;&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;function restar($a,$b)&lt;br /&gt;{&lt;br /&gt;return $a-$b;&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;// turn off the wsdl cache&lt;br /&gt;ini_set("soap.wsdl_cache_enabled", "0");&lt;/p&gt;&lt;p&gt;$server = new SoapServer("scramble.wsdl");&lt;/p&gt;&lt;p&gt;$server-&amp;gt;addFunction("sumar");&lt;br /&gt;$server-&amp;gt;addFunction("restar");&lt;/p&gt;&lt;p&gt;$server-&amp;gt;handle();&lt;/p&gt;&lt;p&gt;?&amp;gt;&lt;/p&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Definir el lado del Cliente&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para el cliente primero creamos un formulario donde se introduciran los dos numeros que deseamos sumar, luego (si ya se recibieron los dos numeros por el metodo POST) lo que tenemos que hacer es crear un objeto SoapClient diciendole la ubicacion de nuestro WSDL, luego podremos llamar a los metodos sumar y restar como si fueran metodos de este objeto. El codigo del archivo client.php nos queda de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s1600-h/code.gif"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:180%;"&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;Código client.php&lt;/span&gt;&lt;/span&gt;&lt;pre face="Courier" style="border-top: 2px solid rgb(170, 170, 170); border-bottom: 2px solid rgb(170, 170, 170); background-color: rgb(232, 242, 255); overflow-y: scroll; width: 600px; height: 200px;"&gt;&lt;pre&gt;&amp;lt;form id="form1" name="form1" method="post" action=""&amp;gt;&lt;br /&gt;&amp;lt;table width="23%" border="0" cellspacing="0" cellpadding="0"&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;a: &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;input name="a" type="text" id="a" size="5" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;b: &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;input name="b" type="text" id="b" size="5" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;input type="submit" name="button" id="button" value="Submit" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;if(isset($_POST['a']) &amp;amp;&amp;amp; isset($_POST['b']))&lt;br /&gt;{&lt;br /&gt;// turn off the WSDL cache&lt;br /&gt;ini_set("soap.wsdl_cache_enabled", "0");&lt;br /&gt;&lt;br /&gt;$client = new SoapClient("http://ejemplos.net78.net/webservice/servidor/scramble.wsdl");&lt;br /&gt;&lt;br /&gt;$a = $_POST['a'];&lt;br /&gt;$b = $_POST['b'];&lt;br /&gt;&lt;br /&gt;$resultado = $client-&amp;gt;sumar($a,$b);&lt;br /&gt;print("La suma de los numeros : $a + $b es:  $resultado &amp;lt;br&amp;gt;");&lt;br /&gt;&lt;br /&gt;$resultado = $client-&amp;gt;restar($a,$b);&lt;br /&gt;print("La resta de los numeros : $a + $b es: $resultado");&lt;br /&gt;}&lt;p&gt;?&amp;gt;&lt;/p&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;span style="font-size:100%;"&gt;&lt;span&gt;Lamentablemente no puedo demostrar este ejemplo funcionando, ya que el hosting php con el que trabajo no tiene habilitada la libreria &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;php_soap.dll&lt;/span&gt;. Por ende, solo les puedo dejar un link para descargar el ejemplo.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size:100%;"&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span&gt;&lt;br /&gt;&lt;a href="http://ejemplos.net78.net/downloads/cont_descargas.php?archivo=webservice.rar" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 125px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SSDhcJ7C_NI/AAAAAAAAAI8/gGFwsT168AY/s400/descargar.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459437839645906" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-7470769075555479405?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/7470769075555479405/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/02/webservice-basico-con-php.html#comment-form' title='26 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/7470769075555479405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/7470769075555479405'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/02/webservice-basico-con-php.html' title='Video tutorial WebService basico con php'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_8AfDk4OYg00/SYZfIGhCxLI/AAAAAAAAALU/BVATl1YkrFo/s72-c/XML.gif' height='72' width='72'/><thr:total>26</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-3984667771912599603</id><published>2009-01-31T15:34:00.009-04:30</published><updated>2009-01-31T21:25:38.915-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='componentes'/><title type='text'>MouseOverMenu - Componente de Flex</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_8AfDk4OYg00/SYTEBXu2DZI/AAAAAAAAALE/a1FCKTew8Tc/s1600-h/mouseovermenu.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 309px; height: 162px;" src="http://2.bp.blogspot.com/_8AfDk4OYg00/SYTEBXu2DZI/AAAAAAAAALE/a1FCKTew8Tc/s400/mouseovermenu.JPG" alt="" id="BLOGGER_PHOTO_ID_5297574589523955090" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Despues de no publicar una entrada por mas de dos meses (Por razones de fuerza mayor, ya que me estaba graduando :)  ) voy a empezar a publicar bastantes cosas que he venido aprendiendo y he venido trabajando para ustedes.&lt;br /&gt;&lt;br /&gt;En este oportunidad decidí crear un componente de flex que permite colocar botones sobre otros componentes de flex cuando el usuario coloque el mouse sobre ellos, es decir, supongan que ustedes tienen un &lt;a href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflex%2F2%2Flangref%2Fmx%2Fcontrols%2FDataGrid.html&amp;amp;ei=48GESfKuOdTKmQe0-qQb&amp;amp;usg=AFQjCNEIm91y5FVA7kduhRgAYkMHn5hAog&amp;amp;sig2=4VGkp-jrvP7GNoGi47hUdQ"&gt;&lt;span style="font-weight: bold;"&gt;DataGrid &lt;/span&gt;&lt;/a&gt;de una lista de productos, si el usuario quiere agregar un nuevo producto tendrá que hacer click sobre un botón de agregar nuevo producto. Aqui es donde aparece la magia del componente, veamos el ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;embed pluginspage=" http://www.macromedia.com/go/getflashplayer" src="http://aalejo.googlepages.com/MouseOverMenu.swf" height="175" width="340"&gt;&lt;/embed&gt;&lt;br /&gt;El componente &lt;span style="font-weight: bold;"&gt;MouseOverMenu &lt;/span&gt;puede ser aplicado a cualquier objeto que herede de la clase &lt;a href="http://www.google.co.ve/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Flivedocs.adobe.com%2Fflex%2F2%2Flangref%2Fflash%2Fdisplay%2FDisplayObject.html&amp;amp;ei=_cGESaSzJ-CKmQeUr9A1&amp;amp;usg=AFQjCNHWJU5vZLHcAZdh2zTVi2dybZIeyw&amp;amp;sig2=piyl3BYhIG5GtnUMLCnYyQ"&gt;&lt;span style="font-weight: bold;"&gt;DisplayObject &lt;/span&gt;&lt;/a&gt;y para utilizarlo solo debemos decirle en la propiedad &lt;span style="font-weight: bold;"&gt;dispatcherObject&lt;/span&gt; a que objeto se le va a plicar, en este caso cree un Datagrid llamado "personas".&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Es muy importante tener en cuenta que el objeto&lt;span style="font-weight: bold;"&gt;MouseOverMenu &lt;/span&gt;debe ser instanciado siempre &lt;span style="font-weight: bold;"&gt;despues &lt;/span&gt;del objeto al que le va a aplicar, ya que de lo contrario dará un error.&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-size:100%;"&gt;Si un un botón es presionado un evento de tipo &lt;span style="font-weight: bold;"&gt;OptionClickedEvent &lt;/span&gt;es disparado, la propiedad &lt;span style="font-weight: bold;"&gt;optionClicked &lt;/span&gt;de este ecento contendrá el nombre del boton que fue presionado.&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;&lt;br /&gt;Configurando el componente&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-size:100%;"&gt;Para definir los botones del menu debemos pasale al componente un xml en la propiedad &lt;span style="font-weight: bold;"&gt;menuData &lt;/span&gt;que contenga lo siguiente:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;nombre: Es el nombre del boton que se usará para diferenciar cual boton es precionado en el futuro.&lt;/li&gt;&lt;li&gt;icono: El url de la fotografia que se utilizará para representar el boton.&lt;/li&gt;&lt;li&gt;position: Puede ser Top, Bottom, Left o Right y dice la ubicacion del botón dentro sobre el componente &lt;span style="font-weight: bold;"&gt;dispatcherObject.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;width: dice el ancho del botón.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;height: dice el alto del botón.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;El siguiente es un XML de configuracion:&lt;br /&gt;&lt;span&gt;&lt;pre  style="border-top: 2px solid rgb(170, 170, 170); border-bottom: 2px solid rgb(170, 170, 170); background-color: rgb(232, 242, 255); overflow-y: scroll; width: 600px; height: 200px;font-family:Courier;"&gt;&lt;span style="font-size:85%;"&gt;&lt;pre&gt;&amp;lt;options&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;option&lt;br /&gt;   nombre="Agregar usuario"&lt;br /&gt;   icono="http://aalejo.googlepages.com/add.png"&lt;br /&gt;   position="Top"&lt;br /&gt;   width="20"&lt;br /&gt;   height="20"&lt;br /&gt;   /&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;option&lt;br /&gt;      nombre="Eliminar usuario"&lt;br /&gt;     icono="http://aalejo.googlepages.com/delete2.gif"&lt;br /&gt;     position="Top"&lt;br /&gt;     width="20"&lt;br /&gt;     height="20"&lt;br /&gt;   /&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;option&lt;br /&gt;      nombre="Modificar usuario"&lt;br /&gt;      icono="http://aalejo.googlepages.com/Waterolor-Brush-48x48.png"&lt;br /&gt;      position="Bottom"&lt;br /&gt;      width="20"&lt;br /&gt;      height="20"&lt;br /&gt;   /&amp;gt;&lt;br /&gt;&amp;lt;/options&amp;gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;A continuación una aplicacion ejemplo, donde muestro la utilización del componente, tambien esta disponible su&lt;a href="http://aalejo.googlepages.com/MouseOverMenu.rar"&gt; descarga junto con el código fuente del componente&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s1600-h/code.gif"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:180%;"&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;Código:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;pre style="border-top: 2px solid rgb(170, 170, 170); border-bottom: 2px solid rgb(170, 170, 170); background-color: rgb(232, 242, 255); font-family: Courier; overflow-y: scroll; width: 600px; height: 800px;"&gt;&lt;p&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:component="org.component.*" borderColor="#FFFFFF" backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#FFFFFF, #FFFFFF]" width="319" height="159"&amp;gt;&lt;br /&gt;&amp;lt;mx:Script&amp;gt;&lt;br /&gt;&amp;lt;![CDATA[&lt;br /&gt;import mx.collections.ArrayCollection;&lt;br /&gt;import mx.collections.IList;&lt;br /&gt;import org.events.OptionClickedEvent;&lt;br /&gt;import mx.controls.Alert;&lt;br /&gt;&lt;br /&gt;private var stockDataAC:ArrayCollection = new ArrayCollection( [&lt;br /&gt;{ name: "Alejandro", phone: 2456798,  email: "alejandro@mail.com" },&lt;br /&gt;{ name: "Emilio", phone: 4572164,  email: "emilio@mail.com" },&lt;br /&gt;{ name: "Jose", phone: 7986435,  email: "jose@mail.com" },&lt;br /&gt;{ name: "Ramon", phone: 1234567,  email: "ramon@mail.com" } ]);&lt;br /&gt;&lt;br /&gt;public function clickHandler(e : OptionClickedEvent) : void&lt;br /&gt;{&lt;br /&gt;if(personas.selectedIndex&amp;gt;-1 &amp;amp;&amp;amp; e.optionClicked=="Eliminar usuario") IList(stockDataAC).removeItemAt(personas.selectedIndex);&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;Alert.show("Hiciste click en: " + e.optionClicked);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public var menudata : XML = &amp;lt;options&amp;gt;&lt;br /&gt;&amp;lt;option nombre="Agregar usuario" icono="http://aalejo.googlepages.com/add.png" position="Top" width="20" height="20"/&amp;gt;&lt;br /&gt;&amp;lt;option nombre="Eliminar usuario" icono="http://aalejo.googlepages.com/delete2.gif" position="Top" width="20" height="20"/&amp;gt;&lt;br /&gt;&amp;lt;option nombre="Modificar usuario" icono="http://aalejo.googlepages.com/Waterolor-Brush-48x48.png" position="Bottom" width="20" height="20"/&amp;gt;&lt;br /&gt;&amp;lt;/options&amp;gt;;&lt;/p&gt;&lt;p&gt;public var menudata2 : XML = &amp;lt;options&amp;gt;&lt;br /&gt;&amp;lt;option nombre="Guardar Data Grid" icono="org/assets/floppy-48x48.png" position="bottom" width="48" height="48"/&amp;gt;                    &amp;lt;/options&amp;gt;;&lt;br /&gt;]]&amp;gt;&lt;br /&gt;&amp;lt;/mx:Script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;mx:DataGrid x="0" y="0" id="personas" dataProvider="{stockDataAC}"&amp;gt;&lt;br /&gt;&amp;lt;mx:columns&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="name" dataField="name"/&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="phone" dataField="phone"/&amp;gt;&lt;br /&gt;&amp;lt;mx:DataGridColumn headerText="email" dataField="email"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:columns&amp;gt;&lt;br /&gt;&amp;lt;/mx:DataGrid&amp;gt;&lt;br /&gt;&amp;lt;component:MouseOverMenu menuData="{menudata}" dispatcherObject="{personas}" optionClicked="clickHandler(event)"/&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/span&gt;&lt;a href="http://aalejo.googlepages.com/MouseOverMenu.rar"&gt;&lt;/a&gt;&lt;a href="http://aalejo.googlepages.com/MouseOverMenu.rar" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 125px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SSDhcJ7C_NI/AAAAAAAAAI8/gGFwsT168AY/s400/descargar.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459437839645906" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-3984667771912599603?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/3984667771912599603/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2009/01/mouseovermenu-componente-de-flex.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/3984667771912599603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/3984667771912599603'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2009/01/mouseovermenu-componente-de-flex.html' title='MouseOverMenu - Componente de Flex'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_8AfDk4OYg00/SYTEBXu2DZI/AAAAAAAAALE/a1FCKTew8Tc/s72-c/mouseovermenu.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-2725421106415333256</id><published>2008-12-24T03:01:00.015-04:30</published><updated>2009-02-03T00:02:37.274-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='msql'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='seguridad'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='componentes'/><title type='text'>Simple Galeria de imagenes con PHP</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8AfDk4OYg00/SYUAgTYHgVI/AAAAAAAAALM/MtDSs9GS6B4/s1600-h/gallery.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 168px;" src="http://4.bp.blogspot.com/_8AfDk4OYg00/SYUAgTYHgVI/AAAAAAAAALM/MtDSs9GS6B4/s200/gallery.jpg" alt="" id="BLOGGER_PHOTO_ID_5297641091628499282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En los ultimos dias estube buscando por internet una galeria de imagenes lo mas basica posible donde el usuario pudiera ver un conjunto de "vistas miniaturas" (preview) de las imagenes y seleccionar la que quisieran ver mas grande. Eso era todo.&lt;br /&gt;&lt;br /&gt;En mi etapa de busqueda di con una libreria que hacia exactamente lo que yo queria, me parecio excelente, la pude conseguir en la pagina &lt;a href="http://bolgallery.free.fr/"&gt;http://bolgallery.free.fr/.&lt;/a&gt; Esta libreria permite colocar una serie de imagenes en un directorio "images", a partir de estas imagenes la galeria genera las vistas en miniatura de las imagenes, ademas permite generar dos tipos de vistas miniatura que explicare mas adelante. Es muy facil de configurar e instalar.&lt;br /&gt;&lt;br /&gt;Cuando vi esta galeria decidi realizarle unas mejoras para permitir el uso de multiples etiquetas sobre una foto, una base de datos para llevar estadisticas de la cantidad de veces que se ha visto una foto, subir las fotos remotamente, aplicar etiquetas, etc.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;object height="350" width="425"&gt; &lt;param name="movie" value="http://www.youtube.com/v/t8QLeRmrRmM"&gt;  &lt;embed src="http://www.youtube.com/v/t8QLeRmrRmM" type="application/x-shockwave-flash" height="350" width="425"&gt;&lt;/embed&gt;  &lt;/object&gt;&lt;br /&gt;En resumen la galeria que mejore ofrece las siguientes funcionalidades:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Permite asignar nuevas o viejas etiquetas a una fotografia.&lt;/li&gt;&lt;li&gt;Permite agregar fotografias de manera remota y aplicarle las etiquetas dinamicamente.&lt;/li&gt;&lt;li&gt;Permite visualizar conjuntos de imagenes a partir de la combinacion de una o mas etiquetas de manera simultanea, colocando la variable "labels" en el URL de la pagina igualada a las etiquetas deseadas separadas por comas. Ej: &lt;span style="color: rgb(0, 0, 153);"&gt;migaleria.php?labels=etiqueta1,etiqueta2,etiqueta3&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Genera dinamicamente las vistas previas de las fotografias subidas.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Las vistas previas generadas pueden ser de dos tipos: Version a escala de la fotografia a visualizar o recorte aleatorio de una porcion de la fotografia (definido por el webmaster).&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Maneja estadisticas de las vistas o clicks que el usuario ha realizado para cad auna de las fotografias.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Autenticacion de usuario para permitir que solo los usuarios autorizados (aministradores) puedan modificar las fotos. &lt;a href="http://internetdeveloping.blogspot.com/2008/11/autenticacion-autentificacion-de.html"&gt;Para aprender mas sobre esto puedes ir a mi tutorial de autenticación de usuario&lt;/a&gt;.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Instalacion de la galería&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para su utilización no hace falta mas que colocar la carpeta "galeria" en cualquier directorio del servidor, la carpeta llamada "images" será donde se ubicarán todas las imagenes agregadas.&lt;br /&gt;&lt;br /&gt;Luego se procede a crear la base de datos y tablas con el script bd.sql ubicado en el directorio raiz de la galeria.&lt;br /&gt;&lt;br /&gt;El directorio donde se encontraría ubicada la galeria quedaria con los archivos index.php, admin.php, bd.sql, leeme.txt y las siguientes carpetas:&lt;br /&gt;&lt;br /&gt;- images.&lt;br /&gt;- autenticación.&lt;br /&gt;- galeria_de_fotos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Explicacion de los directorios:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;-&lt;span style="font-weight: bold;"&gt;Images&lt;/span&gt;: &lt;span style="color: rgb(153, 0, 0);"&gt;Debe tener todos los permisos de escritura.&lt;/span&gt; Donde se irán guardando todas las imagenes de la galeria, las vistas previas de guardarán automaticamente dentro de este directorio en una carpeta llamada bolGallery.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Autenticación&lt;/span&gt;: contiene todo el modulo para la logica de seguridad. esta carpeta no debe ser modificada. &lt;span style="color: rgb(153, 0, 0);"&gt;Contiene el archivo registro.php que tiene el formulario para la creación de un nuevo usuario&lt;/span&gt;, es importante mantener esta pagina bien oculta (o eliminarla una vez creado el usuario administrador) para que nadie pueda registrarse y modificar, subir o eliminar las fotos.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Galeria_de_fotos&lt;/span&gt;: contiene dos paginas importantes:&lt;br /&gt;&lt;br /&gt;1) index.php: Es el front de la galeria de imagenes, es decir, la pagina que verán lo usuarios finales, los que visiten la galeria, puede ser modificado a placer siempre que se mantenga la llamada a la funcion bolGallery del archivo bolGallery.php. El  siguiente es un ejemplo de una llamada:&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span&gt;&lt;span&gt;&lt;pre face="Courier" style="border-top: 2px solid rgb(170, 170, 170); border-bottom: 2px solid rgb(170, 170, 170); background-color: rgb(232, 242, 255); overflow-y: scroll; width: 600px; height: 200px;"&gt;&lt;pre&gt;        include("bolGallery.php");&lt;br /&gt;if(isset($_GET['labels']))&lt;br /&gt;{&lt;br /&gt;  $array = split(",", $_GET['labels']);&lt;br /&gt;&lt;br /&gt;  bolGallery("../images/",$array, 6, 150, 150,1);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;bolGallery("../images/",null, 6, 150, 150,1);&lt;/pre&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;La funcion &lt;span style="font-weight: bold;"&gt;bolGallery &lt;/span&gt;recive los siguientes parametros:&lt;br /&gt;&lt;br /&gt;a) URL de el directorio donde se encuentran las imagnes: esto no debe modificarse.&lt;br /&gt;b) tablas de referencia: No debe modificarse.&lt;br /&gt;c) cantidad de columnas que se quiere que tenga la galeria.&lt;br /&gt;d) el ancho en pixeles de las vistas previas de la galeria.&lt;br /&gt;e) el alto en pixeles de las vistas previas de la galeria.&lt;br /&gt;f) un booleano que es "true" si se desea colocar una vista previa en tamaño escala de la imagen o "false" si se desea un recorte aleatorio de una porcion de la fotografia.&lt;br /&gt;&lt;br /&gt;2) admin.php: El modulo de administrador, esa página no se debe modificar.&lt;br /&gt;&lt;br /&gt;Espero que todo les funcione correctamente, cualquier duda no duden en entrar a mi pagina  enviarme un correo a: aalejo@gmail.com. Para ver un ejemplo de la galeria en funcionamiento puedes &lt;a href="http://ejemplos.net78.net/galeria/galeria_de_fotos/index.php"&gt;hacer click aqui&lt;/a&gt;. Recuerda crearte un usuario para poder modificar las imagenes.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://aalejo.googlepages.com/galeria.rar" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 125px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SSDhcJ7C_NI/AAAAAAAAAI8/gGFwsT168AY/s400/descargar.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459437839645906" border="0" /&gt;&lt;/a&gt;&lt;a href="http://ejemplos.net78.net/galeria" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 145px; height: 125px;" src="http://2.bp.blogspot.com/_8AfDk4OYg00/SSDhhAH7C2I/AAAAAAAAAJE/vDxkqZwO6Cw/s400/vistaprevia.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459521108642658" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-2725421106415333256?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/2725421106415333256/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2008/12/simple-galeria-de-imagenes-con-php.html#comment-form' title='12 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/2725421106415333256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/2725421106415333256'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2008/12/simple-galeria-de-imagenes-con-php.html' title='Simple Galeria de imagenes con PHP'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_8AfDk4OYg00/SYUAgTYHgVI/AAAAAAAAALM/MtDSs9GS6B4/s72-c/gallery.jpg' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-6770703457121842368</id><published>2008-12-04T19:43:00.009-04:30</published><updated>2008-12-08T22:05:39.963-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='contador'/><title type='text'>Video Tutorial - Contador de usuarios online con PHP</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/STiHfi-WleI/AAAAAAAAAK8/csPRNYgxFWU/s1600-h/j0432621.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 180px; height: 180px;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/STiHfi-WleI/AAAAAAAAAK8/csPRNYgxFWU/s400/j0432621.png" alt="" id="BLOGGER_PHOTO_ID_5276115939498563042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En este caso quiero seguir con la tana de contaores, en esta oportunia decidi implementar un contador de usuarios online, es decir, este contador nos puede decir con relativa certeza cuantos usuarios se encuentran navegando en nuestra página actualmente.&lt;br /&gt;&lt;br /&gt;La implementacion de este contador decidi hacerla de dos maneras, con archivos de texto o con una base de datos MySQL. A todos los que lean este articulo, que no es mucha gente :( , les recomiendo ampliamente la opcion de la base de datos, pero como a veces es costoso alojar una pagina web en un servidor con MySQL, les dejo el ultimo recurso de implementar el contador con archivos de texto.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Para implementar el contador vamos a cumplir con dos premisas principales:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Borrar usuarios con registro obsoleto es nuestra primera accion, si ha pasado mucho tiempo sin dar señales de vida, entonces debemos eliminarlo de la lista hasta que vuelva a aparecer.&lt;/li&gt;&lt;li&gt;Registrar o actualizar usuario, todos los clientes que dan señales de vida son incluidos automaticamente en el archivo de texto o base de datos (Si el usuario ya existia entonces solo se actualiza la fecha).&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8AfDk4OYg00/STh-yz6-NqI/AAAAAAAAAK0/YoYmpK8ATZ0/s1600-h/grafico.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 267px;" src="http://4.bp.blogspot.com/_8AfDk4OYg00/STh-yz6-NqI/AAAAAAAAAK0/YoYmpK8ATZ0/s400/grafico.JPG" alt="" id="BLOGGER_PHOTO_ID_5276106374860650146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);font-size:130%;" &gt; &lt;span style="font-weight: bold; color: rgb(102, 0, 0);"&gt;Contador con archivos de texto&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Primero vamos a implementar el contador con archivos de texto, vamos a crear una pagina llamada uactivos.php que va a contener el siguiente código:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s1600-h/code.gif"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:180%;"&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;Código uactivos.php &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-top: 2px solid rgb(170, 170, 170); border-bottom: 2px solid rgb(170, 170, 170); background-color: rgb(232, 242, 255); overflow-y: scroll; width: 600px; height: 500px; font-family: Courier;" courier="" new=""&gt;&lt;p&gt;&amp;lt;?php&lt;/p&gt;&lt;br /&gt;&lt;p&gt;// Usuarios activos con PHP sin utilizar bases de datos &lt;/p&gt;&lt;br /&gt;&lt;p&gt;//IP del usuario&lt;br /&gt;&lt;br /&gt;$id = $_SERVER [ 'REMOTE_ADDR' ];&lt;/p&gt;&lt;br /&gt;&lt;p&gt;// Tiempo en segundos en que expira la sesión.&lt;br /&gt;&lt;br /&gt;$fin_session = 600; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;//Archivo que contiene los usuarios y tiempo&lt;br /&gt;&lt;br /&gt;$archivo = "usuarios.txt";&lt;/p&gt;&lt;br /&gt;&lt;p&gt;//Si el archivo no existe lo creo&lt;br /&gt;&lt;br /&gt;if(!file_exists($archivo))&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;$a = fopen($archivo, "w");&lt;br /&gt;&lt;br /&gt;fclose($a);&lt;br /&gt;&lt;br /&gt;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt;$arr = file($archivo);&lt;br /&gt;&lt;br /&gt;$contenido = $id.":".time()." "; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;for ( $i = 0 ; $i &amp;lt; sizeof($arr) ; $i++ )&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;$tmp = explode(":",$arr[$i]);&lt;br /&gt;&lt;br /&gt;if (( $tmp[0] != $id ) &amp;amp;&amp;amp; (( time() - $tmp[1] ) &amp;lt; $fin_session ))&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;$contenido .= $id.":".time()." ";&lt;br /&gt;&lt;br /&gt;} &lt;/p&gt;&lt;br /&gt;&lt;p&gt;}&lt;br /&gt;&lt;br /&gt;$fp = fopen($archivo,"w");&lt;br /&gt;&lt;br /&gt;fputs($fp,$contenido);&lt;br /&gt;&lt;br /&gt;fclose($fp);&lt;br /&gt;&lt;br /&gt;$array = file($archivo); &lt;/p&gt;&lt;br /&gt;&lt;p&gt;$USUARIOS_ACTIVOS = count($array); &lt;/p&gt;&lt;br /&gt;&lt;p&gt;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;table width="74%" border="0" align="center" cellpadding="0" cellspacing="0"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;Usuarios activos (online) con PHP.&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;td height="170" align="center" valign="top"&amp;gt;&amp;lt;p align="left"&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;h1&amp;gt;&amp;lt;?php echo "Hay ".$USUARIOS_ACTIVOS." usuarios activos";  ?&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p align="left"&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p align="left"&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p align="center"&amp;gt;Alejandro Sánchez - &amp;lt;a href="http://internetdeveloping.blogspot.com/"&amp;gt;http://internetdeveloping.blogspot.com/&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;/p&gt;&lt;/pre&gt;Lo primero que hacemos es almacenar en una variable $ip la direccion del host (usuario) que esta accediendo a nuestra página, esto lo hacemos con una variable de servido que ya viene &lt;a href="http://ve.php.net/reserved.variables"&gt;predefinida &lt;/a&gt;en PHP, &lt;a href="http://ve.php.net/manual/es/reserved.variables.server.php"&gt;$_SERVER [ 'REMOTE_ADDR' ]&lt;/a&gt;. Luego procedemos a decidir cuanto tiempo queremos que pase un usuario sin dar señales de vida (realizando acciones dentro de la pagina) para que lo consideremos como offline o inactivo, el tiempo que consideremos no debe ser ni muy grande ni muy pequeño, y por supuesto que va ajustado al tipo de pagina que nosotros estemos desarrollando ya que hay paginas donde los usuarios deben obligatoriamente estar actuando dentro de la pagina mientras hay otras paginas donde hay grandes lecturas o tutoriales que no requieren e mucha interaccion con el usuario. En este ejemplo decidi poner 600 segundos como un simple numero que me parecio sensato.&lt;br /&gt;&lt;br /&gt;El siguiente paso es verificar si el archivo donde queremos almacenar los atos de los usuarios existe o si debemos crearlo, con la funcion &lt;a href="http://ve2.php.net/function.file-exists"&gt;file_exists()&lt;/a&gt; de PHP podemos averiguar si el archivo especificao existe. Esto lo hacemos con el siguiente coigo:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;if(!file_exists($archivo))&lt;br /&gt;{&lt;br /&gt;$a = fopen($archivo, "w");&lt;br /&gt;fclose($a);&lt;br /&gt;}&lt;/blockquote&gt;La funcion &lt;a href="http://ve2.php.net/manual/es/function.file.php"&gt;file()&lt;/a&gt; nos permite leer todo el contenido de un archivo y almacenar cada line en una casilla diferente de un arreglo. En este caso, una nueva linea en el archivo representa un nuevo usuario en la pagina, por lo que esta funcion nos cae como anillo al dedo.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;$arr = file($archivo);&lt;br /&gt;&lt;/blockquote&gt;Una vez que tenemos toda la informacion en el arreglo procedemos a recorrerlo realizano una division que transforma la lina de texto original en dos sub cadenas, el operador ":" es el encargado de marcar la separacion entre la primera y la segunda cadena de caracteres.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;$tmp = explode(":",$arr[$i]); &lt;/blockquote&gt;El arreglo $tmp ahora contiene las dos subcadenas que representan lo sigueinte, la primera representa el &lt;a href="http://es.wikipedia.org/wiki/Internet_Protocol"&gt;IP de el usuario&lt;/a&gt; y la segunda el instante en el tiempo en que se registro, debemos verificar que no se ha cumplido su tiempo establecido para dar señales de vida, ya que de lo contrario debemos eliminarlo del archivo de texto.&lt;br /&gt;&lt;br /&gt;Ahora procedemos a actualizar el archivo con los nuevos IP de usuarios y a imprimir pon pantalla  la cantidad de usuarios en linea.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);font-size:130%;" &gt; &lt;span style="font-weight: bold; color: rgb(102, 0, 0);"&gt;Contador con BD MySQL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Ahora procedemos a crear el contador con base de datos, la logica planteada sera practicamente la misma, son los detalles de carpinteria los que voy a explicar:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s1600-h/code.gif"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:180%;"&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;Script para la creacion de la tabla usuarios_activos.php &lt;/span&gt;&lt;/span&gt;&lt;pre style="border-top: 2px solid rgb(170, 170, 170); border-bottom: 2px solid rgb(170, 170, 170); background-color: rgb(232, 242, 255); overflow-y: scroll; width: 600px; height: 250px; font-family: Courier;" courier="" new=""&gt;CREATE TABLE `usuarios_activos` (&lt;br /&gt;`id` bigint(20) NOT NULL auto_increment,&lt;br /&gt;`ip` varchar(11) NOT NULL,&lt;br /&gt;`time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,&lt;br /&gt;PRIMARY KEY  (`id`),&lt;br /&gt;UNIQUE KEY `ip` (`ip`)&lt;br /&gt;) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 &lt;/pre&gt;&lt;br /&gt;Como en este caso estamos trabajando con una base de datos vamos a utilizar las funciones &lt;a href="http://ve.php.net/mysql_query"&gt;mysql_query&lt;/a&gt;, &lt;a href="http://ve.php.net/manual/es/function.mysql-num-rows.php"&gt;mysql_num_row&lt;/a&gt; y &lt;a href="http://ve.php.net/manual/es/function.mysql-fetch-row.php"&gt;mysql_fetch_row&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Luego de registrar el IP y el tiempo en que expira la sesion, el siguiente paso es borrar de la BD todos los registros que tienen un tiempo mayor al tiempo de expiracion (desde que se registraron). Asi garantizamos que no hay ningun usuario obsoleto y podemos proceder a registrar el usuario actual (si es que el mismo no pertenede ya a la tabla de usuarios online), si el ya pertenece entonces le actualizo su hora de registro para que pueda ser considerado mas tiempo como usuario activo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s1600-h/code.gif"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:180%;"&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;UActivo.php &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="border-top: 2px solid rgb(170, 170, 170); border-bottom: 2px solid rgb(170, 170, 170); background-color: rgb(232, 242, 255); overflow-y: scroll; width: 600px; height: 500px; font-family: Courier;" courier="" new=""&gt;&lt;p&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;require('conexion.php');&lt;br /&gt;&lt;br /&gt;// Usuarios activos con PHP sin utilizar bases de datos &lt;/p&gt;&lt;br /&gt;&lt;p&gt;//IP del usuario&lt;br /&gt;&lt;br /&gt;$id = $_SERVER [ 'REMOTE_ADDR' ];&lt;/p&gt;&lt;br /&gt;&lt;p&gt;// Tiempo en segundos en que expira la sesión.&lt;br /&gt;&lt;br /&gt;$fin_session = 600; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;mysql_query("DELETE FROM usuarios_activos WHERE time_to_sec(NOW())-time_to_sec(time) &amp;gt; ".$fin_session);&lt;/p&gt;&lt;br /&gt;&lt;p&gt;$results = mysql_query("SELECT * FROM usuarios_activos WHERE ip='".$id."'");&lt;/p&gt;&lt;br /&gt;&lt;p&gt;if(mysql_num_rows($results)==0)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;mysql_query("INSERT INTO usuarios_activos VALUES('','".$id."',NOW())");&lt;/p&gt;&lt;br /&gt;&lt;p&gt;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt;$results = mysql_query("SELECT count(*) FROM usuarios_activos WHERE ip='".$id."'");&lt;br /&gt;&lt;br /&gt;$row = mysql_fetch_row($results);&lt;/p&gt;&lt;br /&gt;&lt;p&gt;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;table width="74%" border="0" align="center" cellpadding="0" cellspacing="0"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;Hola mundo en PHP, el codigo en este lenguaje debe incluirse entre las etiquetas &amp;amp;lt;?php ?&amp;amp;gt; y para imprimir por pantalla debe usarse la funcion &amp;amp;quot;echo&amp;amp;quot; seguida de la variable, numero o string que se desea imprimir.&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;td height="170" align="center" valign="top"&amp;gt;&amp;lt;p align="center"&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;span class="style6"&amp;gt;&amp;lt;h1&amp;gt;&amp;lt;?php echo "Hay ".$row[0]." usuarios activos";  ?&amp;gt;&amp;lt;/h1&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p align="left"&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p align="left"&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p align="center"&amp;gt;Alejandro Sánchez - http://internetdeveloping.blogspot.com/&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;/p&gt;&lt;/pre&gt;Aqui les dejo un video tutorial sobre el tutorial que acabo de explicar (o intentar explicar), espero que les aclare mejor sobre el tema, cualquier pregunta no duden en preguntarme escribiendome a mi correo aalejo@gmail.com o por este mismo blog.&lt;br /&gt;Parte 1 (Archivo de texto)&lt;br /&gt;&lt;object width="425" height="350"&gt; &lt;param name="movie" value="http://www.youtube.com/v/XGUZkeOzkm0"&gt;  &lt;embed src="http://www.youtube.com/v/XGUZkeOzkm0" type="application/x-shockwave-flash" width="425" height="350"&gt;&lt;/embed&gt;  &lt;/object&gt;&lt;br /&gt;Parte 2 (MySQL)&lt;br /&gt;&lt;object width="425" height="350"&gt; &lt;param name="movie" value="http://www.youtube.com/v/6q4I93Tn47g"&gt;  &lt;embed src="http://www.youtube.com/v/6q4I93Tn47g" type="application/x-shockwave-flash" width="425" height="350"&gt;&lt;/embed&gt;  &lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ejemplos.net78.net/visitas_online/uactivos.php" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;/a&gt;&lt;a href="http://ejemplos.net78.net/visitas_online/uactivos.php" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 145px; height: 125px;" src="http://2.bp.blogspot.com/_8AfDk4OYg00/SSDhhAH7C2I/AAAAAAAAAJE/vDxkqZwO6Cw/s400/vistaprevia.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459521108642658" border="0" /&gt;&lt;/a&gt;&lt;a href="http://aalejo.googlepages.com/contador_visitas_unicas.rar"&gt;&lt;/a&gt;&lt;a href="http://aalejo.googlepages.com/usuarios_en_linea.rar" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 125px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SSDhcJ7C_NI/AAAAAAAAAI8/gGFwsT168AY/s400/descargar.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459437839645906" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-6770703457121842368?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/6770703457121842368/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2008/12/video-tutorial-contador-de-usuarios.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/6770703457121842368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/6770703457121842368'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2008/12/video-tutorial-contador-de-usuarios.html' title='Video Tutorial - Contador de usuarios online con PHP'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_8AfDk4OYg00/STiHfi-WleI/AAAAAAAAAK8/csPRNYgxFWU/s72-c/j0432621.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-2096004233572294823</id><published>2008-12-04T18:38:00.011-04:30</published><updated>2008-12-08T22:03:50.740-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='contador'/><title type='text'>Video Tutorial - Contador de visitas UNICAS con PHP</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_8AfDk4OYg00/SThwlFduudI/AAAAAAAAAKk/DKEEfEDtDXs/s1600-h/icon-counter.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 68px; height: 73px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SThwlFduudI/AAAAAAAAAKk/DKEEfEDtDXs/s400/icon-counter.gif" alt="" id="BLOGGER_PHOTO_ID_5276090745888881106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Continuando con la tanda de contadores, he decidido publicar la implementacion de un contador de visitas únicas. "Visita unica" significa que un usuario que entra a la pagina web por segunda, tercera o cuarta vez, etc. No es tomado en cuenta por el contador, ya que la primera vez que el usuario ingreso ya fue registrada su visita.&lt;br /&gt;&lt;br /&gt;Este tipo de contadores permite acercarnos mucho mas a la realidad actual de nuestra pagina web, ya que en el caso de los contadores simples, la informacion que estos registran no puede ser confiable dado que pueden ocurrir recargas de paginas, visitas repetidas, etc. Y estas no son diferenciadas por los contadores estandar.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Para empezar el tutorial debemos crear una BD en MySQL llamada "contador_visitas_unicas", en esa base de atos vamos a agregar la siguiente tabla:&lt;br /&gt;&lt;pre style="border-top: 2px solid rgb(170, 170, 170); border-bottom: 2px solid rgb(170, 170, 170); background-color: rgb(232, 242, 255); overflow-y: scroll; width: 600px; height: 250px; font-family: Courier;" courier="" new=""&gt;CREATE TABLE `visitas` (&lt;br /&gt;`id` int(4) unsigned NOT NULL auto_increment,&lt;br /&gt;`direccion_ip` varchar(16) default NULL,&lt;br /&gt;`fecha` date NOT NULL default '0000-00-00',&lt;br /&gt;PRIMARY KEY  (`id`)&lt;br /&gt;) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=18 ;&lt;/pre&gt;Como pueden ver, la tabla contiene tres campos: ID, Direccion IP y Fecha. Vamos a enfocarnos en los ultimos dos datos, dado que el primero no es realmente necesario. En el campo Direccion IP de esta tabla, es donde vamos a almacenar el identificador unico de cada computadora (su IP).&lt;br /&gt;&lt;br /&gt;Tambien vamos a usar una columna llamada "Fecha" donde vamos a registrar el dia en que fue almacenada la ip, ya que las visitas unicas son por dia, si el ultimo registro fue hace mas de un dia, entonces podemos volver a regstrarlo.&lt;br /&gt;&lt;br /&gt;Debemos entonces conectarnos a la base de datos, para eso vamos a crear un archivo llamado conexion.php que vamos a importar a la página con la funcion "require()" donde estemos desarrollando y necesitemos conexion con la base de datos:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s1600-h/code.gif"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:180%;"&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;Código conexion.php&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="border-top: 2px solid rgb(170, 170, 170); border-bottom: 2px solid rgb(170, 170, 170); background-color: rgb(232, 242, 255); overflow-y: scroll; width: 600px; height: 250px; font-family: Courier;" courier="" new=""&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;/* conexion ****************/&lt;br /&gt;&lt;br /&gt;// conectamos al servidor MySQL&lt;br /&gt;&lt;br /&gt;$link = mysql_connect('localhost', 'root', '');&lt;br /&gt;&lt;br /&gt;if(!$link) {&lt;br /&gt;&lt;br /&gt;die("Error al intentar conectar: ".mysql_error());&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// seleccionamos la base de datos&lt;br /&gt;&lt;br /&gt;$db_link = mysql_select_db('contador_visitas_unicas', $link);&lt;br /&gt;&lt;br /&gt;if(!$db_link) {&lt;br /&gt;&lt;br /&gt;die('Error al intentar seleccionar la base de datos'. mysql_error());&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* fin conexion ************/&lt;/p&gt;&lt;br /&gt;&lt;p&gt;?&amp;gt;&lt;/p&gt;&lt;/pre&gt;Una vez realizada la conexion, debemos crear el archivo "contador.php", en este archivo esta toda la logica de la página:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s1600-h/code.gif"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:180%;"&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;Código conexion.php &lt;/span&gt;&lt;/span&gt;&lt;pre style="border-top: 2px solid rgb(170, 170, 170); border-bottom: 2px solid rgb(170, 170, 170); background-color: rgb(232, 242, 255); overflow-y: scroll; width: 600px; height: 500px; font-family: Courier;" courier="" new=""&gt;&lt;p&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;//Sript hecho por Alejandro Sanchez&lt;br /&gt;&lt;br /&gt;//www.internetdeveloping.blogspot.com&lt;/p&gt;&lt;br /&gt;&lt;p&gt;//Me conecto a la BD&lt;br /&gt;&lt;br /&gt;require('conexion.php');&lt;/p&gt;&lt;br /&gt;&lt;p&gt;//Devuelve el numero de visitas a partir de una fecha en especifico&lt;br /&gt;&lt;br /&gt;function contarVisitas($aniodesde, $mesdesde, $diadesde )&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;$sql="select count(*) from visitas&lt;br /&gt;&lt;br /&gt;where fecha &amp;gt;= '$aniodesde-$mesdesde-$diadesde'";&lt;br /&gt;&lt;br /&gt;$result= mysql_query($sql);&lt;br /&gt;&lt;br /&gt;if($row = mysql_fetch_array($result))&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;return $row[0];&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else&lt;br /&gt;&lt;br /&gt;return(0);&lt;br /&gt;&lt;br /&gt;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt;//Imprime todas las visitas&lt;br /&gt;&lt;br /&gt;function imprimirVisitas()&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;$sql="select direccion_ip, fecha from visitas";&lt;br /&gt;&lt;br /&gt;$result= mysql_query($sql);&lt;br /&gt;&lt;br /&gt;while($row = mysql_fetch_row($result))&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;echo "fecha: " . $row[1] . " | Direccion ip ---&amp;gt; " . $row[0] . "&amp;lt;br&amp;gt;";&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt;//Esta funcion solo registra una visita si ese mismo dia el usuario no ha entrado ala pagina&lt;br /&gt;&lt;br /&gt;function registrarVisita($IDUSER)&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;/* --------------------------------------------------&lt;br /&gt;&lt;br /&gt;Primero hacemos una consulta para ver si ese mismo&lt;br /&gt;&lt;br /&gt;usuario ya está registrado el día de hoy.&lt;br /&gt;&lt;br /&gt;------------------------------------------------- */&lt;br /&gt;&lt;br /&gt;$sql="select * from visitas&lt;br /&gt;&lt;br /&gt;where direccion_ip='$IDUSER'&lt;br /&gt;&lt;br /&gt;and fecha=CURDATE()";&lt;/p&gt;&lt;br /&gt;&lt;p&gt; $result= mysql_query($sql);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if(mysql_num_rows($result)==0) // Registrar la visita&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;$sql="INSERT INTO visitas VALUES(NULL,'$IDUSER',CURDATE())";&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mysql_query($sql);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/p&gt;&lt;br /&gt;&lt;p&gt; registrarVisita($_SERVER [ 'REMOTE_ADDR' ]);&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;&lt;br /&gt;.style6 {font-size: 24px;&lt;br /&gt;&lt;br /&gt;font-family: Georgia, "Times New Roman", Times, serif;&lt;br /&gt;&lt;br /&gt;font-weight: bold;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;--&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;table width="74%" border="0" align="center" cellpadding="0" cellspacing="0"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;Contador de visitas unicas, los visitantes repetidos seran ignorados, hasta el dia siguietne.&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;td height="170" align="center" valign="middle"&amp;gt;&amp;lt;p align="left"&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;echo "Hasta ahora haz recibido un total de ".contarVisitas(2007, 10, 03 )." visitas unicas por dia";&lt;br /&gt;&lt;br /&gt;echo "&amp;lt;BR&amp;gt;&amp;lt;BR&amp;gt;Detalles de visitas: &amp;lt;br&amp;gt;";&lt;br /&gt;&lt;br /&gt;imprimirVisitas();&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p align="left"&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p align="center"&amp;gt;Alejandro Sánchez - &amp;lt;a href="http://internetdeveloping.blogspot.com/"&amp;gt;http://internetdeveloping.blogspot.com/&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/pre&gt;En este archivo podemos destacar principalmente tres funciones:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;contarVisitas(&lt;span style="color: rgb(51, 51, 255);"&gt;Año, Mes, Dia), recibe una fecha y devuelve todas las visitas unicas que han habido en la página desde esa fecha:&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Para realizar esa consulta debemos utilizar las funciones mysql_query y mysql_fetch_array que nos proporciona el framework de PHP.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;imprimirVisitas() Imprime el IP y la fecha de todas las visitas unicas que ha tenido la pagina hasta la fecha.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;registrarVisita(&lt;span style="color: rgb(51, 51, 255);"&gt;Direccion IP), esta es la funcion mas importante, primero realiza una consulta en la base de datos sobre el usuario con la IP proporcionada en los parametros de la funcion y cuya fecha sea del mismo dia que hoy. Si el resultado de esta consulta es vacio entonces se procede a insertar al usuario, de lo contrario no se hace nada, porque ya el usuario fue registrado en otra visita anterior en este dia.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;A continuación les dejo un video tutorial con todo lo que acabo de explicar durante este tutorial, cualquier duda no duden en escribir! estamos para servir! :)  aalejo@gmail.com.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt; &lt;param name="movie" value="http://www.youtube.com/v/SglgyuPNZMA"&gt;  &lt;embed src="http://www.youtube.com/v/SglgyuPNZMA" type="application/x-shockwave-flash" width="425" height="350"&gt;&lt;/embed&gt;  &lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Tambien les dejo el codigo fuente y un ejemplo funcionando:&lt;br /&gt;&lt;a href="http://aalejo.googlepages.com/contador_visitas_unicas.rar"&gt;&lt;/a&gt;&lt;a href="http://ejemplos.net78.net/contador_unicas/contador.php"&gt;&lt;/a&gt;&lt;a href="http://ejemplos.net78.net/contador_unicas/contador.php" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 145px; height: 125px;" src="http://2.bp.blogspot.com/_8AfDk4OYg00/SSDhhAH7C2I/AAAAAAAAAJE/vDxkqZwO6Cw/s400/vistaprevia.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459521108642658" border="0" /&gt;&lt;/a&gt;&lt;a href="http://aalejo.googlepages.com/contador_visitas_unicas.rar" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 125px;" src="http://1.bp.blogspot.com/_8AfDk4OYg00/SSDhcJ7C_NI/AAAAAAAAAI8/gGFwsT168AY/s400/descargar.jpg" alt="" id="BLOGGER_PHOTO_ID_5269459437839645906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1638565336393713256-2096004233572294823?l=internetdeveloping.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://internetdeveloping.blogspot.com/feeds/2096004233572294823/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://internetdeveloping.blogspot.com/2008/12/video-tutorial-contador-de-visitas.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/2096004233572294823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1638565336393713256/posts/default/2096004233572294823'/><link rel='alternate' type='text/html' href='http://internetdeveloping.blogspot.com/2008/12/video-tutorial-contador-de-visitas.html' title='Video Tutorial - Contador de visitas UNICAS con PHP'/><author><name>Alejandro Sanchez</name><uri>http://www.blogger.com/profile/01858272008297109735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_8AfDk4OYg00/SKeJSLrpkDI/AAAAAAAAAAQ/Gtgs5yE9zBU/S220/yo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_8AfDk4OYg00/SThwlFduudI/AAAAAAAAAKk/DKEEfEDtDXs/s72-c/icon-counter.gif' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1638565336393713256.post-2099681359342796662</id><published>2008-11-22T02:44:00.016-04:30</published><updated>2008-12-08T22:02:14.669-04:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='contador'/><title type='text'>Video tutorial - Contador de visitas PHP</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8AfDk4OYg00/SThgepp3UEI/AAAAAAAAAKc/XHxo-MZBeZA/s1600-h/contadores-web-3.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 117px; height: 57px;" src="http://4.bp.blogspot.com/_8AfDk4OYg00/SThgepp3UEI/AAAAAAAAAKc/XHxo-MZBeZA/s400/contadores-web-3.gif" alt="" id="BLOGGER_PHOTO_ID_5276073043158323266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Si eres o has sido webmaster de una página web, seguramente una ed las primeras cosas que quisiste hacer fue contar todas las visitas que tu sitio recibia, en este tutorial vamos a ver como lograr eso utilizando las funciones fopen, fwrite, fread.&lt;br /&gt;&lt;br /&gt;Tambien debemos conocer las permisologias &lt;a href="http://es.wikipedia.org/wiki/File_Transfer_Protocol"&gt;FTP&lt;/a&gt; de archivos ya que de lo contrario esto nos podra traer problemas con el servidor porque no nos deja escribir sobre el archivo.&lt;br /&gt;&lt;span class="fullpost"&gt;Para empezar les vamos a colocar el codigo fuente (algo simple) de la pagina contador.php:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s1600-h/code.gif"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_8AfDk4OYg00/SKjCif8TeOI/AAAAAAAAABQ/3nx3Oyb_jOU/s320/code.gif" alt="" id="BLOGGER_PHOTO_ID_5235648464763975906" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:180%;"&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;Código de contador.php:&lt;/span&gt;&lt;/span&gt;&lt;pre style="border-top: 2px solid rgb(170, 170, 170); border-bottom: 2px solid rgb(170, 170, 170); background-color: rgb(232, 242, 255); overflow-y: scroll; width: 600px; height: 250px; font-family: Courier;" courier="" new=""&gt;&lt;p&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;//Sript hecho por Alejandro Sanchez&lt;br /&gt;&lt;br /&gt;//www.internetdeveloping.blogspot.com&lt;/p&gt;&lt;br /&gt;&lt;p&gt;// Archivo en donde se acumulará el numero de visitas&lt;br /&gt;&lt;br /&gt;$archivo = "contador.txt";&lt;/p&gt;&lt;br /&gt;&lt;p&gt;if(!file_exists($archivo))&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;$a = fopen($archivo, "w");&lt;br /&gt;&lt;br /&gt;$grabar = fwrite($a, 0);&lt;br /&gt;&lt;br /&gt;fclose($a);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Abrimos el archivo para lectura y escritura&lt;br /&gt;&lt;br /&gt;$a = fopen($archivo, "r");&lt;/p&gt;&lt;br /&gt;&lt;p&gt;// Leemos el contenido del archivo&lt;br /&gt;&lt;br /&gt;$totalVisitas = fread($a, filesize($archivo));&lt;/p&gt;&lt;br /&gt;&lt;p&gt;// Cerramos la conexión al archivo&lt;br /&gt;&lt;br /&gt;fclose($a);&lt;/p&gt;&lt;br /&gt;&lt;p&gt;// Abrimos nuevamente el archivo&lt;br /&gt;&lt;br /&gt;$a = fopen($archivo, "w");&lt;/p&gt;&lt;br /&gt;&lt;p&gt;// Sumamos 1 nueva visita&lt;br /&gt;&lt;br /&gt;$totalVisitas = $totalVisitas + 1;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;// Y reemplazamos por la nueva cantidad de visitas&lt;br /&gt;&lt;br /&gt;$grabar = fwrite($a, $totalVisitas);&lt;/p&gt;&lt;br /&gt;&lt;p&gt;// Cerramos la conexión al archivo&lt;br /&gt;&lt;br /&gt;fclose($a);&lt;/p&gt;&lt;br /&gt;&lt;p&gt;// Imprimimos el total de visitas dándole un formato&lt;br /&gt;&lt;br /&gt;echo "&amp;lt;font face='verdana' size='2'&amp;gt;Total de visitas:".$totalVisitas."&amp;lt;/font&amp;gt;";&lt;br /&gt;&lt;br /&gt;?&amp;gt; &lt;/p&gt;&lt;/pre&gt;La variable $archivo denota la ruta del archivo en el que deseamos almacenar la cuenta de las visitas, la funcion &lt;a href="http://ve2.php.net/manual/es/function.file-exists.php"&gt;file_&lt;/a&gt;&lt;a href="http://ve2.php.net/manual/es/function.file-exists.php"&gt;exists&lt;/a&gt;comprueba la existencia de un archivo en esa direccion y con ese nombre, si no encuentra un archivo en esa direccion entonces se crea.&lt;br /&gt;&lt;blockquote&gt;if(!file_exists($archivo))&lt;br /&gt;{&lt;br /&gt;$a = fopen($archivo, "w");&lt;br /&gt;$grabar = fwrite($a, 0);&lt;br /&gt;fclose($a);&lt;br /&gt;}&lt;/blockquote&gt;Luego procedemos a abrir y leer el archivo con la funcion &lt;a href="http://ve2.php.net/manual/es/function.fopen.php"&gt;fopen &lt;/a&gt;y &lt;a href="http://ve2.php.net/fread"&gt;fread &lt;/a&gt;respectivamente, y guardamos el contenido (numero de visitas) dentro de la variable $totalVisitas, le incrementamos uno a esa variable y procedemos a guardar su nuevo valor en el archivo de texto (reemplazando el viejo valor)  con la funcion &lt;a href="http://ve2.php.net/manual/es/function.fwrite.php"&gt;fwrite&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Permisos de archivo para la funcion fopen:&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:trackmoves/&gt;   &lt;w:trackformatting/&gt;   &lt;w:hyphenationzone&gt;21&lt;/w:HyphenationZone&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:donotpromoteqf/&gt;   &lt;w:lidthemeother&gt;ES&lt;/w:LidThemeOther&gt;   &lt;w:lidthemeasian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:lidthemecomplexscript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:splitpgbreakandparamark/&gt;    &lt;w:dontvertaligncellwithsp/&gt;    &lt;w:dontbreakconstrainedforcedtables/&gt;    &lt;w:dontvertalignintxbx/&gt;    &lt;w:word11kerningpairs/&gt;    &lt;w:cachedcolbalance/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;   &lt;m:mathpr&gt;    &lt;m:mathfont val="Cambria Math"&gt;    &lt;m:brkbin val="before"&gt;    &lt;m:brkbinsub val="&amp;#45;-"&gt;    &lt;m:smallfrac val="off"&gt;    &lt;m:dispdef/&gt;    &lt;m:lmargin val="0"&gt;    &lt;m:rmargin val="0"&gt;    &lt;m:defjc val="centerGroup"&gt;    &lt;m:wrapindent val="1440"&gt;    &lt;m:intlim val="subSup"&gt;    &lt;m:narylim val="undOvr"&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"&gt;   &lt;w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"&gt;   &lt;w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 1"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 2"&gt;   &lt;w:lsdexception locked="false" priority="39" name
