{"id":893,"date":"2006-10-07T21:33:52","date_gmt":"2006-10-07T19:33:52","guid":{"rendered":"http:\/\/blog.rastersoft.com\/index.php\/2006\/10\/07\/programando-para-windows-mobile-5-con-mono-parte-2\/"},"modified":"2015-08-15T18:18:01","modified_gmt":"2015-08-15T18:18:01","slug":"programando-para-windows-mobile-5-con-mono-parte-2","status":"publish","type":"post","link":"https:\/\/blog.rastersoft.com\/?p=893","title":{"rendered":"Programando para Windows Mobile 5 con Mono (parte 2)"},"content":{"rendered":"<p>Ahora que ya <a href=\"https:\/\/blog.rastersoft.com\/index.php\/2006\/10\/01\/programando-para-windows-mobile-5-con-mono\/\">establecimos contacto entre la PDA y el PC<\/a> podemos empezar la parte de programaci\u00f3n.<\/p>\n<p>Windows Mobile 5 incorpora una m\u00e1quina virtual de .NET, por lo que, en principio, parece que podemos utilizar Mono directamente para escribir un programa, transferir el .exe directamente a la PDA y ejecutarlo. Por desgracia la cosa no es tan sencilla, pues las PDAs disponen de una versi\u00f3n reducida de .NET denominada <strong>.NET Compact Framework<\/strong>. Se trata, b\u00e1sicamente, de un subconjunto de la m\u00e1quina virtual cl\u00e1sica, por lo que hay una serie de clases y m\u00e9todos que no estar\u00e1n disponibles. Es por esta raz\u00f3n que los ejecutables .NET para PDAs usan una firma digital diferente que los que son para equipos cl\u00e1sicos, y por eso si intentamos ejecutar en una PDA un programa hecho con Mono recibiremos un mensaje de error, indic\u00e1ndonos que ese fichero no es un programa v\u00e1lido.<\/p>\n<p>Afortunadamente, <a href=\"http:\/\/evain.net\/\">Jean-Baptiste Evain<\/a> public\u00f3 en su blog un <a href=\"http:\/\/evain.net\/blog\/articles\/2006\/03\/31\/mono-and-the-compact-framework-in-love-part-two\">programa que cambia la firma de un ejecutable .NET<\/a>, de manera que ya puede correr en una m\u00e1quina con Compact Framework (por supuesto, deja de ser ejecutable en un equipo cl\u00e1sico). Con \u00e9sto ya tenemos salvado el principal escollo, aunque hay que tener en cuenta que, para usarlo, es necesaria la versi\u00f3n 0.4 o posterior de <strong>CECIL<\/strong>, un m\u00f3dulo escrito y mantenido por el propio Jean-Baptiste Evain que da acceso a bajo nivel a los ficheros .exe de .NET. En <strong>Debian testing<\/strong> y en <strong>Ubuntu Edgy<\/strong> est\u00e1 dicha versi\u00f3n, pero en <strong>Ubuntu Dapper<\/strong>, que todav\u00eda es la versi\u00f3n estable de Ubuntu, est\u00e1 la versi\u00f3n 0.3. De todas maneras, si tenemos en cuenta que Edgy saldr\u00e1 el pr\u00f3ximo d\u00eda 10, no es una espera demasiado larga.<\/p>\n<p>Para usar este programa tan s\u00f3lo tenemos que compilarlo con Mono y luego llamarlo desde la l\u00ednea de comandos, poniendo como primer par\u00e1metro el fichero .exe que queremos convertir.<\/p>\n<p>Ahora que ya podemos meter c\u00f3digo ejecutable en nuestra PDA debemos saber que hay algunas diferencias a la hora de programar para \u00e9sta, las cuales vienen dadas por la diferente naturaleza del dispositivo (sin teclado, poca memoria, sin ventanas que se solapan&#8230;). Veamos algunas de ellas.<\/p>\n<p>Para empezar est\u00e1 el tema de ventanas y widgets. Para trabajar con ellas usaremos las <strong>WinForms<\/strong>, pero teniendo en cuenta que algunos widgets (como, por ejemplo, RichTextForm) no estar\u00e1n disponibles. En esta p\u00e1gina de microsoft (en castellano, adem\u00e1s) hay una excelente relaci\u00f3n de las <a href=\"https:\/\/www.microsoft.com\/spanish\/msdn\/articulos\/archivo\/050503\/voices\/netcfgetstarted.asp\">diferencias entre .NET Framework y .NET Compact Framework<\/a>.<\/p>\n<p>Existen, sin embargo, un par de detalles extra que me gustar\u00eda comentar. Para empezar, por defecto no aparece el bot\u00f3n para desplegar el teclado virtual. Para disponer de \u00e9l tenemos que a\u00f1adir a nuestro Form un men\u00fa, de la siguiente manera:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">MiForm.Menu = new MainMenu();<\/pre>\n<\/div>\n<p align=\"left\">(siendo MiForm el objeto formulario al que le queremos a\u00f1adir el men\u00fa y el teclado). En esta p\u00e1gina podemos encontrar m\u00e1s <a href=\"http:\/\/samples.gotdotnet.com\/quickstart\/CompactFramework\/doc\/inputpanel.aspx\">detalles sobre el teclado virtual<\/a>. <strong>OJO<\/strong>: aunque en ella dice que dicho men\u00fa se a\u00f1ade autom\u00e1ticamente, \u00e9sto s\u00f3lo es cierto cuando trabajamos con Visual Studio, no con Mono.<\/p>\n<p align=\"left\">La segunda cuesti\u00f3n se refiere al bot\u00f3n de la ventana con forma de X. La primera impresi\u00f3n que da es que dicho bot\u00f3n destruye el Form; sin embargo, lo que hace realmente es minimizarlo. Tal y como se explica en esta <a href=\"http:\/\/samples.gotdotnet.com\/quickstart\/CompactFramework\/doc\/ppcformproperties.aspx\">p\u00e1gina de Microsoft sobre el bot\u00f3n de los formularios<\/a>, para que el bot\u00f3n destruya el Form es necesario hacer lo siguiente:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">MiForm.ControlBox = True\r\nMiForm.MinimizeBox = False<\/pre>\n<\/div>\n<p align=\"left\">aunque, en las pruebas que hice, parece que basta con poner a <strong>False<\/strong> la propiedad <strong>MinimizeBox<\/strong> \u00fanicamente, sin tocar <strong>ControlBox<\/strong>. Por \u00faltimo, si ponemos ambas a <strong>False<\/strong> el Form no tendr\u00e1 ning\u00fan bot\u00f3n.<\/p>\n<p align=\"left\">Un detalle importante es que cuando cerramos el \u00faltimo formulario la aplicaci\u00f3n se cierra. En la plataforma cl\u00e1sica, sin embargo, al cerrar un formulario simplemente se retorna de <strong>Application.Run(formulario)<\/strong>. Esto lo descubr\u00ed de casualidad, porque, en la aplicaci\u00f3n que estoy haciendo, necesito cambiar por completo los widgets del formulario en funci\u00f3n de las acciones del usuario. Al principio destru\u00eda el formulario actual (llamando a su m\u00e9todo <strong>close()<\/strong>) y creaba uno nuevo, pero si bien funcionaba en la plataforma cl\u00e1sica, no lo hac\u00eda en la PDA. La soluci\u00f3n en este caso fue llamar al m\u00e9todo <strong>Clear()<\/strong> del formulario, que elimina todos los widgets de \u00e9ste y lo deja listo para ser repoblado con nuevos elementos.<\/p>\n<p align=\"left\">Comentar tambi\u00e9n que si la PDA nos devuelve un error indicando que necesitamos una versi\u00f3n posterior de .NET para ejecutar dicho programa, significa que hemos usado alguna clase o m\u00e9todo no soportado en el Compact Framework. Al pulsar en OK podremos ver el error completo, y en concreto qu\u00e9 m\u00e9todo o clase es la que provoc\u00f3 el error. Si nos ocurre \u00e9sto tendremos que buscar la manera de sustituir dicha clase o m\u00e9todo por otro que s\u00ed est\u00e9 soportado.<\/p>\n<p align=\"left\">Esto es todo lo que llevo descubierto hasta ahora. A medida que encuentre nuevas cosas interesantes las ir\u00e9 poniendo por aqu\u00ed.<\/p>\n<p align=\"left\">Por \u00faltimo, a\u00f1adir dos URLs con informaci\u00f3n extra (en ingl\u00e9s) sobre el <strong>.NET Compact Framework<\/strong>.<\/p>\n<p align=\"left\"><a href=\"http:\/\/msdn.microsoft.com\/library\/default.asp?url=\/library\/en-us\/dv_evtuv\/html\/etconbuildingapplicationsforplatformscomponents.asp\">Building applications for platforms and components<\/a><\/p>\n<p align=\"left\"><a href=\"http:\/\/msdn.microsoft.com\/library\/default.asp?url=\/library\/en-us\/dv_evtuv\/html\/etconNETCompactFramework.asp\">Product information for .NET Compact Framework<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ahora que ya establecimos contacto entre la PDA y el PC podemos empezar la parte de programaci\u00f3n. Windows Mobile 5 incorpora una m\u00e1quina virtual de .NET, por lo que, en principio, parece que podemos utilizar Mono directamente para escribir un programa, transferir el .exe directamente a la PDA y ejecutarlo. Por desgracia la cosa no &hellip; <a href=\"https:\/\/blog.rastersoft.com\/?p=893\" class=\"more-link\">Seguir leyendo <span class=\"screen-reader-text\">Programando para Windows Mobile 5 con Mono (parte 2)<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,7],"tags":[],"class_list":["post-893","post","type-post","status-publish","format-standard","hentry","category-programacion","category-tutoriales"],"_links":{"self":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/893","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=893"}],"version-history":[{"count":1,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/893\/revisions"}],"predecessor-version":[{"id":1911,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/893\/revisions\/1911"}],"wp:attachment":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=893"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=893"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=893"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}