<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"><channel><title>Programa Facil Con Delphi7</title><description>Una Forma de Manejarte Con Delphi7, donde tambien puedes econtrar trucos y demas...</description><managingEditor>noreply@blogger.com (Erick Mueses)</managingEditor><pubDate>Fri, 1 Nov 2024 02:33:11 -0400</pubDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">14</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">25</openSearch:itemsPerPage><link>http://programadelphi7.blogspot.com/</link><language>en-us</language><itunes:explicit>no</itunes:explicit><itunes:subtitle>Una Forma de Manejarte Con Delphi7, donde tambien puedes econtrar trucos y demas...</itunes:subtitle><itunes:owner><itunes:email>noreply@blogger.com</itunes:email></itunes:owner><item><title>Consulta de Fechas con un adoquery</title><link>http://programadelphi7.blogspot.com/2009/03/consulta-de-fechas-con-un-adoquery.html</link><author>noreply@blogger.com (Erick Mueses)</author><pubDate>Mon, 9 Mar 2009 13:50:00 -0400</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3587987156694502915.post-6662130146612195661</guid><description>&lt;pre&gt;&lt;pre&gt;datamodule2.ADOQueryrepresultados.Close;&lt;br /&gt;   datamodule2.ADOQueryrepresultados.SQL.Clear;&lt;br /&gt;   datamodule2.ADOQueryrepresultados.SQL.Add('Select * from resultados_emitidos,pacientes,convenios');&lt;br /&gt;   datamodule2.ADOQueryrepresultados.SQL.Add('where resultados_emitidos.cedula_paciente=pacientes.cedula');&lt;span id="fullpost"&gt;&lt;br /&gt;   datamodule2.ADOQueryrepresultados.SQL.Add('and resultados_emitidos.codigo_convenio = convenios.codigo');&lt;br /&gt;   datamodule2.ADOQueryrepresultados.SQL.Add('and fecha1 &amp;gt;= :fecha_emision and fecha2&amp;lt;= :fecha2');&lt;br /&gt;   datamodule2.ADOQuery1.Parameters.ParamByName('fecha1').value := DateTimePicker1.Date;&lt;br /&gt;   datamodule2.ADOQuery1.Parameters.ParamByName('fecha2').value := DateTimePicker2.Date;&lt;br /&gt;   datamodule2.ADOQueryrepresultados.Open;&lt;/pre&gt;&lt;/pre&gt;  &lt;br /&gt;&lt;/span&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total></item><item><title>Cómo enviar E-mail con el cliente de correo electrónico por defecto desde Delphi</title><link>http://programadelphi7.blogspot.com/2009/02/como-enviar-e-mail-con-el-cliente-de.html</link><author>noreply@blogger.com (Erick Mueses)</author><pubDate>Wed, 4 Feb 2009 16:05:00 -0400</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3587987156694502915.post-1959358311095011243</guid><description>&lt;h4&gt;&amp;#191;C&amp;#243;mo puedo enviar un E-Mail desde Delphi usando el cliente de correo electr&amp;#243;nico por defecto instalado en tu pc (Outlook por ejemplo) si no tengo un navegador instalado?, pues es muy sencillo, utilizando un TMemo generamos el siguiente c&amp;#243;digo:&lt;span id="fullpost"&gt;&lt;/span&gt;    &lt;blockquote&gt;     &lt;pre&gt;uses&amp;#160;&amp;#160; ShellAPI, Windows;&lt;br /&gt;...&lt;br /&gt;ShellExecute(0, 'open', PChar('mailto:bugreports@youremail.com?subject=&lt;br /&gt;Bug%20Report&amp;amp;Body=' + MemoBugText.Text),&amp;#160;&amp;#160; nil, nil, SW_SHOWNORMAL);&lt;/pre&gt;&lt;br /&gt;  &lt;/blockquote&gt;&lt;/span&gt;  </description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Numeros aleatorios sin repeticion (una clase)</title><link>http://programadelphi7.blogspot.com/2008/10/numeros-aleatorios-sin-repeticion-una.html</link><category>Trucos</category><author>noreply@blogger.com (Erick Mueses)</author><pubDate>Wed, 15 Oct 2008 16:55:00 -0400</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3587987156694502915.post-3719560883430611887</guid><description>&lt;p&gt;&lt;a href="http://lh3.ggpht.com/erickmueses/SPZZh_HV2SI/AAAAAAAAADg/6PJ8l1aj4GY/image006%5B3%5D.jpg"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border="0" alt="image006" src="http://lh4.ggpht.com/erickmueses/SPZZih1Lf-I/AAAAAAAAADk/FJhiOoxnNK4/image006_thumb%5B1%5D.jpg" width="433" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;span id="fullpost"&gt;&lt;p&gt;&lt;b&gt;Supongamos que tenemos que rellenar una lotería primitiva: tenemos que hallar 6 números aleatorios de entre 69 números pero sin que se repitan.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;¿Como lo hacemos?, pues nada, aplicando la clase contenida en este truco.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;En concreto acabo de hacer esto pues estoy haciendo una página web y necesito mostrar en la misma página 3 artículos aleatorios de una base de datos... y claro, que se me repitan en la misma página web 3 articulos no es muy estético que digamos...&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Como en el asunto este se mezclan datos y funciones y procedures, he decidido meterlo todo en una clase para facilitar su reutilización.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;He colocado todo en una unit, (llamada uTAlea) para que con sólo añadirla en la clausula uses de nuestra aplicación pueda ser utillizada.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Aqui está el código de la unit uTAlea que contiene la clase TAlea:&lt;/b&gt;&lt;pre&gt; &lt;b&gt;unit&lt;/b&gt; uTAlea;&lt;br /&gt; &lt;em&gt;{Radikal, Q3 para Trucomania.}&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt; &lt;b&gt;interface&lt;/b&gt;&lt;br /&gt;&lt;br /&gt; &lt;b&gt;uses&lt;/b&gt; Windows,SysUtils;&lt;br /&gt;&lt;br /&gt; &lt;b&gt;type&lt;/b&gt;&lt;br /&gt;   &lt;em&gt;{Array de booleanos de longitud variable}&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;   TArrayBool = array[0..0] &lt;b&gt;of&lt;/b&gt; boolean;&lt;br /&gt;   PArrayBool = ^TArrayBool;&lt;br /&gt;&lt;br /&gt;   &lt;em&gt;{Clase para manejar numeros aleatorios}&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;   TAlea = class&lt;br /&gt;     Maximo             : integer;            //Valor maximo de los numeros obtenidos&lt;br /&gt;     Lista              : PArrayBool;&lt;br /&gt;     FaltanDeSacar      : integer;&lt;br /&gt;     &lt;b&gt;constructor&lt;/b&gt;        Create(Rango:integer);&lt;br /&gt;     &lt;b&gt;destructor&lt;/b&gt;         Destroy; override;&lt;br /&gt;     &lt;b&gt;procedure&lt;/b&gt;          Reset;                //Resetea la lista de numeros&lt;br /&gt;     &lt;b&gt;function&lt;/b&gt;           PillaNumero:integer;  //Devuelve un numero aletorio sin repeticion&lt;br /&gt;   &lt;b&gt;end;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;b&gt;implementation&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;b&gt;constructor&lt;/b&gt; TAlea.Create(Rango:integer);&lt;br /&gt; &lt;b&gt;begin&lt;/b&gt;&lt;br /&gt; &lt;em&gt;{&lt;br /&gt;   Si los números a extraer no pueden ser repetidos&lt;br /&gt;   hemos de crear un &lt;b&gt;array&lt;/b&gt; para almacenar cual ha salido y cual no&lt;br /&gt;   Como el &lt;b&gt;array&lt;/b&gt; ha de ser variable, usamos el GetMem y&lt;br /&gt;   los punteros para que sirva tambien para versiones&lt;br /&gt;   anteriores a Delphi 4, que no incorporan los arrays&lt;br /&gt;   de longitud variable...&lt;br /&gt; }&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;   &lt;b&gt;inherited&lt;/b&gt; Create;&lt;br /&gt;   Maximo:=Rango;&lt;br /&gt;   FaltanDeSacar:=Rango;&lt;br /&gt;   &lt;em&gt;{Reservamos memoria para el &lt;b&gt;array&lt;/b&gt; de longitud variable}&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;   GetMem(Lista, 1+Maximo * SizeOf(Boolean));&lt;br /&gt;   ZeroMemory(Lista,1+Maximo * SizeOf(Boolean));&lt;br /&gt; &lt;b&gt;end;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt; &lt;b&gt;destructor&lt;/b&gt; TAlea.Destroy;&lt;br /&gt; &lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;   &lt;b&gt;if&lt;/b&gt; Assigned(Lista) &lt;b&gt;then&lt;/b&gt; FreeMem(Lista, 1+Maximo * SizeOf(Boolean));&lt;br /&gt;   &lt;b&gt;inherited&lt;/b&gt; Destroy;&lt;br /&gt; &lt;b&gt;end;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt; &lt;b&gt;function&lt;/b&gt; TAlea.PillaNumero:integer;&lt;br /&gt; &lt;b&gt;var&lt;/b&gt;&lt;br /&gt;   Numero: integer;&lt;br /&gt; &lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;   &lt;b&gt;if&lt;/b&gt; FaltanDeSacar=0 &lt;b&gt;then&lt;/b&gt; raise exception.create( 'Error. No se pude sacar otro numero sin repetir'+#13+#10+&lt;br /&gt;                                                   'Error. No more numbers are available');&lt;br /&gt;&lt;br /&gt;   &lt;em&gt;{Buscamos un número que no haya salido ya}&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;   &lt;b&gt;repeat&lt;/b&gt; Numero:=Random(Maximo) &lt;b&gt;until&lt;/b&gt; NOT Lista^[Numero];&lt;br /&gt;   &lt;em&gt;{Lo apuntamos en la lista de numeros ya usados}&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;   Lista^[Numero]:=TRUE;&lt;br /&gt;   &lt;em&gt;{Decrementamos la cantidad de numeros que faltan por salir}&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;   Dec(FaltanDeSacar);&lt;br /&gt;   Result:=Numero;&lt;br /&gt; &lt;b&gt;end;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt; &lt;b&gt;procedure&lt;/b&gt; TAlea.Reset;&lt;br /&gt; &lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;   ZeroMemory(Lista,1+Maximo * SizeOf(Boolean));&lt;br /&gt;   FaltanDeSacar:=Maximo;&lt;br /&gt; &lt;b&gt;end;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt; end.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Ya sabes, la grabas como uTAlea.PAS para poder usarla en tus proyectos.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Vamos con una aplicación de ejemplo para probar la clase:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;li&gt;Crea una aplicacion nueva, con una form que contenga un TMemo (Memo1) y un TButton (Button1)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;li&gt;Copia el uTAlea.PAS en el directorio de esa aplicacion&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;li&gt;Añade TAlea en el uses de tu form&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;li&gt;Mete el siguiente código en el OnCLick del Button1:&lt;/b&gt;&lt;pre&gt; &lt;b&gt;procedure&lt;/b&gt; TForm1.Button1Click(Sender: TObject);&lt;br /&gt; &lt;b&gt;var&lt;/b&gt;&lt;br /&gt;   Ristra : TAlea;&lt;br /&gt;   n      : integer;&lt;br /&gt; &lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;    Memo1.Lines.Clear;&lt;br /&gt;&lt;br /&gt;    Ristra:=TAlea.Create(10);&lt;br /&gt;&lt;br /&gt;    &lt;em&gt;{Sacamos 10 numero sin repetir}&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;    &lt;b&gt;for&lt;/b&gt; n:=1 &lt;b&gt;to&lt;/b&gt; 10 &lt;b&gt;do&lt;/b&gt; &lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;      memo1.Lines.Add( IntToStr(Ristra.PillaNumero) );&lt;br /&gt;    &lt;b&gt;end;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;    Memo1.lines.Add('Otros 5 numeros de entre 10...');&lt;br /&gt;&lt;br /&gt;    Ristra.Reset;&lt;br /&gt;    &lt;b&gt;for&lt;/b&gt; n:=1 &lt;b&gt;to&lt;/b&gt; 5 &lt;b&gt;do&lt;/b&gt; &lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;      memo1.Lines.Add( IntToStr(Ristra.PillaNumero) );&lt;br /&gt;    &lt;b&gt;end;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;    Ristra.Free;&lt;br /&gt; &lt;b&gt;end;&lt;/b&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/span&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://lh4.ggpht.com/erickmueses/SPZZih1Lf-I/AAAAAAAAADk/FJhiOoxnNK4/s72-c/image006_thumb%5B1%5D.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><title>Calcular la Edad (en años) segun la fecha de nacimiento</title><link>http://programadelphi7.blogspot.com/2008/10/calcular-la-edad-en-aos-segun-la-fecha.html</link><category>Trucos</category><author>noreply@blogger.com (Erick Mueses)</author><pubDate>Wed, 15 Oct 2008 16:51:00 -0400</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3587987156694502915.post-8819081813269481150</guid><description>&lt;pre&gt;&lt;a href="http://lh5.ggpht.com/erickmueses/SPZXrCJunGI/AAAAAAAAADY/Z7e9IH7qXmE/edad_cinturon%5B2%5D.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="244" alt="edad_cinturon" src="http://lh6.ggpht.com/erickmueses/SPZXrqztRrI/AAAAAAAAADc/_9y2FybI0f4/edad_cinturon_thumb.jpg" width="190" border="0"&gt;&lt;/a&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;  &lt;/pre&gt;&lt;pre&gt;&lt;b&gt;procedure&lt;/b&gt; TForm1.Button1Click(Sender: TObject);&lt;br /&gt;&lt;br /&gt;   &lt;b&gt;function&lt;/b&gt; Edad(FechaNacimiento:string):integer;&lt;br /&gt;   &lt;b&gt;var&lt;/b&gt;&lt;br /&gt;      iTemp,iTemp2,Nada:word;&lt;br /&gt;      Fecha:TDate;&lt;br /&gt;   &lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;     Fecha:=StrToDate(FechaNacimiento);&lt;br /&gt;     DecodeDate(Date,itemp,Nada,Nada);&lt;br /&gt;     DecodeDate(Fecha,itemp2,Nada,Nada);&lt;br /&gt;      &lt;b&gt;if&lt;/b&gt; FormatDateTime('mmdd',Date) &amp;lt;&lt;br /&gt;         FormatDateTime('mmdd',Fecha) &lt;b&gt;then&lt;/b&gt; Result:=iTemp-iTemp2-1&lt;br /&gt;                                      &lt;b&gt;else&lt;/b&gt; Result:=iTemp-iTemp2;&lt;br /&gt;   &lt;b&gt;end;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt; &lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;   Label1.Caption:=intToStr(Edad('07/09/1969'));&lt;br /&gt; &lt;b&gt;end;&lt;/b&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;  </description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://lh6.ggpht.com/erickmueses/SPZXrqztRrI/AAAAAAAAADc/_9y2FybI0f4/s72-c/edad_cinturon_thumb.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Mantener una Spash Screen unos segundos tras cargar la aplicación</title><link>http://programadelphi7.blogspot.com/2008/10/mantener-una-spash-screen-unos-segundos.html</link><author>noreply@blogger.com (Erick Mueses)</author><pubDate>Wed, 15 Oct 2008 16:45:00 -0400</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3587987156694502915.post-4297811432401470259</guid><description>&lt;p&gt;&lt;b&gt;&lt;a href="http://lh6.ggpht.com/erickmueses/SPZWSYaGNsI/AAAAAAAAADQ/PQFMjgHMoUE/SplashScreen%5B3%5D.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="227" alt="SplashScreen" src="http://lh6.ggpht.com/erickmueses/SPZWS1hgp-I/AAAAAAAAADU/YEEPannLApk/SplashScreen_thumb%5B1%5D.jpg" width="297" border="0"&gt;&lt;/a&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;span id="fullpost"&gt; &lt;p&gt;&lt;b&gt;En tu form principal, declara una variable pública llamada SplashScreenHandle: &lt;/b&gt;&lt;/p&gt;&lt;pre&gt; 	var&lt;br /&gt; 	    SplashScreenHandle:integer;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;En el fuente del projecto, añade una sección var como la siguiente: &lt;/b&gt;&lt;pre&gt; 	VAR&lt;br /&gt; 	    SplashScreen:TSplashScreen;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Dentro de la sección begin-end, añade el siguiente código al principio: &lt;/b&gt;&lt;pre&gt; Begin&lt;br /&gt;     &lt;em&gt;{Mostramos la Splash Screen}&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;     &lt;em&gt;{Show the splash screen}&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;     SplashScreen:=TSplashScreen.Create(Application);&lt;br /&gt;     Splashscreen.show;&lt;br /&gt;     SplashScreen.update;&lt;br /&gt;     &lt;em&gt;{Creamos la form principal}&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;     &lt;em&gt;{Create the main form}&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;     Application.createform(MainForm,MainFormUnit);&lt;br /&gt;     MainFormUnit.SplashScreenHandle:=SplashScreen.handle;&lt;br /&gt;     &lt;em&gt;{Aqui el resto de tu projecto...}&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;     &lt;em&gt;{rest &lt;b&gt;of&lt;/b&gt; your code goes here....}&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt; end.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Entonces, en tu form principal, mediante un timer, ejecutamos éste código para cerrar la Splash Screen: &lt;/b&gt;&lt;pre&gt;     SendMessage(SplashScreenHandle,WM_CLOSE,0,0);&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;  </description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://lh6.ggpht.com/erickmueses/SPZWS1hgp-I/AAAAAAAAADU/YEEPannLApk/s72-c/SplashScreen_thumb%5B1%5D.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>Agilizar la carga de tu aplicacion</title><link>http://programadelphi7.blogspot.com/2008/10/agilizar-la-carga-de-tu-aplicacion.html</link><category>Trucos</category><author>noreply@blogger.com (Erick Mueses)</author><pubDate>Wed, 15 Oct 2008 16:41:00 -0400</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3587987156694502915.post-2400171202586331461</guid><description>&lt;p align="justify"&gt;¿ Tu aplicacion tarda mucho en cargar ?. Igual te interesa este truco... &lt;br&gt;&lt;/p&gt; &lt;p align="justify"&gt;No crees todos los forms de golpe, crea sólo el inicial, y desde el crea dinámicamente los que vayas a utilizar, sólo cuando los vayas a utilizar. Es decir, en el IDE, en Project-&amp;gt;Options tienes dos ventanas, una la de 'Autocreate forms' y otra, la de 'Available forms'. Pues pon sólo la principal en 'Autocreate forms'. &lt;br&gt;&lt;/p&gt; &lt;p align="justify"&gt;Después, en el uses de la primera form, añades las units del resto de forms, y en el var de la primera form, declaras las variables TForm del resto de forms que vayas a crear.&lt;span id="fullpost"&gt; &lt;br&gt;&lt;/p&gt;&lt;b&gt;&lt;/b&gt; &lt;p&gt;&lt;b&gt;Un ejemplo de Form1 que crea una Form2: &lt;/b&gt;&lt;br&gt;&lt;/p&gt;&lt;b&gt;&lt;/b&gt; &lt;p&gt;&lt;b&gt;El uses de Form1: &lt;/b&gt;&lt;/p&gt;&lt;pre&gt; &lt;b&gt;uses&lt;/b&gt;&lt;br /&gt;   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  StdCtrls, Unit2;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;El var de Form1: &lt;/b&gt;&lt;pre&gt; &lt;b&gt;var&lt;/b&gt;&lt;br /&gt;   Form1: TForm1;&lt;br /&gt;   Form2: TForm2;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Y cuando quieras llamar a la Form2 desde Form1 usa: &lt;/b&gt;&lt;pre&gt; &lt;b&gt;procedure&lt;/b&gt; TForm1.Button1Click(Sender: TObject);&lt;br /&gt; &lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;   Form2:=TForm2.Create(self);&lt;br /&gt;   Form2.Show;&lt;br /&gt; &lt;b&gt;end;&lt;/b&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Si tras hacer todo esto, te sigue tardando mucho en cargar el primer form, puedes ponerle una Splash Screen (una pantalla inicial) en la que le pones el típico mensaje de 'cargando'. &lt;/p&gt;&lt;/span&gt;  </description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>SplashScreen con progressbar</title><link>http://programadelphi7.blogspot.com/2008/10/splashscreen-con-progressbar_15.html</link><category>Trucos</category><author>noreply@blogger.com (Erick Mueses)</author><pubDate>Wed, 15 Oct 2008 16:30:00 -0400</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3587987156694502915.post-591427007520572589</guid><description>&lt;p align="justify"&gt;&lt;a href="http://lh5.ggpht.com/erickmueses/SPZSutdsiZI/AAAAAAAAADI/JABW9DB8WCI/SplashScreenProgressBarNoMessage4.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="100" alt="SplashScreenProgressBarNoMessage" src="http://lh6.ggpht.com/erickmueses/SPZSvfSKmNI/AAAAAAAAADM/isIPojN63WE/SplashScreenProgressBarNoMessage_thu.png" width="125" align="left" border="0"&gt;&lt;/a&gt; Hacer que aparezca una ventana mientras se carga mi aplicacion (Splash Screen)&lt;br&gt;se explica cómo hacer una SplashScreen.&lt;br&gt;"SplashScreen con progressbar", esta pensado sobre todo para cuando abres bases de datos y se tarda un mundo en cargar el programa. Con el progressbar queda bastante bien...&lt;br&gt;Primero debemos definir cuantos "pasos" va a tener el progressbar, en este caso el numero de bases de datos que vamos a abrir, luego establecemos por ejemplo el valor Max progressbar a 40 y el valor Step a 10 y hacemos 4 "stepit", seria de la siguiente manera:&lt;br&gt;Este codigo esta en el evento OnCreate de una form principal, pero podriamos mandarlo llamar de otras forms siempre en el evento OnCreate.&lt;/p&gt;&lt;span id="fullpost"&gt; &lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt; &lt;b&gt;procedure&lt;/b&gt; TForm1.FormCreate(Sender: TObject);   &lt;/pre&gt;&lt;pre&gt; &lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;   Try&lt;br /&gt;     DataBase1.Connected:=True&lt;br /&gt;   Except&lt;br /&gt;     ShowMessage('Cannot open DB1')&lt;br /&gt;   End;&lt;br /&gt;   SplashForm.ProgressBar.StepIt;&lt;br /&gt;   SplashForm.update;&lt;br /&gt;   Try&lt;br /&gt;     DataBase2.Connected:=True&lt;br /&gt;   Except&lt;br /&gt;     ShowMessage('Cannot open DB2')&lt;br /&gt;   End;&lt;br /&gt;   SplashForm.ProgressBar.StepIt;&lt;br /&gt;   SplashForm.update;&lt;br /&gt;   Try&lt;br /&gt;     Table1.Active:=True&lt;br /&gt;   Except&lt;br /&gt;     ShowMessage('Cannot open Table 1')&lt;br /&gt;   End;&lt;br /&gt;   SplashForm.ProgressBar.StepIt;&lt;br /&gt;   SplashForm.update;&lt;br /&gt;   Try&lt;br /&gt;     Table2.Connected:=True&lt;br /&gt;   Except&lt;br /&gt;     ShowMessage('Cannot open Table 2')&lt;br /&gt;   End;&lt;br /&gt;   SplashForm.ProgressBar.StepIt;&lt;br /&gt;   SplashForm.update;&lt;br /&gt;   ...&lt;br /&gt;   SplashForm.Free&lt;br /&gt; &lt;b&gt;end;&lt;/b&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;  </description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://lh6.ggpht.com/erickmueses/SPZSvfSKmNI/AAAAAAAAADM/isIPojN63WE/s72-c/SplashScreenProgressBarNoMessage_thu.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Ventajas de migrar de Delphi 7 a Delphi 2007 for Win32 Part. 1</title><link>http://programadelphi7.blogspot.com/2008/08/ventajas-de-migrar-de-delphi-7-delphi.html</link><category>Recomendaciones</category><author>noreply@blogger.com (Erick Mueses)</author><pubDate>Thu, 7 Aug 2008 10:34:00 -0400</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3587987156694502915.post-8679656785533590678</guid><description>&lt;p align="justify"&gt;Muchos desarrolladores que utilizan la versi&amp;#243;n 7 se Delphi preguntan cuales son las razones para cambiar a una nueva versi&amp;#243;n de Delphi, en este momento la mas nueva versi&amp;#243;n de Delphi 2007 para Win32, exclusivamente para desarrollo nativo &amp;#8211; Win32. Como las discusiones sobre el asunto se extienden, vamos a presentar, en este articulo, las principales razones para hacer esta migraci&amp;#243;n, presentando todos los nuevos recursos desde la versi&amp;#243;n de Delphi 7.&lt;span id="fullpost"&gt;    &lt;p align="justify"&gt;Continuamos buscando mas calidad y mejor desempe&amp;#241;o en el IDE y las aplicaciones generadas, con Delphi 2007 for Win32 tender&amp;#225;s mas desempe&amp;#241;o en tiempo de desarrollo y en la aplicaci&amp;#243;n final comparado a Delphi 7.&lt;/p&gt;    &lt;p align="justify"&gt;&lt;strong&gt;Novedades en el compilador y el lenguaje desde Delphi 7&lt;/strong&gt;&lt;/p&gt;    &lt;p align="justify"&gt;&lt;strong&gt;Directiva inline&lt;/strong&gt;&lt;/p&gt;    &lt;p align="justify"&gt;Se trata de una nueva directiva que va aumentar el desempe&amp;#241;o del compilador con solo agregar la palabra reservada &amp;#8220;inline&amp;#8221;. En este caso, el m&amp;#233;todo es expandido, evitando su lectura a todo momento. Esta forma de acceso presenta mejores resultados para m&amp;#233;todos peque&amp;#241;os, fuera del alcance de la unit o para rutinas con muchos par&amp;#225;metros. Para el caso de rutinas mas grandes, se recomienda hacer una an&amp;#225;lisis de costo-benefici&amp;#243; en cuanto a su utilizaci&amp;#243;n &lt;/p&gt;    &lt;p align="justify"&gt;A continuaci&amp;#243;n se muestra el c&amp;#243;digo una aplicaci&amp;#243;n de consola, utilizando &amp;#8220;inline&amp;#8221; en la funci&amp;#243;n Max.&amp;#160; &lt;br /&gt;&lt;/p&gt;    &lt;table cellspacing="0" cellpadding="2" width="700" border="1"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="698"&gt;           &lt;p&gt;program InlineDemo;              &lt;br /&gt;{$APPTYPE CONSOLE} &lt;/p&gt;            &lt;p&gt;uses              &lt;br /&gt;&amp;#160; MMSystem; &lt;/p&gt;            &lt;p&gt;&amp;#160; function Max(const X,Y,Z: Integer): Integer;inline              &lt;br /&gt;&amp;#160; begin               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if X &amp;gt; Y then               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if X &amp;gt; Z then Result := X               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else Result := Z               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if Y &amp;gt; Z then Result := Y               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else Result := Z               &lt;br /&gt;&amp;#160; end; &lt;/p&gt;            &lt;p&gt;const              &lt;br /&gt;&amp;#160; Times = 10000000; // 10 mill&amp;#243;n               &lt;br /&gt;var               &lt;br /&gt;&amp;#160; A,B,C,D: Integer;               &lt;br /&gt;&amp;#160; Start: LongInt;               &lt;br /&gt;&amp;#160; i: Integer; &lt;/p&gt;            &lt;p&gt;begin              &lt;br /&gt;&amp;#160; Random; // 0               &lt;br /&gt;&amp;#160; A := Random(4242);               &lt;br /&gt;&amp;#160; B := Random(4242);               &lt;br /&gt;&amp;#160; C := Random(4242);               &lt;br /&gt;&amp;#160; Start := TimeGetTime;               &lt;br /&gt;&amp;#160; for i:=1 to Times do               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; D := Max(A,B,C);               &lt;br /&gt;&amp;#160; Start := TimeGetTime-Start;               &lt;br /&gt;&amp;#160; writeln(A,', ',B,', ',C,': ',D);               &lt;br /&gt;&amp;#160; writeln('Calling Max ',Times,' times took ',Start,' milliseconds.');               &lt;br /&gt;&amp;#160; readln &lt;/p&gt;            &lt;p&gt;end.&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;    &lt;p align="justify"&gt;Al ejecutar est&amp;#233; c&amp;#243;digo y comparar los resultados se encuentra una reducci&amp;#243;n importante en el tiempo de respuesta. Los siguientes resultados se obtuvieron despu&amp;#233;s de que se ejecut&amp;#243; la funci&amp;#243;n Max 10 millones de veces en una computadora Pentium M 1.8GHz con 2GB RAM. . Aunque estos valores pueden cambiar una computadora a otra, las proporciones son similares.&lt;/p&gt;    &lt;table cellspacing="0" cellpadding="2" width="400" border="1"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td align="center" width="199"&gt;Con inline&lt;/td&gt;          &lt;td align="center" width="199"&gt;Sin inline&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td align="center" width="199"&gt;25 milisegundos&lt;/td&gt;          &lt;td align="center" width="199"&gt;68 milisegundos&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;    &lt;p&gt;De acuerdo con lo visto en la tabla anterior, se observa que al utilizar la capacidad &amp;#8220;inline&amp;#8221;, el c&amp;#243;digo compilado puede aumentar, su rendimiento m&amp;#225;s de un 50%.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Sobrecarga de operadores&lt;/strong&gt;&lt;/p&gt;    &lt;table cellspacing="0" cellpadding="2" width="700" border="1"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="698"&gt;           &lt;p&gt;type              &lt;br /&gt;&amp;#160;&amp;#160; TMyClass = class               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; class operator Sumar(a, b: TMyClass): TMyClass;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Sumar las clases de tipo TMyClass               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; class operator Restar(a, b: TMyClass): TMyclass; // Restar las clases de tipo TMyClass               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; class operator Implicit(a: Integer): TMyClass;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Conversi&amp;#243;n impl&amp;#237;cita&amp;#160; para la clase de tipo TMyClass               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; class operator Implicit(a: TMyClass): Integer;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Conversi&amp;#243;n impl&amp;#237;cita de la clase TmyClass para Integers.               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; class operator Explicit(a: Double): TMyClass;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Conversi&amp;#243;n explicita de un Double para la clase TMyClass               &lt;br /&gt;&amp;#160;&amp;#160; end; &lt;/p&gt;            &lt;p&gt;// Ejemplo de implementaci&amp;#243;n del m&amp;#233;todo Sumar              &lt;br /&gt;class operator TMyClass.Add(a, b: TMyClass): TMyClass;               &lt;br /&gt;begin               &lt;br /&gt;&amp;#160;&amp;#160; // ...               &lt;br /&gt;end; &lt;/p&gt;            &lt;p&gt;var              &lt;br /&gt;x, y: TMyClass;               &lt;br /&gt;begin               &lt;br /&gt;&amp;#160;&amp;#160; x := 12;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Conversi&amp;#243;n impl&amp;#237;cita de un Integer, ejecuta el m&amp;#233;todo Implicit               &lt;br /&gt;&amp;#160;&amp;#160; y := x + x;&amp;#160;&amp;#160; // Ejecuta TMyClass.Add(a, b: TMyClass): TMyClass               &lt;br /&gt;&amp;#160;&amp;#160; b := b + 100; // Ejecuta TMyClass.Add(b, TMyClass.Implicit(100))               &lt;br /&gt;end;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;    &lt;p&gt;&lt;strong&gt;Class Helpers&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;Los Class Helpers permiten extender clases sin utilizar herencia. Este recurso es importante, pues algunas clases, llamadas clases Selead, no pueden ser heredadas. La utilizaci&amp;#243;n de este nuevo recurso es muy apreciada. A continuaci&amp;#243;n se muestra un ejemplo.&lt;/p&gt;    &lt;table cellspacing="0" cellpadding="2" width="700" border="1"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="698"&gt;           &lt;p&gt;type              &lt;br /&gt;&amp;#160;&amp;#160; TMyClass = class               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; procedure MyProc;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function&amp;#160; MyFunc: Integer;               &lt;br /&gt;&amp;#160;&amp;#160; end; &lt;/p&gt;            &lt;p&gt;&amp;#160;&amp;#160; ... &lt;/p&gt;            &lt;p&gt;&amp;#160;&amp;#160; procedure TMyClass.MyProc;              &lt;br /&gt;&amp;#160;&amp;#160; var X: Integer;               &lt;br /&gt;&amp;#160;&amp;#160; begin               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; X := MyFunc;               &lt;br /&gt;&amp;#160;&amp;#160; end; &lt;/p&gt;            &lt;p&gt;&amp;#160;&amp;#160; function TMyClass.MyFunc: Integer;              &lt;br /&gt;&amp;#160;&amp;#160; begin               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ...               &lt;br /&gt;&amp;#160;&amp;#160; end; &lt;/p&gt;            &lt;p&gt;... &lt;/p&gt;            &lt;p&gt;type              &lt;br /&gt;&amp;#160;&amp;#160; TMyClassHelper = class helper for TMyClass               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; procedure HelloWorld;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function MyFunc: Integer;               &lt;br /&gt;&amp;#160;&amp;#160; end; &lt;/p&gt;            &lt;p&gt;&amp;#160;&amp;#160; ... &lt;/p&gt;            &lt;p&gt;&amp;#160;&amp;#160; procedure TMyClassHelper.HelloWorld;              &lt;br /&gt;&amp;#160;&amp;#160; begin               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writeln(Self.ClassName); // Self hace referencia al tipo TMyClass y no TMyClassHelper               &lt;br /&gt;&amp;#160;&amp;#160; end; &lt;/p&gt;            &lt;p&gt;&amp;#160;&amp;#160; function TMyClassHelper.MyFunc: Integer;              &lt;br /&gt;&amp;#160;&amp;#160; begin               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ...               &lt;br /&gt;&amp;#160;&amp;#160; end;               &lt;br /&gt;...               &lt;br /&gt;var               &lt;br /&gt;&amp;#160; X: TMyClass;               &lt;br /&gt;begin               &lt;br /&gt;&amp;#160; X := TMyClass.Create;               &lt;br /&gt;&amp;#160; X.MyProc;&amp;#160;&amp;#160;&amp;#160; // Ejecuta TMyClass.MyProc               &lt;br /&gt;&amp;#160; X.HelloWorld; // Ejecuta TMyClassHelper.HelloWorld               &lt;br /&gt;&amp;#160; X.MyFunc;&amp;#160;&amp;#160;&amp;#160; // Ejecuta TMyClassHelper.MyFunc&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;    &lt;p&gt;Vale la pena observar que la referencia es siempre a la clase TMyClass. El compilador sabe cuando ejecutar la llamada a TMyClassHelper.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Strict private y Strict protected&lt;/strong&gt; &lt;/p&gt;    &lt;p&gt;Ahora en Delphi Win32 y .NET se tienen dos formas adicionales de determinar la visibilidad de los atributos de una clase: strict private y strict protected. &lt;/p&gt;    &lt;p&gt;Strict private: todos los atributos de la clase son visibles &amp;#250;nicamente en la clase que fueron declarados. Estos atributos no estar&amp;#225;n visibles para m&amp;#233;todos declarados en la misma unit y para aquellos que no forman parte de la clase. &lt;/p&gt;    &lt;p&gt;Strict protected: Espec&amp;#237;fica que los atributos da clase son visibles para la propia clase y sus descendentes.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Los Records ahora soportan m&amp;#233;todos&lt;/strong&gt; &lt;/p&gt;    &lt;p&gt;Las capacidades de los registros (records) han sido incrementadas, pasando a ser casi lo mismo que una clase (Class), con soporte ha:      &lt;br /&gt;Constructores.       &lt;br /&gt;Sobre posici&amp;#243;n de operadores.       &lt;br /&gt;Declaraci&amp;#243;n de m&amp;#233;todos no-virtuales.       &lt;br /&gt;M&amp;#233;todos y propiedades est&amp;#225;ticos. &lt;/p&gt;    &lt;p&gt;Veamos un ejemplo de la implementaci&amp;#243;n de un registro con estas nuevas caracter&amp;#237;sticas:&lt;/p&gt;    &lt;table cellspacing="0" cellpadding="2" width="700" border="1"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="698"&gt;           &lt;p&gt;Type              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; TMiRegistro = Record               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Type               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TTipoColor = Integer;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Var               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Rojo : Integer;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Class Var               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Azul : Integer;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Procedure imprimirRojo();               &lt;br /&gt;Constructor Create(Val : Integer);               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Property pRojo : TTipoColor Read Rojo Write Rojo;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Class Property&amp;#160; pAzul : TTipoColor Read Azul Write Azul;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; End; &lt;/p&gt;            &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Constructor TMiRegistro.Create(Val: Integer);              &lt;br /&gt;Begin               &lt;br /&gt;&amp;#160; Rojo := Val;               &lt;br /&gt;End; &lt;/p&gt;            &lt;p&gt;Procedure TMiRegistro.imprimirRojo;              &lt;br /&gt;Begin               &lt;br /&gt;&amp;#160; WriteLn('Rojo: ', Rojo);               &lt;br /&gt;End;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;    &lt;p&gt;De acuerdo a lo visto anteriormente los registros pueden utilizar muchas de las funcionalidades que hasta entonces eran exclusivas de las clases, sin embargo los registros no son clases y tienen muchas diferencias:      &lt;br /&gt;Los Registros no tienen soporte a herencia;       &lt;br /&gt;Los Registros pueden tener partes variable, las clases no;       &lt;br /&gt;Los Registros son tipos de datos y pueden, entre otras cosas, ser copiados, clases no;       &lt;br /&gt;Los Registros no tienen destructores;       &lt;br /&gt;Los Registros no tienen soporte a m&amp;#233;todos virtuales;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Class abstract, Class sealed, Class const, Class type, Class var, Class property&lt;/strong&gt; &lt;/p&gt;    &lt;p&gt;Diversas nuevas formas de declaraci&amp;#243;n de clases, tipos, variables y propiedades. &lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Class abstract&lt;/strong&gt; -Especifica una clase abstracta. &lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Class sealed&lt;/strong&gt; - Especifica que la clase no puede ser heredada. &lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Class const&lt;/strong&gt; - Especifica una constante para la clase, que puede ser accedida sin necesidad de crear instancias de la clase. &lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Class type&lt;/strong&gt; -Define uno tipo para la clase que puede ser accedida sin necesidad de crear instancias de la clase. &lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Class var&lt;/strong&gt; -Define una variable en el scope de la clase que puede ser accedida sin necesidad de crear instancias de la clase. &lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Class property&lt;/strong&gt; -Define propiedad que puede ser accedida sin la necesidad de crear instancias de la clase.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Nested Clases&lt;/strong&gt; &lt;/p&gt;    &lt;p&gt;De una forma m&amp;#225;s did&amp;#225;ctica, las clases Nested (o anidadas) serian como subclases, que pueden ser accedidas a partir de una clase y su tipo declarado dentro del contexto. Ejemplo de clase:&lt;/p&gt;    &lt;table cellspacing="0" cellpadding="2" width="700" border="1"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="698"&gt;           &lt;p&gt;type              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TOuterClass = class               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; strict private               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; myField: Integer;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; type               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TInnerClass = class               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; myInnerField: Integer;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; procedure innerProc;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; end; &lt;/p&gt;            &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; procedure outerProc;              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; end;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;    &lt;p&gt;El m&amp;#233;todo de la clase interna se implementa de la siguiente manera:&lt;/p&gt;    &lt;table cellspacing="0" cellpadding="2" width="700" border="1"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="700"&gt;           &lt;p&gt;procedure TOuterClass.TInnerClass.innerProc;              &lt;br /&gt;begin               &lt;br /&gt;&amp;#160;&amp;#160; ...               &lt;br /&gt;end;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;    &lt;p&gt;Finalmente el siguiente c&amp;#243;digo muestra como acceder al m&amp;#233;todo que est&amp;#225; en la clase anidada:&lt;/p&gt;    &lt;table cellspacing="0" cellpadding="2" width="700" border="1"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="700"&gt;           &lt;p&gt;var              &lt;br /&gt;&amp;#160;&amp;#160; x: TOuterClass;               &lt;br /&gt;&amp;#160;&amp;#160; y: TOuterClass.TInnerClass; &lt;/p&gt;            &lt;p&gt;begin              &lt;br /&gt;&amp;#160;&amp;#160; x := TOuterClass.Create;               &lt;br /&gt;&amp;#160;&amp;#160; x.outerProc;               &lt;br /&gt;&amp;#160;&amp;#160; ...               &lt;br /&gt;&amp;#160;&amp;#160; y := TOuterClass.TInnerClass.Create;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;    &lt;p&gt;&lt;strong&gt;M&amp;#233;todos finales&lt;/strong&gt; &lt;/p&gt;    &lt;p&gt;Los M&amp;#233;todos declarados con final especifican que el mismo m&amp;#233;todo no pode ser sobrepuesto (override) en clases descendentes, sin embargo se puede declarar uno m&amp;#233;todo con el mismo nombre siendo virtual.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Static class method&lt;/strong&gt; &lt;/p&gt;    &lt;p&gt;Son clases que cuando son declaradas como Static no necesitan ser instanciadas para ser accedidas.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;For &amp;#8230; in&lt;/strong&gt; &lt;/p&gt;    &lt;p&gt;Ahora es posible hacer un for directo en objetos que contengan collections, arrays, expresiones string y expresiones de tipo set, tanto para Delphi Win32 como para .NET. Ejemplos: &lt;/p&gt;    &lt;p&gt;Ejemplo: Iteraci&amp;#243;n en un Array&lt;/p&gt;    &lt;table cellspacing="0" cellpadding="2" width="700" border="1"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="700"&gt;           &lt;p&gt;var              &lt;br /&gt;&amp;#160; IArray1: array[0..9] of Integer&amp;#160;&amp;#160; = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);               &lt;br /&gt;&amp;#160; I: Integer; &lt;/p&gt;            &lt;p&gt;begin              &lt;br /&gt;&amp;#160; for I in IArray1 do               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; begin               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Hacer algo aqu&amp;#237;...               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; end;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;    &lt;p&gt;Ejemplo: iteraci&amp;#243;n en un String:&lt;/p&gt;    &lt;table cellspacing="0" cellpadding="2" width="700" border="1"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="700"&gt;           &lt;p&gt;var              &lt;br /&gt;&amp;#160; C: Char;               &lt;br /&gt;&amp;#160; S1, S2: String; &lt;/p&gt;            &lt;p&gt;&amp;#160; OS1, OS2: ShortString;              &lt;br /&gt;&amp;#160; AC: AnsiChar;               &lt;br /&gt;begin &lt;/p&gt;            &lt;p&gt;&amp;#160; S1 := &amp;#8216;Nuevos recursos en Delphi 2007';              &lt;br /&gt;&amp;#160; S2 := ''; &lt;/p&gt;            &lt;p&gt;&amp;#160; for C in S1 do              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; S2 := S2 + C; &lt;/p&gt;            &lt;p&gt;&amp;#160; if S1 = S2 then              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; WriteLn('SUCESSO #1');               &lt;br /&gt;&amp;#160; else               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; WriteLn('FALHOU #1'); &lt;/p&gt;            &lt;p&gt;&amp;#160; OS1 := 'Migrando de Delphi 7 para Delphi 2007...';              &lt;br /&gt;&amp;#160; OS2 := ''; &lt;/p&gt;            &lt;p&gt;&amp;#160; for AC in OS1 do              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; OS2 := OS2 + AC; &lt;/p&gt;            &lt;p&gt;&amp;#160; if OS1 = OS2 then              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; WriteLn('EXITO #2');               &lt;br /&gt;&amp;#160; else               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; WriteLn('FALLOU #2'); &lt;/p&gt;            &lt;p&gt;end.&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;    &lt;p&gt;&lt;strong&gt;Novedades en el IDE desde Delphi 7&lt;/strong&gt; &lt;/p&gt;    &lt;p&gt;El IDE trae una serie de novedades, como: &lt;/p&gt;    &lt;p&gt;MSBuild &amp;#224; controle todo el proceso de compilaci&amp;#243;n de su aplicaci&amp;#243;n, los pasos antes y despu&amp;#233;s de compilar un proyecto, esto es excelente para los desarrolladores que necesitan automatizar la compilaci&amp;#243;n. Cuando abrir un proyecto en Delphi 2007, autom&amp;#225;ticamente el mismo va ser convertido para el nuevo formato y con la extensi&amp;#243;n DPROJ, para soportar MSBuild. &lt;/p&gt;    &lt;p&gt;Vista e XP Themes &amp;#224; el IDE soporta los temas para Windows Vista y XP. Ahora es default y puedes habilitar y deshabilitar a trav&amp;#233;s de las opciones de proyecto. &lt;/p&gt;    &lt;p&gt;Project Manager &amp;#224; el project manager soporta m&amp;#250;ltiplas selecciones y con esto permite abertura, grabaci&amp;#243;n y borrar mas de un archivo simult&amp;#225;neamente. &lt;/p&gt;    &lt;p&gt;File Browser &amp;#224; con el File Browser no tenemos que abrir Windows Explorer o ir al men&amp;#250; File Open todo tiempo para abrir un archivo, pues File Browser ofrece acceso directo a su &amp;#225;rbore de carpetas de dentro del IDE.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Live Templates, Block Completion, indicador de l&amp;#237;neas alteradas &lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;Los nuevos recursos de live template extienden la capacidad de crear plantillas de c&amp;#243;digo en Delphi. Estas plantillas son creadas en un archivo XML y ayudan a programar escribiendo menos c&amp;#243;digo.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://lh3.ggpht.com/erickmueses/SJsH0UTmjII/AAAAAAAAACA/2v432Lzpj-0/image%5B13%5D.png"&gt;&lt;img height="477" alt="image" src="http://lh3.ggpht.com/erickmueses/SJsH1UPG1eI/AAAAAAAAACE/Oh-BlpjlSPo/image_thumb%5B11%5D.png" width="640" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Figure 1. Creando un try..finally utilizando la capacidad de LiveTemplates. &lt;/p&gt;    &lt;p&gt;La capacidad de block completion es uno de los recursos que habilitan el begin y end autom&amp;#225;tico. &amp;#191;Qui&amp;#233;n nunca se perdi&amp;#243; con begin y end? &lt;/p&gt;    &lt;p&gt;En la figura 1, tenemos una marcaci&amp;#243;n amarilla y otra verde, la amarilla representa las l&amp;#237;neas que fueron cambiadas, mientras las verdes son l&amp;#237;neas que no cambiaran.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Hist&amp;#243;rico de los cambios&lt;/strong&gt; &lt;/p&gt;    &lt;p&gt;Independiente de una herramienta de control de versiones, las alteraciones en fuentes son versionadas localmente, permitiendo la comparaci&amp;#243;n entre las versiones.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://lh3.ggpht.com/erickmueses/SJsH4wSoaOI/AAAAAAAAACI/2E7v0pJqekA/image%5B20%5D.png"&gt;&lt;img height="729" alt="image" src="http://lh4.ggpht.com/erickmueses/SJsH72KlWyI/AAAAAAAAACM/o9qyTDDOcB0/image_thumb%5B16%5D.png" width="600" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Figura 2. Versionamento local y comparaci&amp;#243;n entre 2 fuentes&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Depurador &lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;El nuevo depurador trae diversas mejoras en variables locales, call stack y otros, sin embargo una de las principales novedades es la visualizaci&amp;#243;n en &amp;#225;rboles. V&amp;#233;ase un ejemplo:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://lh6.ggpht.com/erickmueses/SJsH-O5OggI/AAAAAAAAACQ/P7HFQc-6830/image%5B25%5D.png"&gt;&lt;img height="440" alt="image" src="http://lh6.ggpht.com/erickmueses/SJsH_acZeyI/AAAAAAAAACU/f6kv3GeLDdE/image_thumb%5B19%5D.png" width="600" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Figura 3. Depurando una aplicaci&amp;#243;n y visualizando las variables en TreeView &lt;/p&gt;    &lt;p&gt;Tambi&amp;#233;n es posible configurar la barra de enrollamiento de la ventana de eventos y abrir separadamente cada &amp;#237;tem de la ventana de CPU, con un simples drag-and-drop presionando la tecla CTRL, la ventana se queda transparente, facilitando la lectura del c&amp;#243;digo durante la depuraci&amp;#243;n.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Refactoring &lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;Esta es una de las capacidades que m&amp;#225;s les gustan a los usuarios de Delphi 7, ya que a trav&amp;#233;s de los refactorings se pueden renombrar clases, variables y m&amp;#233;todos de manera que al hacer un cambio de nombre se cambien autom&amp;#225;ticamente todas las l&amp;#237;neas de c&amp;#243;digo en los que se hac&amp;#237;a referencia al nombre anterior. Mediante esta capacidad de refactoring es posible tambi&amp;#233;n cambiar los par&amp;#225;metros de clases, seleccionar parte del c&amp;#243;digo y generar un m&amp;#233;todo a partir del bloque seleccionado, tambi&amp;#233;n es posible mover m&amp;#233;todos de una clase a otra, entre muchas otras cosas.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Unidades de Prueba&lt;/strong&gt; &lt;/p&gt;    &lt;p&gt;La integraci&amp;#243;n con unidades de pruebas a trav&amp;#233;s de DUnit facilitan la creaci&amp;#243;n de m&amp;#233;todos y en general c&amp;#243;digo de pruebas que se usa para probar el c&amp;#243;digo de la propia aplicaci&amp;#243;n. Esto facilita la notablemente la prueba de las aplicaciones, pues es como si se tuviese un &amp;#8220;programa que prueba al programa&amp;#8221;.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;SQL Window - Query Builder&lt;/strong&gt; &lt;/p&gt;    &lt;p&gt;Ahora a trav&amp;#233;s del DataExplorer podemos construir querys visualmente utilizando el Query Builder, desde simples sentencias select hasta complejos querys utilizando joins.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://lh3.ggpht.com/erickmueses/SJsIAeTiJ5I/AAAAAAAAACY/WfuEbqZepJQ/image%5B34%5D.png"&gt;&lt;img height="441" alt="image" src="http://lh4.ggpht.com/erickmueses/SJsIB_GZnYI/AAAAAAAAACc/vXuE93kVc2k/image_thumb%5B26%5D.png" width="600" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Figure 4 SQL Window integrado a Query Builder&lt;/p&gt;&lt;/p&gt;&lt;/span&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://lh3.ggpht.com/erickmueses/SJsH1UPG1eI/AAAAAAAAACE/Oh-BlpjlSPo/s72-c/image_thumb%5B11%5D.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>PROCEDIMIENTOS Y FUNCIONES</title><link>http://programadelphi7.blogspot.com/2008/07/procedimientos-y-funciones.html</link><category>Utilidades</category><author>noreply@blogger.com (Erick Mueses)</author><pubDate>Tue, 15 Jul 2008 14:28:00 -0400</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3587987156694502915.post-4694690065953416024</guid><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz0CuP5CAbSV5MD4qXuJcv0UhsvmahhAeZNNl2O0IXAibnNAhlVX1Qwk18cEyvbnJ43f5IiS_wZvNnN8dlI3y5lO1iGWopjuwke2XMUZ5ilEN6SacL4bFIJ0RCOa1LOQwi6dXaiJcUbs8e/s1600-h/procedimientos.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 149px; height: 149px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz0CuP5CAbSV5MD4qXuJcv0UhsvmahhAeZNNl2O0IXAibnNAhlVX1Qwk18cEyvbnJ43f5IiS_wZvNnN8dlI3y5lO1iGWopjuwke2XMUZ5ilEN6SacL4bFIJ0RCOa1LOQwi6dXaiJcUbs8e/s200/procedimientos.jpg" alt="" id="BLOGGER_PHOTO_ID_5223312010227734242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Delphi, es un lenguaje estructurado, lo cual indica que los programas escritos en este lenguaje, pueden descomponerse en pequeños módulos que pueden ser llamados cuando los necesitemos. Estos módulos en Pascal se llaman funciones y se identifican mediante un nombre. Se declaran del siguiente modo: &lt;span id="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function nombre (argumento1: tipo; argumento2: tipo;...) : tipo;&lt;br /&gt;Begin&lt;br /&gt;      /Acciones a realizar/&lt;br /&gt;End;&lt;br /&gt;&lt;br /&gt;Donde nombre es el nombre que se asignará a la función, argumento1 y argumento2 son valores que pasan a la función y tipo es el tipo de valor que retornará como resultado. Por ejemplo, si queremos implementar en Pascal la función matemática: f(x, y) = (x * x + y) / x siendo x e y números enteros, se realizaría de este modo:&lt;br /&gt;&lt;br /&gt;Function f (x: integer; y: integer) : integer;&lt;br /&gt;Begin&lt;br /&gt;      F = (x * x + y) / x;&lt;br /&gt;End;&lt;br /&gt;&lt;br /&gt;Dicha función, se definirá una sola ocasión durante el programa, y únicamente será necesario hacer llamada a esta función mediante su nombre y sus valores dados entre paréntesis.&lt;br /&gt;&lt;br /&gt;a := f(1, 2); {llamada a f con x=1 e y=2}&lt;br /&gt;b := f(a, 3); {llamada a f con x=a e y=3}&lt;br /&gt;c := f(a, b) + f(1, 4);&lt;br /&gt;&lt;br /&gt;Los valores colocados entre paréntesis de la función, reciben el nombre de argumentos. Estos se comportan dentro de la función, como si se tratase de variables.&lt;br /&gt;&lt;br /&gt;PROCEDIMIENTOS&lt;br /&gt;&lt;br /&gt;Toda función que no retorna valores ningún valor, o que no realiza operaciones matemáticas o genera resultados numéricos, recibe el nombre de procedimiento. La programación estructurada, se basa en dividirse en pequeñas partes autosuficientes que realizan una tarea muy concreta, y que pueden ser invocados cuando se desee. Se puede realizar alguna función o tarea especifica que arroje información de modo no numérico, o sin realizar operaciones, es entonces cuando se utilizan los procedimientos.&lt;br /&gt;&lt;br /&gt;Un procedimiento se declara del mismo modo que una función, a diferencia que la palabra reservada Function cambia por Procedure y al final de la lista de argumentos no se pone ningún tipo de valor de respuesta, pues no arroja ningún resultado. Ejemplo:&lt;br /&gt;&lt;br /&gt;Program Ejemplo2;&lt;br /&gt;Procedure Di (mensaje: String);&lt;br /&gt;Begin&lt;br /&gt;      Showmessage(mensaje);&lt;br /&gt;End;&lt;br /&gt;Begin&lt;br /&gt;      Di (‘Mi nombre es: ’);&lt;br /&gt;      Di (‘David Osornio Fernández’);&lt;br /&gt;End;&lt;br /&gt;&lt;br /&gt;También es posible construir funciones o procedimientos que no tengas argumentos, pues pueden realizar una tarea concreta, no importando alguna otra cosa. Ejemplo:&lt;br /&gt;&lt;br /&gt;Program Ejemplo3;&lt;br /&gt;Procedure Saluda;&lt;br /&gt;Begin&lt;br /&gt;      Showmessage(‘Hola a todos’);&lt;br /&gt;End;&lt;br /&gt;Procedure Nombre;&lt;br /&gt;Begin&lt;br /&gt;      Showmessage(‘Mi nombre es David Osornio Fernández’);&lt;br /&gt;End;&lt;br /&gt;Procedure Despidete;&lt;br /&gt;Begin&lt;br /&gt;      Showmessage(‘Adiós a todos’);&lt;br /&gt;End;&lt;br /&gt;Saluda;&lt;br /&gt;Nombre;&lt;br /&gt;Despidete;&lt;br /&gt;End;&lt;br /&gt;&lt;/span&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz0CuP5CAbSV5MD4qXuJcv0UhsvmahhAeZNNl2O0IXAibnNAhlVX1Qwk18cEyvbnJ43f5IiS_wZvNnN8dlI3y5lO1iGWopjuwke2XMUZ5ilEN6SacL4bFIJ0RCOa1LOQwi6dXaiJcUbs8e/s72-c/procedimientos.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>SELECCIÓN MULTIPLE</title><link>http://programadelphi7.blogspot.com/2008/07/cuando-se-realiza-un-programa-es.html</link><category>Utilidades</category><author>noreply@blogger.com (Erick Mueses)</author><pubDate>Tue, 15 Jul 2008 14:21:00 -0400</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3587987156694502915.post-7097584395642235305</guid><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLCQdrzHl1ZsoD9_NeLJb7eW1swcKb_BBg3sH_1ya-CxVAzhvTJQ5Ugn6Cz9WzW3XsS8vv0HJQAQtAkxMKtHdmwC3C24LUEkn9qCP8WABc4hLKx_kv38fZZAlHBBiWLAGos35VPplYMMx5/s1600-h/intersection.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 125px; height: 125px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLCQdrzHl1ZsoD9_NeLJb7eW1swcKb_BBg3sH_1ya-CxVAzhvTJQ5Ugn6Cz9WzW3XsS8vv0HJQAQtAkxMKtHdmwC3C24LUEkn9qCP8WABc4hLKx_kv38fZZAlHBBiWLAGos35VPplYMMx5/s320/intersection.jpg" alt="" id="BLOGGER_PHOTO_ID_5223308894285613858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Cuando se realiza un programa, es frecuente encontrarse con alguna variable que según su valor realizara alguna acción. Esto se podría realizar con muchos If´s anidados, pero resultaria algo enredado, &lt;span id="fullpost"&gt;por ejemplo: Si se desea que cuando a tenga el valor 1, c tome el valor 10, cuando a tenga el valor 2, c tome el valor 15, cuando a tenga el valor 3, c tome el valor 20 y cuando no sea alguno de los 3 valores, entonces que c tome el valor 0:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If a = 1 then c := 10 Else&lt;br /&gt;&lt;br /&gt;If a = 2 then c := 15 Else&lt;br /&gt;&lt;br /&gt;If a = 3 then c := 20 Else&lt;br /&gt;&lt;br /&gt;c := 0;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Esta forma de tomar decisiones resulta muy poco ortodoxa. El lenguaje Pascal nos ofrece para dicho propósito otra forma mas fácil de hacerlo. Mediante la palabra reservada case of. La sintaxis de dicha instrucción es la siguiente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;case variable of&lt;br /&gt;&lt;br /&gt;valor1: acción1;&lt;br /&gt;&lt;br /&gt;valor2: acción2;&lt;br /&gt;&lt;br /&gt;....&lt;br /&gt;&lt;br /&gt;Else acción N;&lt;br /&gt;&lt;br /&gt;End;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Donde variable es el identificador de la variable que será comprobada y valor1, valor2... son los diferentes valores que puede tomar dicha variable. Si tomamos el problema anteriormente planteado, tendremos que la solución sería de este modo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;case a of&lt;br /&gt;&lt;br /&gt;1: c := 10;&lt;br /&gt;&lt;br /&gt;2: c := 15;&lt;br /&gt;&lt;br /&gt;3: c := 20;&lt;br /&gt;&lt;br /&gt;Else c:= 0;&lt;br /&gt;&lt;br /&gt;End;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLCQdrzHl1ZsoD9_NeLJb7eW1swcKb_BBg3sH_1ya-CxVAzhvTJQ5Ugn6Cz9WzW3XsS8vv0HJQAQtAkxMKtHdmwC3C24LUEkn9qCP8WABc4hLKx_kv38fZZAlHBBiWLAGos35VPplYMMx5/s72-c/intersection.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><title>ANIDAMIENTOS</title><link>http://programadelphi7.blogspot.com/2008/07/anidamientos.html</link><category>Utilidades</category><author>noreply@blogger.com (Erick Mueses)</author><pubDate>Tue, 15 Jul 2008 14:10:00 -0400</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3587987156694502915.post-8306233645833620461</guid><description>Es sabido que después de la palabra reservada Then se pueden ejecutar secuencias de instrucciones las cuales pueden ser de cualquier tipo, ahora bien, &lt;span id="fullpost"&gt;¿Es posible colocar un if dentro del bloque then de otro?. La respuesta es si, a estas sentencias de “If´s” encadenados se le denomina anidamiento.&lt;br /&gt;&lt;br /&gt;El punto clave es tomar en cuenta que cuando se coloquen anidamientos es recomendable colocar las instrucciones Begin y End entre Then y Else de este modo sabremos exactamente a que if pertenece cada Else. Ejemplo:&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;If a = 7 then&lt;br /&gt;&lt;br /&gt;Begin&lt;br /&gt;&lt;br /&gt;       If b = 2 then&lt;br /&gt;&lt;br /&gt;       c := 3&lt;br /&gt;&lt;br /&gt;       Else&lt;br /&gt;&lt;br /&gt;       c := 2&lt;br /&gt;&lt;br /&gt;End&lt;br /&gt;&lt;br /&gt;Else&lt;br /&gt;&lt;br /&gt;c := 1;&lt;br /&gt;&lt;/span&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Redondeo y dolores de cabeza</title><link>http://programadelphi7.blogspot.com/2008/07/redondeo-y-dolores-de-cabeza.html</link><category>Utilidades</category><author>noreply@blogger.com (Erick Mueses)</author><pubDate>Fri, 4 Jul 2008 12:54:00 -0400</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3587987156694502915.post-8099958065518407371</guid><description>&lt;div align="justify"&gt;&lt;span&gt;&lt;a href="http://lh4.ggpht.com/erickmueses/SG5Vml4ryPI/AAAAAAAAABg/yog0DCT8JjE/5908467redondeo%5B7%5D.gif"&gt;&lt;img height="134" alt="5908467redondeo" src="http://lh5.ggpht.com/erickmueses/SG5VoEHmwRI/AAAAAAAAABk/fOSArxm1-iI/5908467redondeo_thumb%5B5%5D.gif" width="113" align="left" border="0" /&gt;&lt;/a&gt; La clásica función Round de Delphi y las más recientes funciones RoundTo se proyectan sobre algoritmos de redondeo de la CPU y la FPU. De manera predeterminada, las CPU de Intel utilizan el redondeo bancario, que es también el tipo de redondeo que se suele encontrar en aplicaciones de hojas de cálculo.&lt;/span&gt; &lt;/div&gt;         &lt;span id="fullpost"&gt;   &lt;div align="justify"&gt;El redondeo bancario se basa en la suposición de que cuando se redondean números que residen exactamente entre dos valores (10s números ,5), a1 redondearlos arriba o abajo se aumenta o reduce estadisticarnente la cantidad total (en general de capital). Por este motivo, la regla del redondeo bancario indica que 10s números ,5 deberían redondearse arriba o abajo dependiendo de que el número (sin decimales) sea impar o par. De esta manera, el redondeo se equilibrara, a1 menos estadísticamente.  &lt;/div&gt;    &lt;p&gt;&lt;a href="http://lh3.ggpht.com/erickmueses/SG5Vp1f54jI/AAAAAAAAABo/YaMTK7-_Lmc/image%5B13%5D.png"&gt;&lt;img height="327" alt="image" src="http://lh4.ggpht.com/erickmueses/SG5VsFehiVI/AAAAAAAAABs/0YyHrGXKF1o/image_thumb%5B11%5D.png" width="383" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;El ejernplo de redondeo de la figura, dernuestra el redondeo bancario y el aritmetico.&lt;/p&gt;    &lt;div align="justify"&gt;     &lt;p&gt;El programa tambidn utiliza otro tipo de redondeo proporcionado por la unidad Math mediante la funcion SimpleRoundTo, que utiliza un redondeo aritmktico asimetrico. &lt;/p&gt;   &lt;/div&gt;    &lt;div align="justify"&gt;     &lt;p&gt;En este caso, todos 10s numeros ,5 se redondean a1 valor superior. Sin embargo, tal y como se recalca en el ejemplo de redondeo, la funcion no actua como se esperaria cuando se redondea hasta un digito decimal (es decir, cuando se pasa un segundo parametro negativo). En este caso, debido a 10s errores de representacion de 10s numeros de coma flotante, el redondeo recorta 10s valores; por ejemplo convierte 1,15 en 1,l en lugar del esperado 1.2. La solucion es multiplicar el valor por diez antes de redondear, redondearlos hasta cero digitos decimales, y despues dividirlo, como se muestra a continuacion:       &lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;   &lt;/div&gt;    &lt;p&gt;&lt;em&gt;(SimpleRoundTo ( d *10 , 0) / 10 )&lt;/em&gt;&lt;/p&gt; &lt;/span&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://lh5.ggpht.com/erickmueses/SG5VoEHmwRI/AAAAAAAAABk/fOSArxm1-iI/s72-c/5908467redondeo_thumb%5B5%5D.gif" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Ejecutar Una Aplicacion Externa a Delphi</title><link>http://programadelphi7.blogspot.com/2008/06/ejecutar-una-aplicacion-externa-delphi.html</link><category>Utilidades</category><author>noreply@blogger.com (Erick Mueses)</author><pubDate>Mon, 16 Jun 2008 11:24:00 -0400</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3587987156694502915.post-153237138895339532</guid><description>&lt;div align="justify"&gt;&lt;a href="http://lh4.ggpht.com/erickmueses/SFabqZcw5MI/AAAAAAAAABQ/gavE9BNeeXE/1209302228_driftff6829lz1%5B10%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="99" alt="1209302228_driftff6829lz1" src="http://lh4.ggpht.com/erickmueses/SFabrkGP5II/AAAAAAAAABc/6c7Pq6ux2YU/1209302228_driftff6829lz1_thumb%5B8%5D.jpg" width="142" align="left" border="0" /&gt;&lt;/a&gt; Algunas veces cuando estamos programando hemos pensado o tenido la necesidad de llamar una aplicacion&lt;span id="fullpost"&gt; ya creada que este en el directorio de nuestro computador.      &lt;br /&gt;      &lt;br /&gt;Pues aqui esta la solucion.       &lt;br /&gt;      &lt;br /&gt;Lo unico que nececitamos hacer es poner el siguiente codigo en el boton o evento desde el cual se quiera llamar la aplicacion:       &lt;br /&gt;      &lt;br /&gt;WinExec(PChar('c:\directorio\aplicacion.exe'),SW_SHOWNORMAL);       &lt;br /&gt;      &lt;br /&gt;Donde 'c:\directorio\aplicacion.exe' es el directorio deonde se encuentra ubicada la aplicacion que necesitamos o queremos llamar para lo que sea que fuese necesario.&lt;/span&gt;&lt;/div&gt;  </description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://lh4.ggpht.com/erickmueses/SFabrkGP5II/AAAAAAAAABc/6c7Pq6ux2YU/s72-c/1209302228_driftff6829lz1_thumb%5B8%5D.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Un Poco de Historia</title><link>http://programadelphi7.blogspot.com/2008/06/un-poco-de-historia.html</link><category>Historia</category><author>noreply@blogger.com (Erick Mueses)</author><pubDate>Fri, 13 Jun 2008 15:38:00 -0400</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3587987156694502915.post-8557895813899171517</guid><description>&lt;div align="justify"&gt;Algunas de las propiedades originales de Delphi que atrajeron fueron su enfoque orientado a objetos y basado en formularios, su compilador extremadamente rápido, su gran soporte para bases de datos, su estrecha integración con la programación para Windows y su tecnología de componentes. Pero el elemento mas importante era &lt;span id="fullpost"&gt;el lenguaje Pascal orientado a objetos, que es la base de todo lo demás.&lt;br /&gt;&lt;br /&gt;¡Delphi 2 era incluso mejor! Entre sus propiedades añadidas mas importantes estaban las siguientes: El Multi Record Object y la cuadricula para bases de datos mejorada, el soporte para Automatización OLE y el tipo de datos variantes, el soporte e integración totales de Windows 95, el tip0 de datos de cadena larga y la herencia de formulario visual. Delphi 3 añadió la tecnología Code Insight, el soporte de depuración DLL, las plantillas de componentes, el Teechart, el Decisión Cube, la tecnología WebBroker, los paquetes de componentes, los ActiveForms y una sorprendente integración con COM, gracias a las interfaces.&lt;br /&gt;&lt;br /&gt;Delphi 4 nos trajo el editor AppBrowser, nuevas propiedades de Windows 98, mejor soporte OLE y COM, componentes de bases de datos ampliados y muchas mas clases principales de la VCL añadidas, como el soporte para acoplamiento, restricción y anclaje de los controles. Delphi 5 añadió a este cuadro muchas mejoras en el IDE (demasiadas para enumerarlas aquí), soporte ampliado para bases de datos (con conjuntos de datos específicos de ADO e InterBase), una versión mejorada de MIDAS con soporte para Internet, la herramienta de control de versiones Teamsource, capacidades de traducción, el concept0 de marcos y nuevos componentes.&lt;br /&gt;&lt;br /&gt;Delphi 6 añadió a todas estas propiedades el soporte para el desarrollo multiplataforma con la nueva biblioteca de componentes para multiplataforma (CLX), una biblioteca en tiempo de ejecución ampliada, el motor para base de datos dbExpress, un soporte excepcional de servicios Web y XML, un poderoso marco de trabajo de desarrollo Web, mas mejoras en el IDE y multitud de componentes y clases.&lt;br /&gt;&lt;br /&gt;Delphi 7 proporciono mas robustez a estas nuevas tecnologías con mejoras y arreglos (el soporte de SOAP y DataSnap es lo primer0 en lo que puedo pensar) y ofrece soporte para tecnologías mas novedosas (como los temas de Windows XP o UDDI), pero lo mas importante es que permite disponer rápidamente de un interesante conjunto de herramientas de terceras partes: el motor de generación de informes RAVE, la tecnología de desarrollo de aplicaciones Web IntraWeb y el entorno de diseño ModelMaker. Finalmente, abre las puertas aun mundo nuevo al ofrecer (aunque sea como prueba) el primer compilador de Borland para el lenguaje PascallDelphi no orientado a la CPU de Intel, si no a la plataforma CIL de .NET.&lt;/div&gt;&lt;br /&gt;&lt;/span&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item></channel></rss>