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

<channel>
	<title>Desarrollo Libre</title>
	<atom:link href="http://desarrollolibre.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://desarrollolibre.wordpress.com</link>
	<description>Just another WordPress.com weblog</description>
	<lastBuildDate>Fri, 12 Jun 2009 03:45:54 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='desarrollolibre.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/6d3836708fc25883532adeb1ac9b4ae6?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Desarrollo Libre</title>
		<link>http://desarrollolibre.wordpress.com</link>
	</image>
			<item>
		<title>Flex+Bison+Qt4</title>
		<link>http://desarrollolibre.wordpress.com/2009/06/12/flexbisonqt4/</link>
		<comments>http://desarrollolibre.wordpress.com/2009/06/12/flexbisonqt4/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 03:45:54 +0000</pubDate>
		<dc:creator>chepetux</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://desarrollolibre.wordpress.com/?p=81</guid>
		<description><![CDATA[Bueno, hoy quiero compartir algo con todos, como trabajar con flex y bison en Qt4. Tenia un proyecto en la universidad, investigue e investigue y no encontre casi nada de información acerca de este tema, encontraba muchos ejemplos comunes del uso de flex y bison pero no como usarlo con Qt4. Encontre algunas cositas como [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=desarrollolibre.wordpress.com&blog=3566520&post=81&subd=desarrollolibre&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Bueno, hoy quiero compartir algo con todos, como trabajar con flex y bison en Qt4. Tenia un proyecto en la universidad, investigue e investigue y no encontre casi nada de información acerca de este tema, encontraba muchos ejemplos comunes del uso de flex y bison pero no como usarlo con Qt4. Encontre algunas cositas como QLALR pero me dio hueva estudiarlo asi que mejor le entre solo a flex y bison. Encontré otros que primero creaban el ejecutable del analizador y luego con un QProcess<span style="font-size:28px;font-weight:bold;text-align:center;"> </span> usaban ese ejecutable, pero no me gusto, creo que es mejor generar el código de los analizadores y luego integrarlos con el proyecto de Qt4, asi que eso vamos a hacer.</p>
<p>Antes que nada quiero decirles que no es la gran cosa el ejemplo, ni se si será la mejor manera de hacerlo, pero me funciono muy bien.</p>
<p>En este ejemplo haremos una calculadora, en el código se muestra como trabajar con archivos para mandarselo como parametro al parser y un objeto Acciones que sirve de intermediario por asi decirlo entre el proyecto Qt4 y el parser. Este no es un turorial de flex y bison asi que solo me voy a limitar en la union con Qt4. Estoy utilizando flex 2.5.35 y bison++ 1.21-8 en GNU/Linux.</p>
<p>Proyecto de ejemplo: <a href="http://www.box.net/shared/p1au3j0s1p">prueba_qt4_flex_bison.tar.gz</a></p>
<p>En el archivo scanner.l estan las reglas del analizador léxico. Para generar el código en C++ ejecutamos lo siguiente en la carpeta donde esta el archivo:</p>
<p><strong>flex -d -o scanner.cc scanner.l</strong></p>
<p>Ese comando nos crea el archivo scanner.cc.</p>
<p>En el archivo parser.y estan las reglas del analizador sintactico y semantico. Para generar el código C++ ejecutamos lo siguiente en la carpeta donde esta el archivo:</p>
<p><strong>bison++ -d -hparser.h -o parser.cc parser.y</strong></p>
<p>Ese comando nos crear dos archivos: parser.cc y parser.h</p>
<p>Ahora abrimos el archivo prueba_qt4_flex_bison.pro con Qt Creator y lo compilamos.</p>
<p>Ya con eso tenemos una sencilla calculadora, ahora solo falta probarla: escribir &#8220;<strong>2+3*4</strong>&#8220;, tiene que salir <strong>14</strong></p>
<p>Si se necesita tambien para Windows, pues, el mismo código generado por flex y bison funciona. No se porque el código que genera flex para DOS/Windows no compila, tampoco he tenido tiempo para investigarlo asi que simplemete copie FlexLexer.h que esta en /usr/include y lo pegue en la carpeta de las cabeceras de mingw32, con eso compila nitido en Windows y nuestro programa es multiplataforma.</p>
<p>Espero que les sirva. =)</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/desarrollolibre.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/desarrollolibre.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/desarrollolibre.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/desarrollolibre.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/desarrollolibre.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/desarrollolibre.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/desarrollolibre.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/desarrollolibre.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/desarrollolibre.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/desarrollolibre.wordpress.com/81/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=desarrollolibre.wordpress.com&blog=3566520&post=81&subd=desarrollolibre&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://desarrollolibre.wordpress.com/2009/06/12/flexbisonqt4/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2e7bae8cbb6ceeef751cf23fac85b698?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">chepetux</media:title>
		</media:content>
	</item>
		<item>
		<title>GNU/Linux + Qt4 + MS SQL Server</title>
		<link>http://desarrollolibre.wordpress.com/2008/09/03/gnulinux-qt4-ms-sql-server/</link>
		<comments>http://desarrollolibre.wordpress.com/2008/09/03/gnulinux-qt4-ms-sql-server/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 15:57:51 +0000</pubDate>
		<dc:creator>chepetux</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[QT4]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://desarrollolibre.wordpress.com/?p=69</guid>
		<description><![CDATA[A veces vamos a necesitar que nuestras aplicaciones desarrolladas con Qt se puedan conectar con el SQL Server de Microsoft, esto puede ser por muchas razones, la mia en esta ocasión fue porque eso estamos estudiando en la universidad y sinceramente es muy bueno y mucho mas fácil de utilizar, a pesar de ser un [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=desarrollolibre.wordpress.com&blog=3566520&post=69&subd=desarrollolibre&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>A veces vamos a necesitar que nuestras aplicaciones desarrolladas con Qt se puedan conectar con el SQL Server de Microsoft, esto puede ser por muchas razones, la mia en esta ocasión fue porque eso estamos estudiando en la universidad y sinceramente es muy bueno y mucho mas fácil de utilizar, a pesar de ser un linuxero safado.</p>
<p>Nuestra apliacación corriendo en Windows no nos presenta ningún problema, simplemente configuramos en el panel de control, herramientas administrativas, origenes de datos (ODBC) una conexión con SQL Server y ya esta, en Linux es donde se pone fea la cosa, asi que entremosle.</p>
<p>Los pasos aqui presentados son para Mandriva 2008.1 Spring, pero puede aplicarse a cualquier distribución con unos pequeños cambios.</p>
<p>Los necesario para lograr esto es unixODBC y freeTDS que seria como el driver de MS SQL Server para unixODBC, el problema es que que este driver no soporta unicode, entonces en la aplicación Qt nos dará el siguiente error:</p>
<pre>qGetStringData: Error while fetching data (-1), y ese error ni a patadas se compone,
solamente modificando las fuentes de Qt y compilarlo.</pre>
<p><strong>unixODBC y freeTDS<br />
</strong></p>
<p>Para lograr la comunicación con el SQL Server vamos a necesitar el unixODBC, Mandriva ya lo trae y en los repositorios podemos encontrar todo lo necesario, PERO el problema es que si compilamos nosotros mismos Qt no funcionará con ese unixODBC, da un monton de violaciones al segmento, lei por ahi que el driver ODBC de Qt puede dar problemas con unixODBC si estos no estan compilados con la misma version del compilador o algo asi, no recuerdo bien como era, asi que lo primero que hacemos es bajarnos el unixODBC de <a href="http://www.unixodbc.org/">http://www.unixodbc.org/</a>. Para no complicarnos la vida vamos a usar los paquetes de Mandriva y luego a instalar encima el unixODBC que vamos a compilar, asi que los paquetes que necesitamos instalar son los siguientes:</p>
<p><strong>unixODBC, unixODBC-gui-qt, lib, libunixODBC1-devel, libunixODBC1, libunixODBC-qt</strong></p>
<p>el freeTDS tambien:</p>
<p><strong>libfreetds-devel, libfreetds_mssql-devel, libfreetds0, libfreetds0-unixodbc, libfreetds_mssql0, libfreetds_mssql0-unixodbc</strong></p>
<p>ahora descomprimimos las fuentes de unixODBC, lo configuramos asi:</p>
<p><strong>./configure &#8211;sysconfdir=/etc &#8211;disable-gui &#8211;prefix=/usr</strong></p>
<p>lo instalamos en /usr para que reemplace el paquete de Mandriva, deshabilitamos el gui ya que se vuelve un relajo compilarlo en Mandriva con la mezcla rara de qt3 y la 4 que hay, de todos modos ya tenemos el unixODBC-gui-qt y ese vamos a usar.</p>
<p>luego make y make install, y listo.</p>
<p><strong>Compilar Qt</strong></p>
<p>ahora nos bajamos las fuentes de Qt de <a href="http://trolltech.com/downloads">http://trolltech.com/downloads</a> ahorita esta la version 4.4.1, descomprimimos las fuentes y buscamos el archivo &#8220;qsql_odbc.h&#8221;, este esta aqui:</p>
<p><strong>&lt;directorio donde descomprimieron&gt;/qt-x11-opensource-src-4.4.1/src/sql/drivers/odbc/</strong></p>
<p>editamos este archivo y buscamos #ifdef Q_OS_UNIX y le vamos a agregar # define Q_ODBC_VERSION_2, entonces lo dejamos asi:</p>
<p><strong>#ifdef Q_OS_UNIX<br />
#define HAVE_LONG_LONG 1 // force UnixODBC NOT to fall back to a struct for BIGINTs</strong></p>
<p><strong>// le pongo esto para que funcione con los drivers que no son compatibles<br />
// con unicode<br />
# define Q_ODBC_VERSION_2 //linea que agregamos</strong></p>
<p><strong>#endif</strong></p>
<p>lo guardamos y a compilar, todo lo hacemos desde &lt;directorio donde descomprimieron&gt;/qt-x11-opensource-src-4.4.1/:</p>
<p><strong>./configure -prefix /usr/lib/qt4 -plugin-sql-odbc -plugin-sql-sqlite -plugin-sql-mysql -plugin-sql-oci -assistant-webkit -v</strong></p>
<p>configuramos la compilación de Qt, importante indicarle los plugins para las bases de datos, en este caso el importante es el -plugin-sql-odbc, de ahi otras extras que puse, en prefix el puse /usr/lib/qt4 para que reemplace el que trae Mandriva y asi ya esta todo configurado y funciona al chilazo.</p>
<p><strong>gmake y gmake install</strong></p>
<p>con esto hecho ya casi estamos listos para que nuestra aplicación se conecte con SQL Server.</p>
<p><strong>Configurando unixODBC y freeTDS</strong></p>
<p>configuramos odbc con el archivo /etc/odbc.ini y agregamos lo siguiente:</p>
<p><strong>[MSSQLJDBC]<br />
Description        = FreeTDS MSSQL Server<br />
Driver        = FreeTDS MSSQL Server<br />
Servername        = MSJDBC<br />
Database        = Universidad<br />
UID        = &lt;usuario de la bd&gt;<br />
PWD        = &lt;clave del usuario&gt;<br />
Port        = &lt;puerto por lo general 1433&gt;<br />
Trace        = Yes</strong></p>
<p>en /etc/odbcinst.ini agregamos lo siguiente:</p>
<p><strong>[FreeTDS MSSQL Server]<br />
Description    = TDS MSSQL JDBC Server<br />
Driver          = /usr/lib/libtdsodbc_mssql.so.0<br />
Setup           = /usr/lib/libtdsS.so.1<br />
FileUsage    = 1</strong></p>
<p><strong>[ODBC]<br />
Trace     = yes<br />
TraceFile = /tmp/odbc.log</strong></p>
<p>en /etc/freetds_mssql.conf agregamos lo siguiente:</p>
<p><strong>[MSJDBC]<br />
host = &lt;host del servidor SQL Server, en el mio </strong><strong>192.168.2.2</strong><strong>&gt;<br />
port = &lt;puesto, en el mio </strong><strong>1433</strong><strong>&gt;<br />
tds version = 8.0<br />
client charset = UTF-8</strong></p>
<p>si ejecutamos <strong>/usr/bin/ODBCConfig-root</strong> podremos configurar el ODBC facilito.</p>
<p><a href="http://desarrollolibre.files.wordpress.com/2008/09/odbcconfig.png"><img class="aligncenter size-medium wp-image-75" src="http://desarrollolibre.files.wordpress.com/2008/09/odbcconfig.png?w=300&#038;h=145" alt="" width="300" height="145" /></a></p>
<p>Con esto hecho ya podemos usar nuestra aplicacion Qt4 con SQL Server</p>
<p><strong>QSqlDatabase defaultDB = &amp;QSqlDatabase::addDatabase ( &#8220;QODBC&#8221; );<br />
if ( ! defaultDB )<br />
{<br />
QMessageBox::critical ( this, &#8220;error&#8221; , &#8220;No se pudo conectar con el driver&#8221;);<br />
return;<br />
}</strong></p>
<p><strong>defaultDB-&gt;setDatabaseName ( &#8220;MSSQLJDBC&#8221; );  //el que configuramos en odbc.ini<br />
defaultDB-&gt;setUserName ( &#8220;usuario&#8221; );<br />
defaultDB-&gt;setPassword ( &#8220;clave&#8221; );<br />
</strong></p>
<p>algo muy importante es que el todos los querys tienen que estar en modo Fordward only, ya con eso podemos hacer consultas y todo eso:</p>
<p><strong>QSqlQuery *query = new QSqlQuery( defaultDB );<br />
query-&gt;setForwardOnly ( true );<br />
query-&gt;exec( &#8220;select </strong><strong>nombre_alumno</strong><strong> from Alumno&#8221; );<br />
query-&gt;first();<br />
label-&gt;setText(&#8220;Nombre: &#8221; + query-&gt;value(0).toString() );</strong></p>
<p>ahora si nos devolverá los valores que queremos, no como antes que nos salia &#8220;qGetStringData: Error while fetching data (-1)&#8221;</p>
<p>Para obtener los parámetros de salida de un procedimiento almacenado podemos hacerlo asi:</p>
<p><strong>QString ejecutar=&#8221;DECLARE @nombre nvarchar(80)&#8221;;<br />
ejecutar+=&#8221;; DECLARE @apellido nvarchar(80)&#8221;;<br />
ejecutar+=&#8221;; execute buscarlumno 200308064, @nombre OUTPUT, @apellido OUTPUT&#8221;;<br />
ejecutar+=&#8221;; select @nombre, @apellido&#8221;;<br />
query-&gt;exec( eje );<br />
query-&gt;first();<br />
label-&gt;setText(&#8220;Nombre: &#8221; + query-&gt;value(0).toString() + &#8221; Apellido: &#8221; + query-&gt;value(1).toString() );</strong></p>
<p>el procedimiento que llamamos arriba es el siguiente en la base de datos:</p>
<p><strong>CREATE PROCEDURE buscarlumno ( @car bigint, @nombre nvarchar(80) output, @apell nvarchar(80) output )<br />
AS<br />
BEGIN<br />
select @nombre=nombre_alumno,@apell=apellido_alumno from Alumno where carnet=@car<br />
END;</strong></p>
<p>Es la única manera que he podido obtener los parámetros de salida en Qt, si alguien sabe una mejor manera que nos lo comparta, jejeje.</p>
<p>Espero que les sirva. =0)</p>
<p><strong></strong></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/desarrollolibre.wordpress.com/69/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/desarrollolibre.wordpress.com/69/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/desarrollolibre.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/desarrollolibre.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/desarrollolibre.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/desarrollolibre.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/desarrollolibre.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/desarrollolibre.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/desarrollolibre.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/desarrollolibre.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/desarrollolibre.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/desarrollolibre.wordpress.com/69/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=desarrollolibre.wordpress.com&blog=3566520&post=69&subd=desarrollolibre&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://desarrollolibre.wordpress.com/2008/09/03/gnulinux-qt4-ms-sql-server/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2e7bae8cbb6ceeef751cf23fac85b698?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">chepetux</media:title>
		</media:content>

		<media:content url="http://desarrollolibre.files.wordpress.com/2008/09/odbcconfig.png?w=300" medium="image" />
	</item>
		<item>
		<title>Internacionalización de aplicaciones Qt</title>
		<link>http://desarrollolibre.wordpress.com/2008/07/05/internacionalizacion-de-aplicaciones-qt/</link>
		<comments>http://desarrollolibre.wordpress.com/2008/07/05/internacionalizacion-de-aplicaciones-qt/#comments</comments>
		<pubDate>Sat, 05 Jul 2008 03:23:28 +0000</pubDate>
		<dc:creator>chepetux</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[QT4]]></category>

		<guid isPermaLink="false">http://desarrollolibre.wordpress.com/?p=52</guid>
		<description><![CDATA[Algo muy importante es que nuestras aplicaciones estén preparadas para la traducción a otros idiomas, un ejemplo muy bueno son las lenguas indígenas de Guatemala, para no ir tan lejos, tal vez se necesite que nuestra aplicación la pueda usar una persona que no sabe español, alemanes, ingleses, etc. etc. jejeje.
Para poder traducir fácilmente nuestra [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=desarrollolibre.wordpress.com&blog=3566520&post=52&subd=desarrollolibre&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Algo muy importante es que nuestras aplicaciones estén preparadas para la traducción a otros idiomas, un ejemplo muy bueno son las lenguas indígenas de Guatemala, para no ir tan lejos, tal vez se necesite que nuestra aplicación la pueda usar una persona que no sabe español, alemanes, ingleses, etc. etc. jejeje.</p>
<p>Para poder traducir fácilmente nuestra aplicación lo primero que hacemos es usar el objeto QTranslator, este tiene que ir en el main.cpp, ejemplo</p>
<p><span style="color:#c0c0c0;">Q_INIT_RESOURCE(application);<br />
QTranslator translator;<br />
QApplication app(argc, argv);<br />
translator.load(&#8220;qt4_internacional_en&#8221;);<br />
app.installTranslator(&amp;translator);</span></p>
<p>El translator.load lo que hace es abrir el archivo de traducción que queramos usar, en este ejemplo es qt4_internacional_en (en este ejemplo el archivo tiene que estar en la misma carpeta que el ejecutable), como se puede ver vamos a traducir nuestra aplicación al ingles, este archivo tiene la extención &#8220;qm&#8221; -&gt; &#8220;qt4_internacional_en.qm&#8221;, estos archivos qm se generan a traves de un archivo &#8220;ts&#8221;, asi que vamos a ver el proceso para crear el archivo &#8220;ts&#8221;, traducir el texto del &#8220;ts&#8221; y generar el archivo &#8220;qm&#8221;.</p>
<p>Primero tenemos que preparar nuestro código fuente para crear el archivo &#8220;ts&#8221; ya que la aplicación que crea este archivo lo que hace es sacar del código fuente de nuestro programa lo que se va a traducir.</p>
<p>Nota: Antes de empezar quiero hacer una observación, a la hora de crear los archivos cpp y h para un formulario creado con el diseñador de qt, KDevelop lo deja asi:</p>
<p><span style="color:#c0c0c0;">i_ventana::i_ventana(QWidget* parent, Qt::WFlags fl)<br />
: QDialog( parent, fl ), Ui::Dialog()</span></p>
<p>QDevelop lo deja asi:</p>
<p><span style="color:#c0c0c0;">i_ventana::i_ventana( QWidget * parent, Qt::WFlags f)<br />
: QDialog(parent, f)</span></p>
<p>Lo generado por KDevelop tiene algo de mas comparado con el de QDevelop, el Ui::Dialog(), si creamos el archivo &#8220;ts&#8221; con eso a la hora de traducir veremos algo asi:</p>
<p><a href="http://desarrollolibre.files.wordpress.com/2008/07/qt_linguist1.png"><img class="aligncenter size-medium wp-image-58" src="http://desarrollolibre.files.wordpress.com/2008/07/qt_linguist1.png?w=250&#038;h=193" alt="" width="250" height="193" /></a></p>
<p>Se puede ver que el grupo por así decirlo es Ui, si lo hacemos así no funcionará ni a patadas, lo mejor es quitarle esa parte, no le pasa nada al programa, si trabajamos con QDevelop pues no tenemos que hacer nada.</p>
<h3>Codificar</h3>
<p>Antes de crear el archivo &#8220;ts&#8221; tenemos que indicar en el código fuente de nuestro programa que es lo que se va a traducir, eso lo hacemos con la función &#8216;tr&#8217; ejemplo:</p>
<p><span style="color:#c0c0c0;">Label-&gt;setText( tr(&#8220;Texto a traducir&#8221;) );</span></p>
<p>Es como el i18n que se usa con KLocale de KDE. Algo muy importante es que no debemos hacer lo siguiente:</p>
<p><span style="color:#c0c0c0;">tr( &#8221; Los &#8221; + variable_puntos + &#8221; puntos del examen, &#8221; + variable_nombre + &#8221; fue el que los obtuvo&#8221; )<br />
</span></p>
<p>No podemos concatenar cadenas de esa manera ya que el orden de las palabras no son el mismo en otros idiomas, la traducción de esa frase en ingles es la siguiente ( lo traducí con google ):</p>
<p><span style="color:#c0c0c0;">the 5 points of the review, which was Pedro won</span></p>
<p>Si concatenamos las cadenas así la traducción podría quedar algo así:</p>
<p><span style="color:#c0c0c0;">the 5 points of the review,Pedro which was won</span></p>
<p>Tal vez no sea muy bueno el ejemplo pero se puede ver que las palabras cambiaron de lugar y eso no es bueno, la manera correcta de hacerlo es la siguiente:</p>
<p><span style="color:#c0c0c0;">tr(&#8220;Los %1 puntos del examen, %2 fue el que los obtuvo&#8221;,&#8221;Este es un comentario&#8221;).arg(&#8220;5&#8243;).arg(&#8220;pedro&#8221;)</span></p>
<p>En el texto se usa %1 y %2 (se puede usar los que se quiera, %3, %4, etc), estos serán reemplazados por lo que contenga los argumentos, arg(&#8220;5&#8243;) y arg(&#8220;Pedro&#8221;), el %1 será reemplazado por 5 y %2 por Pedro, el segundo parámetro  es un comentario, este comentario es para ayudar al traductor a saber de que se trata el mensaje, puede ser necesario utilizarlo o no, tal vez se necesite traducir solo la palabra &#8220;save&#8221;, puede que sea salvar, o guardar un archivo, etc. en estos casos es bueno usar el comentario, este comentario lo podrá ver el traductor cuando este utilizando Qt Linguist pero no será visible para el usuario del programa.</p>
<h3>Crear el archivo &#8216;ts&#8217; y traducir</h3>
<p>Cuando ya tenemos preparado nuestro código fuente, utilizamos la consola y nos vamos a la carpeta que contenga los archivos cpp de nuestro programa y ejecutamos:</p>
<p><span style="color:#c0c0c0;">lupdate *.cpp -ts qt4_internacional_en.ts</span></p>
<p>este comando extrae las cadenas que se tengan que traducir y los guarda en el archivo &#8220;qt4_internacional_en.ts&#8221;, ahora abrimos ese archivo con Qt Linguist, especificamos el idioma al que traduciremos en el menú de &#8220;edit&#8221; y en &#8220;Translation File Settings&#8221;, en este caso le puse que lo voy a traducir al ingles de Estados Unidos.</p>
<p><a href="http://desarrollolibre.files.wordpress.com/2008/07/qt_linguist.png"><img class="aligncenter size-medium wp-image-57" src="http://desarrollolibre.files.wordpress.com/2008/07/qt_linguist.png?w=300&#038;h=120" alt="" width="300" height="120" /></a></p>
<p>Como se puede ver ahora ya el grupo no es Ui, como se muestraba en la imagen anterior, ahora si funcionará la traducción, se puede ver el comentario que aparece para que el traductor sepa de que se trata, el traductor traduce el texto y mueve el %1 y %2 a las posiciones que le corresponden en el nuevo idioma, cuando esta lista esa traducción hacemos click en &#8220;Done and Next&#8221; para pasar a la siguiente frase a traducir.</p>
<h3>Generando el archivo &#8216;qm&#8217;</h3>
<p>Cuando terminamos de traducir guardamos el archivo y vamos al menú &#8220;File&#8221; y hacemos click en &#8220;Release&#8221;, esto nos generará el archivo &#8216;qm&#8217;, ahora solo es de copiar este archivo a la carpeta donde esta el ejecutable para que funcione, claro esta que a la hora de especificar el archivo &#8216;qm&#8217; a usar por el programa le podemos decir la dirección donde esta para no tener que copiarlo a la misma carpeta donde esta el ejecutable, imagínense el /usr/bin lleno de archivos &#8216;qm&#8217;, jejeje,</p>
<p><a href="http://desarrollolibre.files.wordpress.com/2008/07/qt_linguist3.png"><img class="aligncenter size-medium wp-image-60" src="http://desarrollolibre.files.wordpress.com/2008/07/qt_linguist3.png?w=300&#038;h=89" alt="" width="300" height="89" /></a></p>
<p>Así quedaría la aplicación con la traducción al ingles, este también funciona para Windows, les dejo el código fuente para que lo trateen: <a href="http://www.box.net/shared/8gmo0r1s04">qt4_internacional.tar.gz</a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/desarrollolibre.wordpress.com/52/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/desarrollolibre.wordpress.com/52/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/desarrollolibre.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/desarrollolibre.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/desarrollolibre.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/desarrollolibre.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/desarrollolibre.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/desarrollolibre.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/desarrollolibre.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/desarrollolibre.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/desarrollolibre.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/desarrollolibre.wordpress.com/52/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=desarrollolibre.wordpress.com&blog=3566520&post=52&subd=desarrollolibre&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://desarrollolibre.wordpress.com/2008/07/05/internacionalizacion-de-aplicaciones-qt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2e7bae8cbb6ceeef751cf23fac85b698?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">chepetux</media:title>
		</media:content>

		<media:content url="http://desarrollolibre.files.wordpress.com/2008/07/qt_linguist1.png?w=250" medium="image" />

		<media:content url="http://desarrollolibre.files.wordpress.com/2008/07/qt_linguist.png?w=300" medium="image" />

		<media:content url="http://desarrollolibre.files.wordpress.com/2008/07/qt_linguist3.png?w=300" medium="image" />
	</item>
		<item>
		<title>Aplicaciones Qt4 multiplataforma que se integran al escritorio (KDE,Windows)</title>
		<link>http://desarrollolibre.wordpress.com/2008/07/03/aplicaciones-qt4-multiplataforma-que-se-integran-al-escritorio-kdewindows/</link>
		<comments>http://desarrollolibre.wordpress.com/2008/07/03/aplicaciones-qt4-multiplataforma-que-se-integran-al-escritorio-kdewindows/#comments</comments>
		<pubDate>Thu, 03 Jul 2008 23:24:11 +0000</pubDate>
		<dc:creator>chepetux</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[QT4]]></category>

		<guid isPermaLink="false">http://desarrollolibre.wordpress.com/?p=38</guid>
		<description><![CDATA[Para que el usuario tenga una buena experiencia con una aplicación es necesario que esta este integrada al escritorio que esta utilizando, por lo menos así lo veo yo, las aplicaciones desarrolladas con Qt4 se integran muy bien con Windows, pero con Linux no es tan bueno, ¿por que?, un ejemplo son los diálogos para [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=desarrollolibre.wordpress.com&blog=3566520&post=38&subd=desarrollolibre&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Para que el usuario tenga una buena experiencia con una aplicación es necesario que esta este integrada al escritorio que esta utilizando, por lo menos así lo veo yo, las aplicaciones desarrolladas con Qt4 se integran muy bien con Windows, pero con Linux no es tan bueno, ¿por que?, un ejemplo son los diálogos para abrir y guardar archivos, de eso se trata este tema, miremos los diálogos en Windows:</p>
<p>Dialogo nativo de Windows:</p>
<p><a href="http://desarrollolibre.files.wordpress.com/2008/07/dialogo_win_qt4.png"><img class="aligncenter size-medium wp-image-39" src="http://desarrollolibre.files.wordpress.com/2008/07/dialogo_win_qt4.png?w=299&#038;h=221" alt="" width="299" height="221" /></a></p>
<p>Al usar este diálogo nuestros usuarios no sentirán nada extraño al usar la aplicación, este diálogo es el que se abre por defecto cuando utilizamos QFileDialog.</p>
<p>Dialogo no nativo de Windows (Diálogo de Qt):</p>
<p><a href="http://desarrollolibre.files.wordpress.com/2008/07/dialogos_win_nonativo.png"><img class="aligncenter size-medium wp-image-40" src="http://desarrollolibre.files.wordpress.com/2008/07/dialogos_win_nonativo.png?w=300&#038;h=211" alt="" width="300" height="211" /></a></p>
<p>Este diálogo es el original de Qt, la verdad no hay mucho problema con este tipo de diálogo en Windows pero en Linux si tenemos una pequeña desventaja, en Linux solo vamos a tener el diálogo de Qt pero no tenemos uno nativo como en Windows:</p>
<p><a href="http://desarrollolibre.files.wordpress.com/2008/07/dialogo_linux_qt4.png"><img class="aligncenter size-medium wp-image-41" src="http://desarrollolibre.files.wordpress.com/2008/07/dialogo_linux_qt4.png?w=300&#038;h=210" alt="" width="300" height="210" /></a></p>
<p>La desventaja es que este dialogo no puede manejar los dispositivos extraibles como memorias USB, CDs, DVDs, etc. etc. ( bueno, eso es lo que yo me he podido dar cuenta ), si queremos abrir o guardar un archivo en una memoria USB primero tenemos que montar esa memoria, ya sea por la consola, utilizando los servicios de KDE, etc. y después ir en el diálogo Qt al lugar donde la montamos, ejemplo /media/memoriaUSB, en Windows no sucede eso, si abrimos un diálogo y luego metemos nuestra memoria automáticamente se crea una nueva unidad, digamos la unidad E: , y ya abrimos o guardamos archivos, sencillo, entonces en Linux no hay diálogos nativos como en Windows, la verdad no es nada extraño ya que en Linux no solo hay un escritorio como en Windows, entonces no se puede tomar los diálogos de GNOME, de KDE u otros como nativos, en unas distribuciones van a estar disponibles algunos diálogos, en otros otros y en otras distribuciones están disponibles todos, ejemplo, es cierto que no importa nuestra distribución, vamos a poder instalar lo que nos haga falta, pero a lo que voy es que no puede existir un diálogo nativo para Linux, a menos que KDE, GNOME y los demás se pongan de acuerdo para usar un solo tipo de diálogo para abrir y guardar archivos.</p>
<p>En este pequeño ejemplo se muestra como integrar nuestra aplicación a KDE 4 y utilizar su diálogos para abrir y guardar archivos si estamos en Linux, si estamos en Windows entonces usamos los nativos de Windows, esto para que siga siendo multiplataforma:</p>
<p><a href="http://desarrollolibre.files.wordpress.com/2008/07/dialogo_lin_kde.png"><img class="aligncenter size-medium wp-image-42" src="http://desarrollolibre.files.wordpress.com/2008/07/dialogo_lin_kde.png?w=300&#038;h=147" alt="" width="300" height="147" /></a></p>
<p>Al usar los diálogos de KDE tenemos la ventaja de trabajar los dispositivos extraibles de una manera muy fácil, montamos, desmontamos, etc. así que el usuario de nuestro programa no tiene que montar en otro lado su memoria y luego regresar al diálogo para trabajar con ella.</p>
<h3>Código</h3>
<p>Para poder hacer que nuestra aplicación se pueda compilar en Linux y en Windows vamos a utilizar el preprocesador de C++</p>
<p><span style="color:#c0c0c0;">#ifdef Q_WS_X11<br />
#include &lt;KFileDialog&gt;<br />
#else<br />
#include &lt;QFileDialog&gt;<br />
#endif</span></p>
<p>#ifdef Q_WS_X11 nos sirve para saber si estamos en Linux, si ese es el caso es incluyen la cabecera del diálogo de KDE para nuestra aplicación, si no se incluye la normales de Qt</p>
<p><span style="color:#c0c0c0;">#ifdef Q_WS_X11</span></p>
<p><span style="color:#c0c0c0;"> direccion=KFileDialog::getOpenFileName(KUrl::fromPath(dir),filter,parent,caption);<br />
#else</span></p>
<p><span style="color:#c0c0c0;"> direccion=QFileDialog::getOpenFileName ( parent,caption,dir,filter);<br />
#endif</span></p>
<p>En otra parte del código utilizamos otra vez el preprocesador para saber que linea se va a compilar, si estamos en Linux se usa el KFileDialog, si estamos en Windows se usa QFileDialog.</p>
<p>No podemos hacer esto:</p>
<p><span style="color:#c0c0c0;">#ifdef Q_WS_X11<br />
#define Linux TRUE<br />
#else<br />
#define Linux FALSE</span></p>
<p>if ( Linux )<br />
direccion=KFileDialog::getOpenFileName(KUrl::fromPath(dir),filter,parent,caption);<br />
else<br />
direccion=QFileDialog::getOpenFileName ( parent,caption,dir,filter);</p>
<p>Podemos usar eso para otra cosa pero no para este caso ya que si compilamos eso en Windows nos va a dar error ya que no va a encontrar KFileDialog, en Linux si compilaría, entonces tenemos que usar el preprocesador dentro de nuestro código, esto para que a la hora de compilar en windows solo entre a las partes que si puede compilar WIndows y viceversa.</p>
<p>No se puede explicar todo el código aquí así que les dejo el ejemplo <a href="http://www.box.net/shared/8azbjxn8ko">qt4_dialogos.tar.gz</a></p>
<p>Este esta desarrollado en KDevelop, yo tengo KDE 3 y KDE 4 asi que lo necesario para compilar cosas de KDE 4 lo tengo en /opt/kde4/include, /opt/kde4/lib, si lo tienen en otra parte solo hay que cambiarlo en &#8220;Opciones del subproyecto&#8221;, en las pestañas &#8220;Cabeceras&#8221; y &#8220;Bibliotecas&#8221;.</p>
<p>Para compilarlo en Windows solo hay cambiar el archivo /src/src.pro, antes de pasarlo a Windows hay que cambiarle el fin de linea para que podamos editarlo bien en Windows, digamos en KWrite en el menú Herramientas -&gt; Fin de línea -&gt; Windows/DOS y lo guardamos, ya con eso lo podemos editar sin problema en Windows, ahora le quitamos lo siguiente a /src/src.pro:</p>
<p>INCLUDEPATH += /opt/kde4/include/KDE \<br />
/usr/lib/qt4/include \<br />
/usr/lib/qt4/include/QtGui \<br />
/usr/lib/qt4/include/QtCore \<br />
/usr/lib/qt4/include/Qt \<br />
/usr/lib/qt4/mkspecs/linux-g++ \<br />
/opt/kde4/include/</p>
<p>LIBS += -L/opt/kde4/lib/kde4 \<br />
-L/usr/lib/qt4/lib \<br />
-L/opt/kde4/lib \<br />
-lkutils \<br />
-lkio \<br />
-lkfile \<br />
-lkdecore \<br />
-lkdeui</p>
<p>Eso que le quitamos son las cabeceras y bibliotecas que se necesitan para compilar lo de KDE 4, si no se lo quitamos no compilará en Windows, eso es lo único que tenemos que cambiar así que no es la gran cosa.</p>
<p>La aplicación se mira asi:</p>
<p><a href="http://desarrollolibre.files.wordpress.com/2008/07/dialogos_lin_win2.png"><img class="aligncenter size-medium wp-image-44" src="http://desarrollolibre.files.wordpress.com/2008/07/dialogos_lin_win2.png?w=300&#038;h=225" alt="" width="300" height="225" /></a></p>
<p>Una aplicación multiplataforma que se integra al escritorio según el sistema operativo, aquí lo único que le faltaría al preprocesador de C++ es verificar si esta disponible las librerías de KDE 4, si no lo estuviera que usara los diálogos de Qt.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/desarrollolibre.wordpress.com/38/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/desarrollolibre.wordpress.com/38/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/desarrollolibre.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/desarrollolibre.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/desarrollolibre.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/desarrollolibre.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/desarrollolibre.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/desarrollolibre.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/desarrollolibre.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/desarrollolibre.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/desarrollolibre.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/desarrollolibre.wordpress.com/38/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=desarrollolibre.wordpress.com&blog=3566520&post=38&subd=desarrollolibre&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://desarrollolibre.wordpress.com/2008/07/03/aplicaciones-qt4-multiplataforma-que-se-integran-al-escritorio-kdewindows/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2e7bae8cbb6ceeef751cf23fac85b698?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">chepetux</media:title>
		</media:content>

		<media:content url="http://desarrollolibre.files.wordpress.com/2008/07/dialogo_win_qt4.png?w=299" medium="image" />

		<media:content url="http://desarrollolibre.files.wordpress.com/2008/07/dialogos_win_nonativo.png?w=300" medium="image" />

		<media:content url="http://desarrollolibre.files.wordpress.com/2008/07/dialogo_linux_qt4.png?w=300" medium="image" />

		<media:content url="http://desarrollolibre.files.wordpress.com/2008/07/dialogo_lin_kde.png?w=300" medium="image" />

		<media:content url="http://desarrollolibre.files.wordpress.com/2008/07/dialogos_lin_win2.png?w=300" medium="image" />
	</item>
		<item>
		<title>Bandeja del sistema con Qt4</title>
		<link>http://desarrollolibre.wordpress.com/2008/06/26/bandeja-de-sistema-con-qt4/</link>
		<comments>http://desarrollolibre.wordpress.com/2008/06/26/bandeja-de-sistema-con-qt4/#comments</comments>
		<pubDate>Thu, 26 Jun 2008 03:28:33 +0000</pubDate>
		<dc:creator>chepetux</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[QT4]]></category>

		<guid isPermaLink="false">http://desarrollolibre.wordpress.com/?p=26</guid>
		<description><![CDATA[La bandeja del sistema es útil para tener una aplicación ejecutándose en segundo plano por así decirlo, es útil para una aplicación que se encarga de verificar nuestro correo electrónico, se queda minimizado en la bandeja del sistema y cuando recibimos un correo nos notificará de este correo, como por ejemplo KMail, o también muy [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=desarrollolibre.wordpress.com&blog=3566520&post=26&subd=desarrollolibre&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:left;">La bandeja del sistema es útil para tener una aplicación ejecutándose en segundo plano por así decirlo, es útil para una aplicación que se encarga de verificar nuestro correo electrónico, se queda minimizado en la bandeja del sistema y cuando recibimos un correo nos notificará de este correo, como por ejemplo KMail, o también muy útil para aplicaciones que no queremos que nos estén estorbando en la barra de tareas, como por ejemplo Amarok.</p>
<p style="text-align:left;">Esta aplicación que se desarrollo utilizando Qt4 puede compilarse para GNU/Linux como para Windows y el resultado es este:</p>
<p style="text-align:center;"><a href="http://desarrollolibre.files.wordpress.com/2008/06/systemtray.png"><img class="size-medium wp-image-27 aligncenter" src="http://desarrollolibre.files.wordpress.com/2008/06/systemtray.png?w=118&#038;h=300" alt="" width="118" height="300" /></a></p>
<h2>Código principal</h2>
<p><span style="color:#c0c0c0;">#include &lt;QSystemTrayIcon&gt;</span></p>
<p><span style="color:#c0c0c0;">.</span></p>
<p><span style="color:#c0c0c0;">QSystemTrayIcon *systemtray;</span></p>
<p><span style="color:#c0c0c0;">.</span></p>
<p>Aquí construimos nuestro nuevo objeto, el primer parámetro es el icono que queremos ponerle, si estamos en Linux lo recomendable es uno de 22&#215;22, si es para Windows el de 16&#215;16. el preprocesador de C++ nos puede servir para identificar si se esta compilando para Linux o para Windows, en el código completo que se entrega se puede ver eso, en este caso es para Linux. El segundo parámentro es el &#8220;widget papa&#8221; asi como le llamo yo.</p>
<p style="text-align:left;"><span style="color:#c0c0c0;">QSystemTrayIcon *systemtraysystemtray = new QSystemTrayIcon(QPixmap(QDir::toNativeSeparators(QApplication::applicationDirPath()+&#8221;/emacs.png&#8221; )), this);</span></p>
<p style="text-align:left;">Aquí creamos una nueva acción, esta acción la utilizaremos para incluirla en el menú, este menú es el que sale cuando hacemos click derecho en el icono. El primer parámetro es el icono que queremos ponerle, el segundo el texto que se va a mostrar y el tercero el &#8220;widget papa&#8221;.</p>
<p style="text-align:left;"><span style="color:#c0c0c0;">newAct = new QAction(QIcon(QDir::toNativeSeparators(QApplication::applicationDirPath()+&#8221;/filenew.png&#8221;)), tr(&#8220;Mostrar texto&#8221;), this);</span></p>
<p style="text-align:left;">Para establecer el ayuda rapidita que se muestra al poner el puntero del ratón encima del icono lo hacemos asi:</p>
<p style="text-align:left;"><span style="color:#c0c0c0;">systemtray-&gt;setToolTip ( &#8220;tooltip del icono&#8221; );</span></p>
<p style="text-align:left;">Para crear el menú y asignarle la acción recién creada lo hacemos así:</p>
<p style="text-align:left;"><span style="color:#c0c0c0;">QMenu *sysmenu; = new QMenu(this);<br />
sysmenu-&gt;addAction(newAct);</span></p>
<p style="text-align:left;">y por último agregamos el menú a nuestro icono y lo mostramos</p>
<p style="text-align:left;"><span style="color:#c0c0c0;">systemtray-&gt;setContextMenu(sysmenu);<br />
systemtray-&gt;show();</span></p>
<p style="text-align:left;"><a href="http://desarrollolibre.files.wordpress.com/2008/06/systemtray2.png"><img class="aligncenter size-medium wp-image-28" src="http://desarrollolibre.files.wordpress.com/2008/06/systemtray2.png?w=115&#038;h=300" alt="" width="115" height="300" /></a></p>
<p style="text-align:left;">Se puede hacer que despliegue mensajes, podemos controlar si se hace click en ese globo de mensajes, se puede controlar cuando se hace click izquierdo, derecho, central y doble click, solamente es de ver la documentación de Qt4, en este caso se pueden descargar <a title="proyecto ejemplo" href="http://www.box.net/shared/x07gc06zow">qt4_systemtray.tar.gz</a> como ejemplo para que puedan trastearlo, trasteando código se aprende mas rápido.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/desarrollolibre.wordpress.com/26/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/desarrollolibre.wordpress.com/26/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/desarrollolibre.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/desarrollolibre.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/desarrollolibre.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/desarrollolibre.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/desarrollolibre.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/desarrollolibre.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/desarrollolibre.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/desarrollolibre.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/desarrollolibre.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/desarrollolibre.wordpress.com/26/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=desarrollolibre.wordpress.com&blog=3566520&post=26&subd=desarrollolibre&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://desarrollolibre.wordpress.com/2008/06/26/bandeja-de-sistema-con-qt4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2e7bae8cbb6ceeef751cf23fac85b698?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">chepetux</media:title>
		</media:content>

		<media:content url="http://desarrollolibre.files.wordpress.com/2008/06/systemtray.png?w=118" medium="image" />

		<media:content url="http://desarrollolibre.files.wordpress.com/2008/06/systemtray2.png?w=115" medium="image" />
	</item>
		<item>
		<title>QT4 y SQLite</title>
		<link>http://desarrollolibre.wordpress.com/2008/06/10/qt4-y-sqlite/</link>
		<comments>http://desarrollolibre.wordpress.com/2008/06/10/qt4-y-sqlite/#comments</comments>
		<pubDate>Tue, 10 Jun 2008 06:06:42 +0000</pubDate>
		<dc:creator>dhabyx</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[QT4]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQLite]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://desarrollolibre.wordpress.com/?p=21</guid>
		<description><![CDATA[SQLite es una pequeña librería multiplataforma escrita en C que contiene un sistema gestor de bases de datos. SQLite no trabaja como las usuales Bases de Datos, con infraestructura cliente/servidor, en cambio SQLite se integra directamente en la aplicación utilizando un archivo para guardar la información.
SQLite puede utilizarse para guardar datos que no requieran gran [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=desarrollolibre.wordpress.com&blog=3566520&post=21&subd=desarrollolibre&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>SQLite es una pequeña librería multiplataforma escrita en C que contiene un sistema gestor de bases de datos. SQLite no trabaja como las usuales Bases de Datos, con infraestructura cliente/servidor, en cambio SQLite se integra directamente en la aplicación utilizando un archivo para guardar la información.</p>
<p>SQLite puede utilizarse para guardar datos que no requieran gran cantidad de datos como configuraciones, logs, historiales, etc. Actualmente SQLite 3 soporta hasta 2 Terabytes, pero hay que tener en cuenta que SQLite consume al rededor de 256 bytes de memoria por cada 1 <a title="MebiByte" href="http://es.wikipedia.org/wiki/Mebibyte" target="_blank">MiB</a> de la base de datos.</p>
<p>Qt4 provee integración directa con SQLite, la conexión es bastante sencilla, tanto que es difícil encontrar información sobre el tema <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<h3>Activando SQLite</h3>
<p>Lo primero es crear un proyecto de QT4 ya sea usando KDevelop, QDevelop o generándolo uno mismo.</p>
<p>Dentro de KDevelop tenemos que ir a Opciones del Sub Proyecto -&gt; Configuración</p>
<p><a href="http://desarrollolibre.files.wordpress.com/2008/06/qtslqite.jpg"><img class="aligncenter size-medium wp-image-22" src="http://desarrollolibre.files.wordpress.com/2008/06/qtslqite.jpg?w=300&#038;h=213" alt="QT4 y SQLite" width="300" height="213" /></a></p>
<p>En QDevelop debemos ir al menú Proyecto -&gt; propiedades del proyecto y buscar la opción Bibliotecas Qt</p>
<p><a href="http://desarrollolibre.files.wordpress.com/2008/06/qtslqite1.jpg"><img class="aligncenter size-medium wp-image-23" src="http://desarrollolibre.files.wordpress.com/2008/06/qtslqite1.jpg?w=300&#038;h=235" alt="QDevelop y SQLite" width="300" height="235" /></a></p>
<p>En ambos debemos seleccionar las librerías SQL.</p>
<p>Si es un proyecto echo sin una <a title="Ambiente Integrado de Desarrollo" href="http://es.wikipedia.org/wiki/Ambiente_integrado_de_desarrollo" target="_blank">IDE</a> se puede añadir al archivo .pro la variable</p>
<p>QT += sql</p>
<h3>Conexión a SQLite</h3>
<p>La conexión es de las mas sencillas, no se colocara host ni contraseña, solamente el nombre del archivo que se utilizará para guardar los datos:</p>
<p style="text-indent:0;padding-left:30px;margin:0;"><!--StartFragment-->#include &lt;QSqlDatabase&gt;<!--EndFragment--></p>
<p style="text-indent:0;padding-left:30px;margin:0;">&#8230;</p>
<p style="text-indent:0;padding-left:30px;margin:0;">QSqlDatabase baseDatos = QSqlDatabase::addDatabase(&#8220;QSQLITE&#8221;);</p>
<p style="text-indent:0;padding-left:30px;margin:0;">baseDatos.setDatabaseName(&#8220;bd.db&#8221;);</p>
<p style="text-indent:0;padding-left:30px;margin:0;">
<p style="text-indent:0;margin:0;">Si Qt no encuentra el archivo creará uno.</p>
<p style="text-indent:0;margin:0;">
<p style="text-indent:0;margin:0;">De ahora en adelanta ya podemos utilizar SQLite como si fuese cualquier base de datos, teniendo en cuenta las sentencias que soporta.</p>
<h3>Creando la estructura de la Base de Datos</h3>
<p>Para crear la estructura de la Base de Datos podemos utilizar una interface como SQLite Data Base Browser o phSQliteAdmin, o bien hacerlo mediante su interfáz de consola:</p>
<p>Creamos una tabla dentro de la base de datos con sus respectivos campos</p>
<p style="padding-left:30px;">$ sqlite3 bd.db<br />
SQLite version 3.5.6<br />
Enter &#8220;.help&#8221; for instructions<br />
sqlite&gt; CREATE TABLE usuarios (<br />
&#8230;&gt; id INTEGER PRIMARY KEY,<br />
&#8230;&gt; usuario TEXT,<br />
&#8230;&gt; clave TEXT);</p>
<p>Podemos verificar lo creado con la instrucción .schema</p>
<p style="padding-left:30px;">sqlite&gt; .schema usuarios<br />
CREATE TABLE usuarios (<br />
id INTEGER PRIMARY KEY,<br />
usuario TEXT,<br />
clave TEXT);</p>
<p>También podemos ingresar un dato de prueba para nuestro programa y verificar que se ha insertado correctamente.</p>
<p style="padding-left:30px;">sqlite&gt; INSERT INTO usuarios (usuario, clave) VALUES (&#8216;administrador&#8217;, &#8216;administrador&#8217;);<br />
sqlite&gt; SELECT * FROM usuarios;<br />
1|administrador|administrador</p>
<p>Para salir utilizamos la instrucción .exit</p>
<p style="padding-left:30px;">sqlite&gt; .exit</p>
<p>Ejemplo de utilizacion</p>
<p>Para ejemplo pueden descargar el archivo <a href="http://www.box.net/shared/vty0lqt4wo" target="_blank">ejemplo.tar.gz</a> el cual trae un ejemplo minimo de como acceder y leer los datos de una base de datos SQLite con QT4 configurado tanto para compilarse en Linux como en Windows</p>
<p><strong>Enlaces:</strong><br />
SQLite -&gt; <a title="SQLite Home Page" href="http://www.sqlite.org/" target="_blank">SQLite Home Page<br />
</a>Documentacion de SQLite -&gt; <a href="http://trolltech.com/products/qt/" target="_blank">http://www.sqlite.org/docs.html</a><br />
QT4 -&gt; <a title="SQLite Home Page" href="http://www.sqlite.org/" target="_blank"></a><a href="http://trolltech.com/products/qt/" target="_blank">http://trolltech.com/products/qt/</a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/desarrollolibre.wordpress.com/21/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/desarrollolibre.wordpress.com/21/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/desarrollolibre.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/desarrollolibre.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/desarrollolibre.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/desarrollolibre.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/desarrollolibre.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/desarrollolibre.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/desarrollolibre.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/desarrollolibre.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/desarrollolibre.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/desarrollolibre.wordpress.com/21/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=desarrollolibre.wordpress.com&blog=3566520&post=21&subd=desarrollolibre&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://desarrollolibre.wordpress.com/2008/06/10/qt4-y-sqlite/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fa048ec1bbf25e1e386a97c09118894e?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">dhabyx</media:title>
		</media:content>

		<media:content url="http://desarrollolibre.files.wordpress.com/2008/06/qtslqite.jpg?w=300" medium="image">
			<media:title type="html">QT4 y SQLite</media:title>
		</media:content>

		<media:content url="http://desarrollolibre.files.wordpress.com/2008/06/qtslqite1.jpg?w=300" medium="image">
			<media:title type="html">QDevelop y SQLite</media:title>
		</media:content>
	</item>
		<item>
		<title>¡Hola Mundo!</title>
		<link>http://desarrollolibre.wordpress.com/2008/04/24/hello-world/</link>
		<comments>http://desarrollolibre.wordpress.com/2008/04/24/hello-world/#comments</comments>
		<pubDate>Thu, 24 Apr 2008 05:34:15 +0000</pubDate>
		<dc:creator>dhabyx</dc:creator>
				<category><![CDATA[Información]]></category>
		<category><![CDATA[presentación]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Así se inicia el primer post de este blog, con el tradicional Hola Mundo.
Por estos lados me conocerán con el nick de dhabyx, en este espacio me dedicaré a compartir los conocimientos de desarrollo de software utilizando herramientas libres que utilizamos el grupo de amigos que conformamos este blog.
Mas adelante cada miembro de este lugar [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=desarrollolibre.wordpress.com&blog=3566520&post=1&subd=desarrollolibre&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Así se inicia el primer post de este blog, con el tradicional Hola Mundo.</p>
<p>Por estos lados me conocerán con el nick de <a href="http://slackdhabyx.wordpress.com">dhabyx</a>, en este espacio me dedicaré a compartir los conocimientos de desarrollo de software utilizando herramientas libres que utilizamos el grupo de amigos que conformamos este blog.</p>
<p>Mas adelante cada miembro de este lugar se presentará, a su debido tiempo <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>En lo personal me enfocaré mas a el mundo de PHP, y a otras cosillas de interés.</p>
<p>Saludos y Bienvenidos!!</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/desarrollolibre.wordpress.com/1/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/desarrollolibre.wordpress.com/1/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/desarrollolibre.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/desarrollolibre.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/desarrollolibre.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/desarrollolibre.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/desarrollolibre.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/desarrollolibre.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/desarrollolibre.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/desarrollolibre.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/desarrollolibre.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/desarrollolibre.wordpress.com/1/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=desarrollolibre.wordpress.com&blog=3566520&post=1&subd=desarrollolibre&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://desarrollolibre.wordpress.com/2008/04/24/hello-world/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fa048ec1bbf25e1e386a97c09118894e?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">dhabyx</media:title>
		</media:content>
	</item>
		<item>
		<title>Generando un archivo XML</title>
		<link>http://desarrollolibre.wordpress.com/2007/07/12/generando-un-archivo-xml/</link>
		<comments>http://desarrollolibre.wordpress.com/2007/07/12/generando-un-archivo-xml/#comments</comments>
		<pubDate>Thu, 12 Jul 2007 04:29:56 +0000</pubDate>
		<dc:creator>dhabyx</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Lazarus]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://develazarus.wordpress.com/2007/07/12/generando-un-archivo-xml/</guid>
		<description><![CDATA[Ahora toca el turno de generar el archivo XML, anteriormente habíamos visto como leer un archivo en formato XML, en el cual habíamos utilizado las librerías proporcionadas por Free Pascal, ahora usaremos otras que son nativas para Lazarus, y aprenderemos como añadir paquetes  
Primero creemos la Interfaz, colocando los siguientes componentes:



Componente
Nombre(Name)
Caption


TForm
Form1
Creando XML



TButton
BtnCrear
&#38;Crear


TEdit
EdComentario





Ahora necesitamos ingresar [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=desarrollolibre.wordpress.com&blog=3566520&post=10&subd=desarrollolibre&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Ahora toca el turno de generar el archivo XML, anteriormente habíamos visto <a title="Leer archivos XML en Lazarus" href="http://develazarus.wordpress.com/2007/07/02/leer-archivos-xml-con-lazarus-i/">como leer un archivo en formato XML</a>, en el cual habíamos utilizado las librerías proporcionadas por Free Pascal, ahora usaremos otras que son nativas para Lazarus, y aprenderemos como añadir paquetes <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Primero creemos la Interfaz, colocando los siguientes componentes:<span id="more-10"></span></p>
<table border="1" cellspacing="0" cellpadding="5" width="378" bgcolor="#f6f9df">
<tbody>
<tr>
<td style="margin-left:5px;margin-right:5px;"><strong>Componente</strong></td>
<td style="margin-left:5px;margin-right:5px;"><strong>Nombre(Name)</strong></td>
<td style="margin-left:5px;margin-right:5px;"><strong>Caption</strong></td>
</tr>
<tr>
<td><strong><span style="color:#800000;">TForm</span></strong></td>
<td><span style="color:#008000;"><strong>Form1</strong></span></td>
<td><span style="color:#800000;"><strong>Creando XML<br />
</strong></span></td>
</tr>
<tr>
<td><strong><span style="color:#800000;">TButton</span></strong></td>
<td><span style="color:#008000;"><strong>BtnCrear</strong></span></td>
<td><span style="color:#800000;"><strong>&amp;Crear</strong></span></td>
</tr>
<tr>
<td><strong><span style="color:#800000;">TEdit</span></strong></td>
<td><span style="color:#008000;"><strong>EdComentario</strong></span></td>
<td></td>
</tr>
</tbody>
</table>
<p><a title="Creador de XML" href="http://desarrollolibre.files.wordpress.com/2008/06/lazarus6.jpg"><img src="http://desarrollolibre.files.wordpress.com/2008/06/lazarus6.jpg" alt="Creador de XML" /></a></p>
<p>Ahora necesitamos ingresar el código, pero antes llamamos a las librerías que necesitamos para que podamos escribir en XML, que en este caso serán las librerías para lazarus: <strong>Laz_DOM</strong> y  <strong>Laz_XMLWrite</strong>, para ello debemos añadir un paquete a los requeridos del proyecto, esto lo logramos pulsando el menú <strong>Proyecto -&gt; Inspector de Proyecto</strong>, con esto nos mostrará una ventana con todos los archivos y paquetes con que se compila nuestra aplicación, pulsamos sobre el botón añadir y luego a la pestaña Nuevo Requerimiento:</p>
<p><a title="Requerimientos" href="http://desarrollolibre.files.wordpress.com/2008/06/lazarus5.jpg"><img src="http://desarrollolibre.files.wordpress.com/2008/06/lazarus5.jpg" alt="Requerimientos" /></a></p>
<p>Y seleccionamos CodeTools, que es el paquete que contiene las cabeceras que necesitamos (<em>laz_dom.pas</em> y <em>laz_xmlwrite.pas</em>), esto lo pueden verificar si van a la carpeta <strong><em>components/codetools</em></strong> en donde este instalado lazarus.</p>
<p>Luego de esto, debemos verificar que en la ventana del inspector del proyecto aparezca CodeTools, en la lista de <em>paquetes requeridos:</em></p>
<p><a title="Ventana del inspector de proyecto" href="http://desarrollolibre.files.wordpress.com/2008/06/lazarus3.jpg"><img src="http://desarrollolibre.files.wordpress.com/2008/06/lazarus3.jpg" alt="Ventana del inspector de proyecto" /></a></p>
<p>Ahora debemos agregar <strong>Laz_DOM</strong> y  <strong>Laz_XMLWrite </strong>a la clausula<strong> Uses </strong>e ingresamos el código para el evento OnClick del BtnCrear:</p>
<blockquote>
<pre><span style="font-size:12px;line-height:11px;"><span style="font-weight:bold;color:#000000;">procedure</span><span style="color:#000000;"> TForm1.BtnCrearClick(Sender: TObject);</span>
<span style="font-weight:bold;color:#000000;">var</span>
<span style="color:#000000;">  Doc : TXMLDocument;</span>
<span style="color:#000000;">  DomNodo, DomRaiz, DomDato : TDOMNode;</span>
<span style="font-weight:bold;color:#000000;">begin</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//Creamos un documento</span>
<span style="color:#000000;">  Doc:=TXMLDocument.Create;</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//Creamos la raiz del documento</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//nombrandolo "ejemplo"</span>
<span style="color:#000000;">  DomRaiz:=Doc.CreateElement(</span><span style="color:#dd0000;">'ejemplo'</span><span style="color:#000000;">);</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//despues de aÃ±adir un nodo al documento este es vaciado</span>
<span style="color:#000000;">  Doc.AppendChild(DomRaiz);</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//por lo tanto recuperamos el puntero</span>
<span style="color:#000000;">  DomRaiz:=Doc.DocumentElement;</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//Creamos el primer Nodo del documento</span>
<span style="color:#000000;">  DomNodo:=Doc.CreateElement(</span><span style="color:#dd0000;">'PrimerDato'</span><span style="color:#000000;">);</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//Hacemos un casting a la variable DomNodo</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//de tipo TDOMElement para poder</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//colocarle atributos.</span>
<span style="color:#000000;">  TDOMElement(DomNodo)[</span><span style="color:#dd0000;">'atributo'</span><span style="color:#000000;">]:=</span><span style="color:#dd0000;">'algunvalor'</span><span style="color:#000000;">;</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//agregamos el nodo al nodo raiz</span>
<span style="color:#000000;">  DomRaiz.AppendChild(DomNodo);</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//Como la variable DomNodo ha sido vaciada</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//podemos crear otro nodo con la misma</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//variable</span>
<span style="color:#000000;">  DomNodo:=Doc.CreateElement(</span><span style="color:#dd0000;">'segundoDato'</span><span style="color:#000000;">);</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//creamos tambien un nodo de texto</span>
<span style="color:#000000;">  DomDato:=Doc.CreateTextNode(</span><span style="color:#dd0000;">'contenido'</span><span style="color:#000000;">);</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//asignacion de parametro al nodo</span>
<span style="color:#000000;">  TDOMElement(DomNodo)[</span><span style="color:#dd0000;">'tipo'</span><span style="color:#000000;">]:=</span><span style="color:#dd0000;">'cadena'</span><span style="color:#000000;">;</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//AÃ±adimos el nodo de texto al nodo DOMNodo</span>
<span style="color:#000000;">  DomNodo.AppendChild(DomDato);</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//Al primer nodo hijo (PrimerDato) de la raiz</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//le aÃ±adimos el nodo contenido en DomNodo</span>
<span style="color:#000000;">  DomRaiz.ChildNodes.Item[</span><span style="color:#0000ff;">0</span><span style="color:#000000;">].AppendChild(DomNodo);</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//creamos otro nodo pero de comentario</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//con el texto del TEdit</span>
<span style="color:#000000;">  DomDato:=Doc.CreateComment(EdComentario.</span><span style="color:#800000;">Text</span><span style="color:#000000;">);</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//aÃ±adimos directamente el nodo de comentario</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//al mismo nivel que "PrimerDato"</span>
<span style="color:#000000;">  DomRaiz.AppendChild(DomDato);</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//Escribimos el archivo</span>
<span style="color:#000000;">  WriteXMLFile(Doc,</span><span style="color:#dd0000;">'prueba.xml'</span><span style="color:#000000;">);</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//Liberamos Memoria.</span>
<span style="color:#000000;">  Doc.Free;</span>
<span style="font-weight:bold;color:#000000;">end</span><span style="color:#000000;">;</span></span></pre>
</blockquote>
<p>Compilamos, y estamos listos.</p>
<p>Esto nos creará un  archivo <strong>prueba.xml</strong> como este:</p>
<blockquote>
<pre><span style="font-size:12px;line-height:11px;"><span style="font-weight:bold;color:#000000;">&lt;?xml</span><span style="color:#000000;"> version="1.0"</span><span style="font-weight:bold;color:#000000;">?&gt;</span>
<span style="font-weight:bold;color:#000000;">&lt;ejemplo&gt;</span>
<span style="color:#000000;">  </span><span style="font-weight:bold;color:#000000;">&lt;PrimerDato</span><span style="color:#008000;"> atributo=</span><span style="color:#aa0000;">"algunvalor"</span><span style="font-weight:bold;color:#000000;">&gt;</span>
<span style="color:#000000;">    </span><span style="font-weight:bold;color:#000000;">&lt;segundoDato</span><span style="color:#008000;"> tipo=</span><span style="color:#aa0000;">"cadena"</span><span style="font-weight:bold;color:#000000;">&gt;</span><span style="color:#000000;">contenido</span><span style="font-weight:bold;color:#000000;">&lt;/segundoDato&gt;</span>
<span style="color:#000000;">  </span><span style="font-weight:bold;color:#000000;">&lt;/PrimerDato&gt;</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">&lt;!--Escriba su comentario--&gt;</span>
<span style="font-weight:bold;color:#000000;">&lt;/ejemplo&gt;</span></span></pre>
</blockquote>
<p>Ahora puede probar abrirlo con el proyecto que hicimos anteriormente <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/desarrollolibre.wordpress.com/10/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/desarrollolibre.wordpress.com/10/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/desarrollolibre.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/desarrollolibre.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/desarrollolibre.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/desarrollolibre.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/desarrollolibre.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/desarrollolibre.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/desarrollolibre.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/desarrollolibre.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/desarrollolibre.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/desarrollolibre.wordpress.com/10/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=desarrollolibre.wordpress.com&blog=3566520&post=10&subd=desarrollolibre&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://desarrollolibre.wordpress.com/2007/07/12/generando-un-archivo-xml/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fa048ec1bbf25e1e386a97c09118894e?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">dhabyx</media:title>
		</media:content>

		<media:content url="http://desarrollolibre.files.wordpress.com/2008/06/lazarus6.jpg" medium="image">
			<media:title type="html">Creador de XML</media:title>
		</media:content>

		<media:content url="http://desarrollolibre.files.wordpress.com/2008/06/lazarus5.jpg" medium="image">
			<media:title type="html">Requerimientos</media:title>
		</media:content>

		<media:content url="http://desarrollolibre.files.wordpress.com/2008/06/lazarus3.jpg" medium="image">
			<media:title type="html">Ventana del inspector de proyecto</media:title>
		</media:content>
	</item>
		<item>
		<title>Solución de problemas con lecturas de XML</title>
		<link>http://desarrollolibre.wordpress.com/2007/07/09/solucion-de-problemas-con-lecturas-de-xml/</link>
		<comments>http://desarrollolibre.wordpress.com/2007/07/09/solucion-de-problemas-con-lecturas-de-xml/#comments</comments>
		<pubDate>Mon, 09 Jul 2007 05:57:42 +0000</pubDate>
		<dc:creator>dhabyx</dc:creator>
				<category><![CDATA[Lazarus]]></category>

		<guid isPermaLink="false">http://develazarus.wordpress.com/2007/07/09/solucion-de-problemas-con-lecturas-de-xml/</guid>
		<description><![CDATA[Después de hacer una búsqueda intensiva, he encontrado algunos fallos con lecturas de archivos xml, especialmente cuando contienen caracteres como &#8220;ñ&#8221; o vocales tildadas.
Simplemente es cuestión de crear un archivo que le indique a las librerías gtk en que codificación deben leer los archivos.
Deben crear o modificar un archivo en su home, llamado  .gtkrc.mine [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=desarrollolibre.wordpress.com&blog=3566520&post=9&subd=desarrollolibre&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Después de hacer una búsqueda intensiva, he encontrado algunos fallos con lecturas de archivos xml, especialmente cuando contienen caracteres como &#8220;ñ&#8221; o vocales tildadas.</p>
<p>Simplemente es cuestión de crear un archivo que le indique a las librerías gtk en que codificación deben leer los archivos.</p>
<p>Deben crear o modificar un archivo en su home, llamado  <strong>.gtkrc.mine</strong> si usan gtk y <strong>.gtkrc-2.0</strong> si usan gtk2 para Lazarus.</p>
<blockquote><p> style &#8220;default-text&#8221; {<br />
fontset = &#8220;-*-arial-medium-r-normal&#8211;*-100-*-*-*-*-iso8859-1,\<br />
-*-helvetica-medium-r-normal&#8211;*-100-*-*-*-*-*-*&#8221;<br />
}</p>
<p>class &#8220;GtkWidget&#8221; style &#8220;default-text&#8221;</p></blockquote>
<p>Luego puede compilar de nuevo su código y verán los resultados.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/desarrollolibre.wordpress.com/9/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/desarrollolibre.wordpress.com/9/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/desarrollolibre.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/desarrollolibre.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/desarrollolibre.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/desarrollolibre.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/desarrollolibre.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/desarrollolibre.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/desarrollolibre.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/desarrollolibre.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/desarrollolibre.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/desarrollolibre.wordpress.com/9/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=desarrollolibre.wordpress.com&blog=3566520&post=9&subd=desarrollolibre&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://desarrollolibre.wordpress.com/2007/07/09/solucion-de-problemas-con-lecturas-de-xml/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fa048ec1bbf25e1e386a97c09118894e?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">dhabyx</media:title>
		</media:content>
	</item>
		<item>
		<title>Leer Archivos XML con Lazarus I</title>
		<link>http://desarrollolibre.wordpress.com/2007/07/02/leer-archivos-xml-con-lazarus-i/</link>
		<comments>http://desarrollolibre.wordpress.com/2007/07/02/leer-archivos-xml-con-lazarus-i/#comments</comments>
		<pubDate>Mon, 02 Jul 2007 04:41:50 +0000</pubDate>
		<dc:creator>dhabyx</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Lazarus]]></category>

		<guid isPermaLink="false">http://develazarus.wordpress.com/2007/07/02/leer-archivos-xml-con-lazarus-i/</guid>
		<description><![CDATA[XML es un formato de archivo bastante entendible para guardar documentos estructurados o pasar información de programa a programa, por lo que se hace necesario conocerlo, Free Pascal tiene librerías necesarias para poder leer y escribir en este formato, fáciles de aprender e igualmente de aplicar, en este primer post solo veremos como acceder y [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=desarrollolibre.wordpress.com&blog=3566520&post=8&subd=desarrollolibre&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a title="XML en wikipedia" href="http://es.wikipedia.org/wiki/XML">XML</a> es un formato de archivo bastante entendible para guardar documentos estructurados o pasar información de programa a programa, por lo que se hace necesario conocerlo, Free Pascal tiene librerías necesarias para poder leer y escribir en este formato, fáciles de aprender e igualmente de aplicar, en este primer post solo veremos como acceder y leer los archivos XML obteniendo los datos fácilmente.</p>
<p>Abrimos Lazarus y creamos un nuevo proyecto.  Luego en el formulario <span id="more-8"></span>colocamos estos componentes y les colocamos las propiedades siguientes:</p>
<blockquote>
<table border="1" cellspacing="0" cellpadding="5" width="378" bgcolor="#f6f9df">
<tbody>
<tr>
<td style="margin-left:5px;margin-right:5px;"><strong>Componente</strong></td>
<td style="margin-left:5px;margin-right:5px;"><strong>Nombre(Name)</strong></td>
<td style="margin-left:5px;margin-right:5px;"><strong>Caption</strong></td>
</tr>
<tr>
<td><strong><span style="color:#800000;">TForm</span></strong></td>
<td><span style="color:#008000;"><strong>FLMXL</strong></span></td>
<td><span style="color:#800000;"><strong>Lector XML</strong></span></td>
</tr>
<tr>
<td><strong><span style="color:#800000;">TButton</span></strong></td>
<td><span style="color:#008000;"><strong>BtnLeer</strong></span></td>
<td><span style="color:#800000;"><strong>&amp;Leer XML</strong></span></td>
</tr>
<tr>
<td><strong><span style="color:#800000;">TButton</span></strong></td>
<td><span style="color:#008000;"><strong>BtnCerrar</strong></span></td>
<td><span style="color:#800000;"><strong>&amp;Cerrar</strong></span></td>
</tr>
<tr>
<td><strong><span style="color:#800000;">TMemo</span></strong></td>
<td><span style="color:#008000;"><strong>Memo</strong></span></td>
<td><strong><span style="color:#800000;"> </span></strong></td>
</tr>
</tbody>
</table>
</blockquote>
<p>Colocando los componetes tomando como ejemplo la siguiente imágen:</p>
<p><a title="FormularioXML" href="http://desarrollolibre.files.wordpress.com/2008/06/lecxml1.jpg"><img src="http://desarrollolibre.files.wordpress.com/2008/06/lecxml1.jpg" alt="FormularioXML" /></a></p>
<p>Y guardamos el proyecto.</p>
<p>Para acceder a las funciones de manejo de XML en Lazarus o Free Pascal solamente debemos llamar a las librerías <strong>DOM</strong> y <strong>XMLRead</strong>, añadiéndolas a la lista de librerías en la clausula <strong>uses</strong>.</p>
<p>Ahora necesitamos un archivo XML para las pruebas, dentro del cual escribiremos lo siguiente:</p>
<blockquote>
<pre><span style="font-size:12px;line-height:11px;"><span style="font-weight:bold;color:#000000;">&lt;?xml</span><span style="color:#000000;"> version="1.0"</span><span style="font-weight:bold;color:#000000;">?&gt;</span>
<span style="font-weight:bold;color:#000000;">&lt;ejemplo&gt;</span>
<span style="color:#000000;">  </span><span style="font-weight:bold;color:#000000;">&lt;ejemploinfo&gt;</span>
<span style="color:#000000;">    </span><span style="font-weight:bold;color:#000000;">&lt;autor&gt;</span><span style="color:#000000;">develazarus</span><span style="font-weight:bold;color:#000000;">&lt;/autor&gt;</span>
<span style="color:#000000;">    </span><span style="font-weight:bold;color:#000000;">&lt;fecha&gt;</span><span style="color:#000000;">1 de Julio de 2007</span><span style="font-weight:bold;color:#000000;">&lt;/fecha&gt;</span>
<span style="color:#000000;">    </span><span style="font-weight:bold;color:#000000;">&lt;dato&gt;</span><span style="color:#000000;">primer dato</span><span style="font-weight:bold;color:#000000;">&lt;/dato&gt;</span>
<span style="color:#000000;">    </span><span style="font-weight:bold;color:#000000;">&lt;dato&gt;</span><span style="color:#000000;">Segundo dato</span><span style="font-weight:bold;color:#000000;">&lt;/dato&gt;</span>
<span style="color:#000000;">    </span><span style="font-weight:bold;color:#000000;">&lt;dato&gt;</span><span style="color:#000000;">Tercer dato</span><span style="font-weight:bold;color:#000000;">&lt;/dato&gt;</span>
<span style="color:#000000;">    </span><span style="font-weight:bold;color:#000000;">&lt;dato&gt;</span><span style="color:#000000;">Cuarto dato</span><span style="font-weight:bold;color:#000000;">&lt;/dato&gt;</span>
<span style="font-weight:bold;color:#000000;">    &lt;val</span><span style="color:#008000;"> tipo=</span><span style="color:#aa0000;">"dato cadena"</span><span style="font-weight:bold;color:#000000;">&gt;</span><span style="color:#000000;">inspeccionando</span><span style="font-weight:bold;color:#000000;">&lt;/val&gt;</span>
<span style="font-weight:bold;color:#000000;">  &lt;/ejemploinfo&gt;</span>
<span style="color:#000000;">  </span><span style="font-weight:bold;color:#000000;">&lt;texto&gt;</span>
<span style="color:#000000;">    </span><span style="font-weight:bold;color:#000000;">&lt;cabecera&gt;</span><span style="color:#000000;">Esto es la cabecera</span><span style="font-weight:bold;color:#000000;">&lt;/cabecera&gt;</span>
<span style="color:#000000;">    </span><span style="font-weight:bold;color:#000000;">&lt;linea&gt;</span><span style="color:#000000;">Esto es una linea de texto.</span><span style="font-weight:bold;color:#000000;">&lt;/linea&gt;</span>
<span style="color:#000000;">  </span><span style="font-weight:bold;color:#000000;">&lt;/texto&gt;</span>
<span style="font-weight:bold;color:#000000;">&lt;/ejemplo&gt;</span>
</span></pre>
</blockquote>
<p>lo guardamos con el nombre &#8220;ejemplo.xml&#8221; dentro de la carpeta donde guardamos el proyecto, para que sea fácilmente accesible desde el código.</p>
<p>El código XML es tratado por las librerías como un conjunto de nodos, por lo que podríamos ejemplificar el archivo anterior de la siguiente manera:</p>
<p><a title="Nodos XML" href="http://desarrollolibre.files.wordpress.com/2008/06/nodos.jpg"><img src="http://desarrollolibre.files.wordpress.com/2008/06/nodos.jpg" alt="Nodos XML" /></a></p>
<p>En XML todo empieza con el nodo raiz, que en el caso de nuestro archivo es &#8220;ejemplo&#8221;, luego estan los nodos hijos de la raiz, que son ejemploinfo y texto, y estos a su vez son nodos padre de cada uno de los nodos que están abajo.</p>
<p>Cada nodo puede tener datos o atributos, los datos o valores de los nodos que vemos en el archivo ejemplo.xml, como por ejemplo el de autor (develazarus), es otro nodo, un nodo hijo del nodo autor, si obtuviésemos el valor del nodo autor no nos devolvería nada. Los datos y atributos de cada nodo son tratados como nodos hijos, esto es algo que hay que tener en cuenta.</p>
<p>Pero empecemos para ver como funciona ya en Lazarus:</p>
<p>En el evento onClick de BtnLeer colocamos:</p>
<blockquote>
<pre><span style="font-size:12px;line-height:11px;"><span style="font-weight:bold;color:#000000;">procedure</span><span style="color:#000000;"> TFLXML.BtnLeerClick(Sender: TObject);</span>
<span style="font-weight:bold;color:#000000;">var</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//variable de tipo TXMLDocument para cargar documentos XML</span>
<span style="color:#000000;">  Doc :  TXMLDocument;</span>
<span style="color:#000000;">  i, j : </span><span style="color:#800000;">integer</span><span style="color:#000000;">;</span>
<span style="font-weight:bold;color:#000000;">begin</span>
<span style="color:#000000;">  Doc := TXMLDocument.Create;</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//cargando el archivo XML</span>
<span style="color:#000000;">  ReadXMLFile(Doc, </span><span style="color:#dd0000;">'ejemplo.xml'</span><span style="color:#000000;">);</span>
<span style="color:#000000;">  Memo.Lines.Clear;</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//obteniendo el nombre del nodo raiz</span>
<span style="color:#000000;">  Memo.Lines.Add(</span><span style="color:#dd0000;">'Archvo tipo : '</span><span style="color:#000000;">+Doc.DocumentElement.NodeName);</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//trabajando con los nodos inferiores a la raiz</span>
<span style="color:#000000;">  </span><span style="font-weight:bold;color:#000000;">with</span><span style="color:#000000;"> Doc.DocumentElement.ChildNodes </span><span style="font-weight:bold;color:#000000;">do</span>
<span style="color:#000000;">  </span><span style="font-weight:bold;color:#000000;">begin</span>
<span style="color:#000000;">    </span><span style="font-style:italic;color:#588de9;">{la variable "Count", propiedad de ChildNodes</span>
<span style="font-style:italic;color:#588de9;">     contiene el numero total de nodos hijos que existen</span>
<span style="font-style:italic;color:#588de9;">     en este caso en el nodo raiz}</span>
<span style="color:#000000;">    </span><span style="font-weight:bold;color:#000000;">for</span><span style="color:#000000;"> i := </span><span style="color:#0000ff;">0</span><span style="color:#000000;"> </span><span style="font-weight:bold;color:#000000;">to</span><span style="color:#000000;"> (Count - </span><span style="color:#0000ff;">1</span><span style="color:#000000;">) </span><span style="font-weight:bold;color:#000000;">do</span>
<span style="color:#000000;">    </span><span style="font-weight:bold;color:#000000;">begin</span>
<span style="color:#000000;">      </span><span style="font-style:italic;color:#588de9;">{Item[i] es el nodo al que vamos a acceder y su propiedad</span>
<span style="font-style:italic;color:#588de9;">       NodeName nos devuelve el nombre del nodo}</span>
<span style="color:#000000;">      Memo.Lines.Add(intToStr(i)+</span><span style="color:#dd0000;">'. '</span><span style="color:#000000;">+Item[i].NodeName);</span>
<span style="color:#000000;">      </span><span style="font-style:italic;color:#588de9;">{ahora usamos la propiedad Count pero ahora de los nodos</span>
<span style="font-style:italic;color:#588de9;">       con los que estamos trabajando}</span>
<span style="color:#000000;">      </span><span style="font-weight:bold;color:#000000;">for</span><span style="color:#000000;"> j := </span><span style="color:#0000ff;">0</span><span style="color:#000000;"> </span><span style="font-weight:bold;color:#000000;">to</span><span style="color:#000000;"> (Item[i].ChildNodes.Count - </span><span style="color:#0000ff;">1</span><span style="color:#000000;">) </span><span style="font-weight:bold;color:#000000;">do</span>
<span style="color:#000000;">      </span><span style="font-weight:bold;color:#000000;">begin</span>
<span style="color:#000000;">        </span><span style="font-style:italic;color:#588de9;">{ahora entraremos a los nodos hijos de los nodos
         anteriores}</span>
<span style="color:#000000;">        </span><span style="font-weight:bold;color:#000000;">with</span><span style="color:#000000;"> Item[i].ChildNodes </span><span style="font-weight:bold;color:#000000;">do</span>
<span style="color:#000000;">        </span><span style="font-weight:bold;color:#000000;">begin</span>
<span style="color:#000000;">          </span><span style="font-style:italic;color:#588de9;">{Item[j].FirstChild nos devuelve el primer nodo hijo y</span>
<span style="font-style:italic;color:#588de9;">           NodeValue es la propiedad que nos devolvera el valor</span>
<span style="font-style:italic;color:#588de9;">           o contenido de ese nodo}</span>
<span style="color:#000000;">          Memo.Lines.Add(IntToStr(i)+</span><span style="color:#dd0000;">'.'</span><span style="color:#000000;">+IntToStr(j)+</span><span style="color:#dd0000;">' '</span>
<span style="color:#000000;">            + Item[j].NodeName + </span><span style="color:#dd0000;">' -&gt; '</span><span style="color:#000000;">
            + Item[j].FirstChild.NodeValue);</span>
<span style="color:#000000;">          </span><span style="font-weight:bold;color:#000000;">if</span><span style="color:#000000;"> Item[j].NodeName = </span><span style="color:#dd0000;">'val'</span><span style="color:#000000;"> </span><span style="font-weight:bold;color:#000000;">then</span>
<span style="color:#000000;">            Memo.Lines.Add(</span><span style="color:#dd0000;">'  Atrbuto "tipo" del nodo val = '</span>
<span style="color:#000000;">            + Item[j].Attributes.GetNamedItem(</span><span style="color:#dd0000;">'tipo'</span><span style="color:#000000;">).NodeValue);</span>
<span style="color:#000000;">              </span><span style="font-style:italic;color:#588de9;">{Para obtener los atributos de un nodo
               utilizamos la</span><span style="font-style:italic;color:#588de9;"> propiedad Attributes}</span>
<span style="color:#000000;">        </span><span style="font-weight:bold;color:#000000;">end</span><span style="color:#000000;">;</span>
<span style="color:#000000;">      </span><span style="font-weight:bold;color:#000000;">end</span><span style="color:#000000;">;</span>
<span style="color:#000000;">    </span><span style="font-weight:bold;color:#000000;">end</span><span style="color:#000000;">;</span>
<span style="color:#000000;">  </span><span style="font-weight:bold;color:#000000;">end</span><span style="color:#000000;">;</span>
<span style="color:#000000;">  Doc.Free;</span>
<span style="color:#000000;">  </span><span style="font-style:italic;color:#588de9;">//es necesario liberar la memoria que ocupo la variable Doc</span>
<span style="font-weight:bold;color:#000000;">end</span><span style="color:#000000;">;</span></span></pre>
</blockquote>
<p>y en evento onClick de BtnCerrar colocamos:</p>
<blockquote>
<pre><span style="font-size:12px;line-height:11px;"><span style="font-weight:bold;color:#000000;">procedure</span><span style="color:#000000;"> TFLXML.BtnCerrarClick(Sender: TObject);</span>
<span style="font-weight:bold;color:#000000;">begin</span>
<span style="color:#000000;">  Close;</span>
<span style="font-weight:bold;color:#000000;">end</span><span style="color:#000000;">;</span></span></pre>
</blockquote>
<p>Solo nos resta compilar y ejecutar la aplicación, esto lo podemos hacer fácilmente con la tecla F9 <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Luego de esto ya tendremos nuestra aplicación leyendo los datos del archivo XML.</p>
<p><a title="Lector de XML Funcionando" href="http://desarrollolibre.files.wordpress.com/2008/06/lecxml2.jpg"><img src="http://desarrollolibre.files.wordpress.com/2008/06/lecxml2.jpg" alt="Lector de XML Funcionando" /></a></p>
<p><strong>Basado en iformación de:</strong><br />
Homepage Von Thomas Zastrow -&gt; <a title="FPC y XML" href="http://www.thomas-zastrow.de/texte/fpcxml/index.php">FPC y XML</a> (inglés)<br />
XML Tutorial -&gt; <a title="Tutorial de XML" href="http://www.w3schools.com/xml/default.asp">Tutorial explicativo de XML</a> (inglés)<br />
Document Object Model -&gt; <a title="Estandar Modelo DOM" href="http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/cover.html">Especificación del modelo DOM</a> (inglés)<br />
Lazarus wiki -&gt; <a title="XML en Lazarus wiki" href="http://wiki.lazarus.freepascal.org/XML_Tutorial">Tutorial de Lazarus con XML</a> (inglés)</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/desarrollolibre.wordpress.com/8/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/desarrollolibre.wordpress.com/8/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/desarrollolibre.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/desarrollolibre.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/desarrollolibre.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/desarrollolibre.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/desarrollolibre.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/desarrollolibre.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/desarrollolibre.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/desarrollolibre.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/desarrollolibre.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/desarrollolibre.wordpress.com/8/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=desarrollolibre.wordpress.com&blog=3566520&post=8&subd=desarrollolibre&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://desarrollolibre.wordpress.com/2007/07/02/leer-archivos-xml-con-lazarus-i/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fa048ec1bbf25e1e386a97c09118894e?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">dhabyx</media:title>
		</media:content>

		<media:content url="http://desarrollolibre.files.wordpress.com/2008/06/lecxml1.jpg" medium="image">
			<media:title type="html">FormularioXML</media:title>
		</media:content>

		<media:content url="http://desarrollolibre.files.wordpress.com/2008/06/nodos.jpg" medium="image">
			<media:title type="html">Nodos XML</media:title>
		</media:content>

		<media:content url="http://desarrollolibre.files.wordpress.com/2008/06/lecxml2.jpg" medium="image">
			<media:title type="html">Lector de XML Funcionando</media:title>
		</media:content>
	</item>
	</channel>
</rss>