Boletín Pascal #28
Los ejemplos completos de código fuente de este número están disponibles para descargar.
![]() |
![]() |
Boletín Pascal #28 - 20-NOV-2001 INDICE 1. UNAS PALABRAS DEL EDITOR 2. CÓDIGOS DE BARRA (y II) - Introducción - TCodeBar . DrawToCanvas . Propiedades - Como se usa "TCodeBar" - "TBits" - Dibujando barras - El programa de prueba - En el futuro 3. FOROS - Delphi - Kylix - Free Pascal - Componentes 4. NOTICIAS - Kylix . Características . Descargas 5. TRUCOS Y CONSEJOS - Determinando si una unidad lógica existe - Ocultando el cursor para todas las aplicaciones - Verificando si una característica de Windows existe. Oculte su aplicación en la Lista de Tareas - Realizando una operación larga cuando Windows se apaga 6. DELPHI EN LA RED - Artículos, trucos y consejos - Componentes, librerías y aplicaciones . Freeware . Shareware/Comercial - Tutoriales ________________________________________________________________________ 1. UNAS PALABRAS DEL EDITOR En esta edición me complace presentar la segunda y última parte del artículo Códigos de Barra de Alirio Gavidia. En la sección "Delphi en la Red", ahora a cargo de Dave Murray, hemos agregado un lugar para componentes, librerías y aplicaciones shareware o comerciales (además de freeware, por supuesto). Este boletín alcanzó los 4850 suscriptores, pero la verdad es que sentimos que este número es muy pequeño. Necesitamos de tu ayuda para que este boletín pueda continuar y crecer. La forma más sencilla en que puedes ayudarnos es votándonos en alguno de estos rankings para darle más visibilidad a nuestro sitio web y aumentar así el número de suscripciones a este boletín: http://www.sandbrooksoftware.com/cgi-bin/TopSite2/rankem.cgi?id=latium http://news.optimax.com/topdelphi/links.exe/click?id=70C517ECAE6E http://www.programmingpages.com/?r=latiumsoftwarecomenpascal http://www.top219.org/cgi-bin/vote.cgi?delphi&83 http://top100borland.com/in.php?who=20 http://top200.jazarsoft.com/delphi/rank.php3?id=latium http://213.65.224.200/cgi-bin/toplist.cgi/hits?Id=80 http://www.programacion.net/votar-enlace.php?id=474 http://www.lawebdelprogramador.com/buscar/enlace.php?id=615 http://213.65.224.200/cgi-bin/toplist.cgi/hits?Id=80 Son sólo unos segundos para ti que REALMENTE significan mucho para nosotros. También puedes ayudar reenviando el boletín a tus colegas o invitándolos a suscribirse: http://www.latiumsoftware.com/es/pascal/ Soñamos con llegar a los 10.000 suscriptores y ojalá puedas ayudarnos a convertir ese sueño en realidad. Saludos, Ernesto De Spirito eds2004 @ latiumsoftware.com ________________________________________________________________________ JfControls Lib. Multilenguaje. Multiapariencia. Skins. Privilegios. Más de 40 componentes integrados y personalizables. Múltiples problemas de programación resueltos. Administración centralizada de recursos. Para Delphi 3-7 y C++ Builder 3-6. http://www.jfactivesoft.com/spindex.htm ________________________________________________________________________ 2. CÓDIGOS DE BARRA (y II) Por Alirio A. Gavidia Introducción ============ La primera parte de este artículo versó sobre los códigos de barra tipo 39 y 128 de uso comercial común. En esta segunda entrega se incluirá y mostrara un conjunto de rutinas desarrolladas en Delphi que implementan parte de la funcionalidad de estos códigos. TCodeBar ======== Se anexa un proyecto donde se define "TCodeBar". Éste hereda parte de su funcionalidad desde "TGraphicControl", que es de donde parte "TCustomLabel". Al fin al cabo, este control funciona imitando cierta funcionalidad de un control "TLabel". La definición fundamental es: TCodeBar = class(TGraphicControl) : : public procedure Paint; override; constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure DrawToCanvas(aCanvas: TCanvas; ax, ay, EscX, EscY: Integer); property Price : string read FPrice write SetPrice; property Description : string read FDescrip write SetDescrip; property DisplayTextCode: boolean read FDisplayTextCode write SetDisplayTextCode; property CodeType : TCodeType read FCodeType write SetCodeType; property Caption : TCaption read FCaption write SetCaption; property CurrencyString : string read FCurrencyString write SetCurrencyString; end; DrawToCanvas ------------ procedure DrawToCanvas(aCanvas: TCanvas; ax, ay, EscX, EscY: Integer); El método anterior está orientado a la impresión del código de barras escalado en un "canvas" cualquiera (normalmente la impresora). Propiedades ----------- Como el uso principal de los códigos de barras es etiquetar productos se definen aquí propiedades para agregar texto que pueda ser leído por humanos. property Price: string; Para impresión del precio del producto. property Descrip: string; Para impresión de la descripción. property DisplayTextCode: Boolean; En ocasiones no se requiere nada más que el código de barras. property CodeType; Dos opciones, ct128 o ct39, según el tipo de código a utilizar. property Caption: TCaption; Es el texto que será convertido a código de barras. Para esta versión sólo pueden ser números. property CurrencyString: string; La denominación de la moneda. Se toma según la definición de Windows de la variable del mismo nombre. Como se usa "TCodeBar" ====================== De manera similar a una etiqueta, se puede crear y asignarle un "Parent" y las propiedades dimensionales que se requieran. Adicionalmente, las propiedades "CodeType", "Price" y "Description". Ejemplo: CodBar := TCodeBar.Create(Self); if RadioGroup1.ItemIndex=0 then CodBar.CodeType := ct128 else CodBar.CodeType := ct39; CodBar.Caption := Edit1.Text; CodBar.Left := Edit1.Left; CodBar.Top := Label2.Top; CodBar.Width := 250; CodBar.Height := 50; CodBar.Description := EdDescrip.Text; CodBar.Price := Edprice.Text; CodBar.Parent := Self; Para imprimir, "DrawToCanvas" provee una solución donde se da el "canvas" destino, posición y factores de escala: CodBar.DrawToCanvas(Prn.Canvas, SELeft.Value, SETope.Value + paso, SEX.Value div 2, SEY.Value) La escala es porcentual. "TBits" ======= Es una clase para manipulación de valores true/false, sobre todo cuando son más de 32 bits. Provee dos propiedades: "Size" y "Bits". La segunda permite acceso a cada bit como parte de un arreglo. He utilizado la clase "TBits" para almacenar la codificación del formato 128. Verán que resulta algo "incómodo" escribir 1166 valores uno a uno por este método. Sin embargo ahora puedo decir que alguna vez en mi vida utilicé esta clase. Con código 39 no se utilizó esta clase. En la siguiente versión, con soporte alfanumérico, posiblemente se abandonará el uso de "TBits" por otro medio. Dibujando barras ================ Las rutinas "DrawCode128" y "DrawCode39" son fundamentalmente iguales. Se determinan ancho y alto de cada elemento del código (Barra o espacio) y se procede a dibujar barras en el lugar que corresponda (se pudo dibujar los espacios en blanco, pero parece innecesario). En particular con el código 128 se requiere un carácter de paridad y uno de parada (que es más largo que lo usual). Para la paridad existe una rutina llamada "Getcheck128" que devuelve el número de carácter resultante. El programa de prueba ===================== Este programa de prueba fue desarrollado para una distribuidora con una amplia cantidad de productos. El código, descripción y precio es presentado como parte de la etiqueta. La cantidad es el número de veces que se imprime cada etiqueta. Los márgenes pueden ser almacenados entre sesiones como "Set 1" y "Set 2" a través de un menú accesible con el botón derecho del ratón. "English maincod.dfm" y "Español maincod.dfm" son versiones de "maincod.dfm" en cada idioma. Copie la que convenga en "maincod.dfm". Espero sea de utilidad. En el futuro ============ Se plantean varios cambios y mejoras sobre estas rutinas: - Soporte alfanumérico tanto para código 39 (falta incluir códigos) como para 128 (ya tiene los códigos). - Resolución del problema de códigos de longitud impar en código 128. El ejemplo completo con los códigos con un cero a la izquierda. Se presentará la opción de usar el código de "Shift". - Propiedad "autosize". - Eliminar la inicialización usando TBits para optar por un archivo de recursos. - Mantener el tamaño de cada carácter constante (no el ancho total como es ahora). ------------------- El código fuente que acompaña este artículo puede descargarse desde: http://www.latiumsoftware.com/descarga/p0023.zip ________________________________________________________________________ IBAdmin 3.22 - Complete Interbase SQL tool - Una poderosa herramienta de administración y desarrollo para manejar servidores y bases de datos Interbase. IBAdmin provee muchas capacidades para ayudarle en el diseño y gestión de su base de datos. Diseñe visualmente la estructura de su BD con el "Database Designer", administre usuarios y permisos con el "Grant Manager", o emplee el "SQL Debugger" para depurar procedimientos almacenados y triggers. Disfrute de una edición confortable de código con Code-Insight y Code Completion. >> http://www.sqlly.com/ibadmin2.htm ________________________________________________________________________ 3. FOROS Delphi ====== Me alegra ver que nuestro foro de consulta delphi-intermedio para programadores en Delphi de nivel intermedio sigue creciendo y que ya tiene aproximadamente 500 miembros, con un promedio de casi 30 mensajes diarios. Como siempre, te invito a que veas los últimos mensajes y compruebes que sus miembros hacen un gran esfuerzo por no dejar preguntas sin contestar, a quienes -ya que estamos- les agradezco por tanta entrega: http://espanol.groups.yahoo.com/group/delphi-intermedio/messages Para suscribirte, puedes hacerlo desde la web o -más fácil- por email: http://espanol.groups.yahoo.com/group/delphi-intermedio/join delphi-intermedio-subscribe@gruposyahoo.com Puedes configurar tu suscripción al foro para convertir o no los mensajes a formato HTML, o para no recibir los mensajes en tu email (podrás ver los mensajes en la web). Kylix ===== El foro de consulta para programadores en Kylix todavía no tiene mucho movimiento, pero también sigue creciendo a buen ritmo y ya cuenta con más de 170 miembros. http://espanol.groups.yahoo.com/group/GrupoKylix Puedes suscribirte desde la web o -más fácil- por email: http://espanol.groups.yahoo.com/group/GrupoKylix/join GrupoKylix-subscribe@yahoogroups.com Free Pascal =========== Algo similar ocurre con el foro para programadores en Free Pascal, que ha superado los 125 miembros. http://espanol.groups.yahoo.com/group/freepascal-es Como los otros, puedes suscribirte desde la web o -más fácil- por email: http://espanol.groups.yahoo.com/group/freepascal-es/join freepascal-es-subscribe@yahoogroups.com Componentes =========== Este es un foro para la búsqueda/recomendación de componentes de software (componentes VCL y CLX, objetos ActiveX, librerías DLL, objetos compartidos, etc.), así como utilidades, tutoriales, información, etc.: http://espanol.groups.yahoo.com/group/componentes De nuevo, puedes suscribirte desde la web o -más fácil- por email: http://espanol.groups.yahoo.com/group/componentes/join componentes-subscribe@yahoogroups.com ------------------ NOTA: Excepto temporalmente en el caso del foro Kylix (porque Kylix es bastante nuevo), los foros sobre programación no son para principiantes, sino para programadores de nivel intermedio/avanzado, aunque si eres un principiante puedes participar como "oyente" y ocasionalmente puedes preguntar para clarificar algún concepto clave. ________________________________________________________________________ 4. NOTICIAS Kylix 2 ======= Borland lanzó Kylix 2, la primer solución Web Services para Linux. Kylix 2 trae más compatibilidad con Delphi 6, incorporando características como BizSnap, WebSnap, DataSnap y soporte CORBA. * Comunicado de prensa - Nov 6 http://www.borland.com/about/press/2001/kylix2.html * Borland updates Kylix - Por Matthew Broersma http://news.zdnet.co.uk/story/0,,t269-s2097947,00.html * Luxury of Independence. Borland stands above the general web-services fray - Por John Pallatto internetworld.com/magazine.php?inc=110101/11.01.01nothingbutnet.html * Borland Revamps Kylix - Por Alan Zeichick http://www.sdtimes.com/news/041/story3.htm * Comunicado de prensa - Nov 6 http://www.borland.com/about/press/2001/k2_ships.html Características --------------- * Nuevas características en Kylix 2 http://www.borland.com/kylix/k2/newfeatures.html * Hoja de datos (PDF) http://www.borland.com/kylix/k2/k2_datasheet.pdf * Matriz de características (PDF) http://www.borland.com/kylix/k2/k2_featurematrix.pdf * Características y beneficios (PDF) http://www.borland.com/kylix/k2/k2_feaben.pdf Descargas --------- * Kylix 2 Enterprise Trial Edition http://www.borland.com/kylix/trial2/k2_entdown_steps.html * Kylix 2 Open Edition http://www.borland.com/kylix/trial2/k2_opendown_steps.html ________________________________________________________________________ 5. TRUCOS Y CONSEJOS Determinando si una unidad lógica existe ======================================== Puedes usar la API GetLogicalDrives para obtener las unidades lógicas presentes en el sistema. Esta función devuelve un valor de 32-bit donde los bits representan las unidades lógicas. Por ejemplo: +---------------------------------- bit 31 (bit más significativo) | +--- bit 0 (bit menos significativo) | | 00000000000000000000000000101101 | |||||||| | |||||||+--- 1 ==> Unidad A: presente | ||||||+---- 0 ==> Unidad B: ausente | |||||+----- 1 ==> Unidad C: presente | ||||+------ 1 ==> Unidad D: presente | |||+------- 0 ==> Unidad E: ausente | ||+-------- 1 ==> Unidad F: presente | |+--------- 0 ==> Unidad G: ausente | +---------- 0 ==> Unidad H: ausente | : : : +---------------------------- 0 ==> Unidad Z: ausente Para obtener la máscara de bits correspondiente a una unidad a fin de testear el resultado de GetLogicalDrives, podemos usar la siguiente expresión: 1 Shl (Ord(LetraUnidad) - Ord('A')) Por ejemplo, si LetraUnidad fuera 'D', el resultado de esta expresión sería: 1 shl (Ord('D') - Ord('A')) = 1 shl (68 - 65) = 1 shl 3 = 8 En binario: 00000000000000000000000000001000 Un And binario entre la máscara y el resultado de GetLogicalDrives será cero si el bit 3 no está encendido (es decir, si la unidad D: no es una unidad lógica válida). Muy bien entonces, vayamos a la función: uses Windows; function IsLogicalDrive(Drive: string): boolean; var sDrive: string; cDrive: char; begin sDrive := ExtractFileDrive(Drive); if sDrive = '' then Result := False else begin cDrive := UpCase(sDrive[1]); if cDrive in ['A'..'Z'] then result := (GetLogicalDrives And (1 Shl (Ord(cDrive) - Ord('A')))) <> 0 else Result := False; end; end; Llamada de ejemplo: if not IsLogicalDrive(Edit1.Text) then ShowMessage(Format('"%s" no es una unidad válida.', [ExtractFileDrive(Edit1.Text)])); Ocultando el cursor para todas las aplicaciones =============================================== La API ShowCursor se puede usar par ocultar/mostrar el cursor del ratón, pero esto sólo afecta nuestra aplicación. Si queremos ocultar el cursor para todas las aplicaciones, una forma de hacerlo es confinar el cursor en una posición fuera de los límites de la pantalla con la API ClipCursor: uses Windows; procedure rShowCursor(bShow: BOOL); var r: trect; begin if not bShow then begin // Ocultar r.Top := 0; r.Left := GetSystemMetrics(SM_CXSCREEN) + GetSystemMetrics(SM_CXCURSOR); r.Right := r.Left; r.Bottom := 0; ClipCursor(@r); SetCursorPos(0,0); end else begin // Restuarar ClipCursor(nil); SetCursorPos(GetSystemMetrics(SM_CXSCREEN) div 2, GetSystemMetrics(SM_CYSCREEN) div 2); end; end; Verificando si una característica de Windows existe - Oculte su aplicación en la Lista de Tareas ==================================================== Algunas funciones API de Windows pueden o no pueden estar presentes en su versión de Windows, pero detectar la versión de Windows no es la mejor manera de saber si una función está presente puesto que eso puede darnos un falso negativo si el usuario actualizó una DLL y la actuali- zación incluye la nueva función... Para comprobar si existe una función API, tenemos que cargar la librería DLL en donde se supone que la misma reside (llamando la API LoadLibrary) y después tenemos que obtener la dirección de la función (llamando a la API GetProcAddress), la que finalmente se utiliza para llamarla. Si GetProcAddress devuelve Nil, entonces la función no está presente, y si devuelve un valor distinto de Nil, entonces la función está presente, pero debemos considerar que no necesariamente está implementada (puede ser sólo un marcador de lugar y en tal caso si la llamamos obtendremos el código de error ERROR_CALL_NOT_IMPLEMENTED). En el siguiente ejemplo implementamos una función llamada RegisterAsService que intenta llamar la API RegisterServiceProcess para registrar/"desregistrar" nuestra aplicación como un servicio. La función devuelve True si tuvo éxito. function RegisterAsService(Active: boolean): boolean; const RSP_SIMPLE_SERVICE = 1; RSP_UNREGISTER_SERVICE = 0; type TRegisterServiceProcessFunction = function (dwProcessID, dwType: Integer): Integer; stdcall; var module: HMODULE; RegServProc: TRegisterServiceProcessFunction; begin Result := False; module := LoadLibrary('KERNEL32.DLL'); if module <> 0 then try RegServProc := GetProcAddress(module, 'RegisterServiceProcess'); if Assigned(RegServProc) then if Active then Result := RegServProc(0, RSP_SIMPLE_SERVICE) = 1 else Result := RegServProc(0, RSP_UNREGISTER_SERVICE) = 1; finally FreeLibrary(module); end; end; Nótese que el registrar nuestra aplicación como un servicio tiene el efecto secundario de ocultar nuestra aplicación en la Lista de Tareas (en el Administrador de Tareas de Windows). Llamadas de ejemplo: RegisterAsService(true); // Oculta nuestra aplicación del Adminis- // trador de Tareas de Windows registrándola como servicio RegisterAsService(false); // "Desregistra" la aplicación como servicio // y eso hace que vuelva a ser visible en el Administrador de Tareas NOTA: RegisterServiceProcess es una API Windows 9x/Me API. No está presente en Windows NT/2000, y no creo que haya una forma de ocultar una aplicación del Administrador de Tareas en estas versiones de Windows. Realizando una operación larga cuando Windows se apaga ====================================================== Cuando Windows se apaga, le da a las aplicaciones una cantidad limitada de tiempo para responder a la petición de apagado (el mensaje WM_QUERYENDSESSION). Si una aplicación no responde a la petición en ese tiempo, Windows normalmente muestra un cuadro de diálogo permitiendo que el usuario termine la aplicación por la fuerza, reintente el apagado o lo cancele. Si quisiéramos que nuestra aplicación realice un proceso cuando Windows se apaga, por ejemplo un respaldo (backup), que puede durar algunos segundos más de los que Windows está dispuesto a esperar, y no queremos que Windows muestre ese cuadro de diálogo, entonces lo que tenemos que hacer es cancelar el apagado, realizar nuestro proceso y finalmente, cuando hayamos terminado, decirle a Windows que se apague. Puesto que tenemos que responder a Windows antes de ejecutar nuestro proceso, el truco que utilizamos es establecer un temporizador (timer) -inicialmente apagado- para permitir que el proceso se ejecute unos milisegundos más adelante. Utilizamos una variable ProcessStatus para saber si tenemos que correr el proceso (0), si actualmente está corriendo (1) o si acaba de terminar (2), para saber así si podemos permitir que el sistema se cierre o no, y si tenemos que correr el proceso o no. interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; procedure Timer1Timer(Sender: TObject); private { Private declarations } procedure WMQueryEndSession (var Msg: TWMQueryEndSession); message WM_QueryEndSession; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} var EndSessionFlags: integer; ProcessStatus: integer; procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession); begin case ProcessStatus of 0: // Primera vez begin ProcessStatus := 1; // Evita entrar aquí de nuevo EndSessionFlags := Msg.Source; // Guarda la forma de cierre Msg.Result := 0; // Decimos a Windows que no termine Timer1.Enabled := True; // Habilita el timer para que podamos // realizar el proceso dentro de unos milisegundos end; 1: // Estamos procesando Msg.Result := 0; // Decimos a Windows que no estamos listos 2: // Hemos terminado de realizar el proceso begin ProcessStatus := 0; // Listo para la próxima (si corresponde) Msg.Result := 1; // Estamos listos. Se puede cerrar Windows end; end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Timer1.Enabled := False; // Apaga el Timer para que el evento no // se vuelva a ejecutar // Aquí realizamos nuestro largo proceso ShowMessage('Windows no se cerrará hasta que cierre este diálogo.'); ProcessStatus := 2; // Señal para indicar que hemos terminado ExitWindowsEx(EndSessionFlags, 0); // Cerramos Windows end; NOTA: En Windows NT/2000 se requieren privilegios para poder apagar el sistema. ________________________________________________________________________ 6. DELPHI EN LA RED Por Dave Murray Artículos, trucos y consejos ============================ * Delphi Database Programming Course - by Zarko Gajic Free online database programming course for beginner Delphi developers focused on ADO techniques. http://delphi.about.com/library/weekly/aa010101a.htm Two new chapters have been added in the last month: Chapter 18 "Data Modules" shows how to use the TDataModule class - central location for collecting and encapsulating data access objects, their properties, events and code. http://delphi.about.com/library/weekly/aa101601a.htm Chapter 19 "Handling database errors" introduces error handling techniques in Delphi ADO development. Find out about global exception handling and dataset specific error events. http://delphi.about.com/library/weekly/aa103001a.htm * What's New In Delphi 6? - by Brian Long A reviews the latest Delphi version http://www.thedelphimagazine.com/samples/1263/1263.htm * .NET complex types in a Delphi web service client - by John Kaster An article discussing prototype support for .NET web services that use Document Literal encoding in Delphi. http://community.borland.com/article/0,1410,27986,00.html * How to get the screensaver time-out value? - by Rainer Kümmerle http://www.swissdelphicenter.ch/en/showcode.php?id=854 * How to mount a share? (Kylix) - by Lukas Zurschmiede http://www.swissdelphicenter.ch/en/showcode.php?id=860 * How to create a cute gradient label - by Alain Gosselin http://www.delphi3000.com/articles/article_2794.asp * Give your menus a new look - by Vassilis Perantzakis This component gives your menus a customizable new look, a lot like the XP menus - only better! http://www.delphi3000.com/articles/article_2796.asp * Call AnimateWindow the safe way - by Adam Lanzafame AnimateWindow can enhance your GUI by adding special animations to your forms. However, the API is only valid from Win98 / 2000. This code shows you how to use it only when it is supported, without crashing and burning when it is not supported. http://www.delphi3000.com/articles/article_2799.asp * Converting from Windows > UNIX ASCII Text Files - by Lloyd Kinsella How do you convert between Windows and UNIX ASCII files? http://www.delphi3000.com/articles/article_2815.asp * Transparent Desktop Icon Text - by Lloyd Kinsella Annoyed at the icons on your Desktop with those damned colored text backgrounds, wouldn't it be nice if your wallpaper showed through? http://www.delphi3000.com/articles/article_2814.asp * TASPObject - ASP programming with Delphi - by Curtis W. Socha Introducing the TASPObject. See how to create a real application that incorporates the TASPObject - by creating an ASP page counter to see how many times your ASP has been called. http://delphi.about.com/library/bluc/text/uc110601a.htm * Help for component creators - by Pintér Gábor Create a help file for your component exactly like Delphi's help. With source code, examples, and installation instructions. http://community.borland.com/article/0,1410,26679,00.html * Using COM+ object pooling with Delphi 6 - by Vincent Parrett Delphi 6 introduces support for COM+ object pooling, which provides significant performance improvements under some circumstances. http://community.borland.com/article/0,1410,27568,00.html * Templates in Object Pascal - by Rossen Assenov Here's a quick guide to implementing C++ like templates in Delphi. http://community.borland.com/article/0,1410,27603,00.html * Paging Dr. WebSnap! - by Nick Hodges Using the TPagedAdapter component for fun and profit! http://community.borland.com/article/0,1410,27824,00.html * Implementing Professional Drag&Drop In VCL/CLX Apps - by Brian Long Simple intra-application drag and drop support is easy to add to a VCL/CLX application. However, customizing the operation, for example mouse sensitivity, info sent along with the operation, mouse cursor, the associated drag image, etc... All these things take more work. http://www.blong.com/Conferences/BorCon2001/DragAndDrop/4114.htm * VCL Sourcery - by Brian Long Very few Delphi Developers know the VCL source code like the back of their hand. Take a leisurely stroll through the VCL source code, removing its mystique and seeing what insights we can gain. www.blong.com/Conferences/BorConUK2001/VCLSourcery/VCLSourcery.htm * An Introduction to Kylix Open Edition - by Ray Lischner Explore Kylix Open Edition by covering topics such as selecting the Linux distribution, installation, FreeCLX issues, dbExpress, licensing, and more. www.delphimag.com/features/2001/11/di200111rl_f/di200111rl_f.asp * Media Player Autorepeat Function - by Cesario Lababidi How to write an Autorepeat Function for Mediaplayer? http://www.delphi3000.com/articles/article_2792.asp * Debugging With More Than Watches And Breakpoints - by Brian Long or How To Use The CPU Window. A BorCon UK 2001 and DCon 2001 paper. http://www.blong.com/Conferences/DCon2001/Debugging/Debugging.htm * Delphi and C++Builder Tips and Techniques - by Brian Long A BorCon 2001 paper of IDE/RTL/VCL/ObjectPascal Tips. It focuses mainly on how to be more productive within the Delphi, C++Builder and Kylix IDEs. http://www.blong.com/Conferences/BorCon2001/Tips/2106.htm * Access rights in WebSnap - by Nick Hodges How to limit access to specific pages based on a user access rights. http://community.borland.com/article/0%2C1410%2C27777%2C00.html * A database-enabled Web user list - by Jimmy Tharpe For most of us, user validation data needs to be stored in a database. Fortunately, writing a component to encapsulate this functionality is easy. (Delphi 6) http://community.borland.com/article/0%2C1410%2C27710%2C00.html * How can I get the printers installed? - by Josep Lainez Do you want to get your printer list without using the printer object? Let's see what's in the Windows registry. http://www.delphi3000.com/articles/article_2779.asp * Draw on DeskTop - by Master Tavi How to draw on DeskTop? http://www.delphi3000.com/articles/article_2773.asp * Windows Messages? - by Master Tavi How can I use Windows Message and what are they? This article explains the basics of windows messages and includes a list of the most commonly used Windows messages. http://www.delphi3000.com/articles/article_2772.asp * How to search a file for specified text? - by P. Below http://www.swissdelphicenter.ch/en/showcode.php?id=847 * How to write data directly to the printer port? - by Ramon Schenkel http://www.swissdelphicenter.ch/en/showcode.php?id=830 * How to convert TDateTime to Unix Timestamp? - by Thomas Greiner http://www.swissdelphicenter.ch/en/showcode.php?id=844 * InfoWorld interview with Borland CEO Dale Fuller who talks about competing with Microsoft for the hearts and minds of developers. http://www.infoworld.com/articles/hn/xml/01/10/19/011019hnfuller.xml * Optimizing Delphi Code - by Zarko Gajic How to make sure that the Murphy's law: "Any program will expand to fill available memory" does not apply to your Delphi applications. http://delphi.about.com/library/weekly/aa102301a.htm * Delphi 6 XML Document Programming - by Dr.Bob This is the first in a series of articles about Delphi 6 XML support starting off with XML Document Programming in Delphi 6. http://www.drbob42.com/examines/index.htm * Floating Menus, Etc. - by Bruno Sonnino How to put a menu in a toolbar so it can be detached and moved around.Plus: Setting Tab Stops in Memo and RichEdit Components. www.delphimag.com/features/2001/11/di200111bs_f/di200111bs_f.asp * User-modifiable DBGrids - by Ron Nibbelink How to provide users with highly versatile DBGrid components which can have their appearance changed at run time. www.delphimag.com/features/2001/11/di200111rn_f/di200111rn_f.asp * How to read / write a string to / from the serial port http://www.swissdelphicenter.ch/torry/showcode.php?id=841 * How to use the AnimateWindow function - by Simon Grossenbacher http://www.swissdelphicenter.ch/torry/showcode.php?id=838 * How to create an appointment in MS Outlook - by Mike Shkolnik http://www.delphipages.com/tips/thread.cfm?ID=111 * How to count words in a memo - by Ricardo Arturo Cabral Mejia http://www.delphipages.com/tips/thread.cfm?ID=109 * How to check if the BDE is installed - by Macroline Software http://www.delphipages.com/tips/thread.cfm?ID=106 * Delphi 6 Code Completion missing feature - by Brian Long How to enable an excellent new Code Completion feature in Delphi 6 http://community.borland.com/article/0,1410,27913,00.html * Is my CPU branded? / Extended CPUID How to use the extended CPUID instruction to retrieve the name of the processor from newer AMD (K5 Model 1/2/3, K6 Model 6/7/8, K6 III Model 9, Athlon & Duron) and Intel (P4) processors. http://www.delphi3000.com/articles/article_2718.asp * Exception Logger A simple way to record exceptions in a log file as well as displaying a custom error message. http://www.delphi3000.com/articles/article_2716.asp * How to add a gague to a status bar How to add a gague or any other component to a status bar. http://www.delphi3000.com/articles/article_2728.asp * How to get all table names in a database How to get all table names in a database with or without an alias. http://www.delphi3000.com/article.asp?ID=2754 * How to get BIOS date and version under Win 9X/Me/NT/2k How to get BIOS date and version under Win 9X/Me/NT/2k and how to read multi-string values from the registry. http://www.delphi3000.com/articles/article_2763.asp * Accessing Web Services from a URL How to access web services from a Delphi application. http://www.delphi3000.com/articles/article_2757.asp Componentes, librerías y aplicaciones ===================================== Freeware -------- * Orcka's Component Suite contains over 25 freeware components to aid in RAD. Most components come with demo applications and all of the source code is available. Components include: TOrckaAddinManager, TOrckaSpellChecker, TOrckaMap, TOrckaScreenSaver, TOrckaLabelEdit, TOrckaRuler, TOrckaVersionInfo, TOrckaButtonEdit, TOrckaTrayIcon, TOrckaFontButton, TOrckaLibraryLoader, TOrckaWebLabel. http://www.orcka.com/ * Synapse Serial Port Synchronous Library v.3.0 - by Lukas Gebauer Support for communicating on serial ports in blocking mode, high speed communication, same communication mechanism used in Synapse TCP/IP library, software and hardware handshake and more. http://www.ararat.cz/synapse * KDialControl An additional visual component for Kylix, encapsulates Dial Qt widget. http://www.mtu-net.ru/aborovsky/uk/progren.htm Shareware/Comercial ------------------- * CoolControls v. 3.03b, 23-Jul-2001, 5Mb - For Delphi 2-6 and BCB 1-5 Award winning package of 60+ highly advanced components and classes. Covers system, GUI and database programming, and original components. Forms of any shape, SKINS and TRANSPARENCY for ALL controls and forms, buttons of various shapes, flat borders, animation, original controls, powerful list and comboboxes, 3D view for most controls with text, multiline string grids with custom colors and fonts for cells, scrolling text, system level components. http://www.cooldev.com/coolcontrols.html * CoolMenus v. 3.08, 14-Sep-2001, 1.8Mb - For Delphi 2-6 and BCB 1-5 Award winning package that provides you with the way to create the most advanced Windows menus. CoolMenus, especially Multimedia edition has some unique features you will not find in any other menu related packages on the market. Native Delphi code, fast speed and helpful design windows are the reasons of CoolMenus popularity. http://www.cooldev.com/coolmenus.html * AppControls v 2.3.6, 01-Nov-2001 - For Delphi 2-6 and BCB 3-5 Advanced Application Controls is a set of 50+ top quality multipurpose components for Delphi and BCB. The package contains everything you need to add neat and, more important, truly professional appearance for your software, making development of great interfaces really rapid. All for those you usually spent days or weeks of hard coding, now you will be able to make for a few minutes of mouse clicking. :-) http://www.appcontrols.com/appcontrols.html * ConfigTreeView v. 1.6, 16-Oct-2001, 342Kb - For Delphi 3-6 ConfigTreeView is used to adjust the advanced options of an application, similar to the one seen in the Options dialog of MSIE. ConfigTreeView is designed for this particular purpose, adding only a very small overhead to your executables. It provides methods for loading and storing the settings. Ver 1.6 supports Windows XP themes! http://www.choosepill.com/components/cpcctree.htm Tutoriales ========== * Delphi-Dolphin Will guide you through basic topics, such as form + menu design, to more advanced areas including databases, COM and customizing Delphi components. Aims to provide help and advice for budding Delphi novices & experts alike, through tutorials & articles. Includes new tutorials from Project Jedi's Jedi-Dolphin initiative. http://www.delphi-dolphin.com/ * Delphi COM Essentials - by Binh Ly Including: building a COM Client application, building a COM Server application , building COM components. http://www.techvanguards.com/stepbystep/comdelphi/ ________________________________________________________________________ Si no has recibido el archivo con el código fuente completo de los ejemplos que se presentan en este boletín, puedes descargarlo de la siguiente dirección: http://www.latiumsoftware.com/descarga/p0028.zip ________________________________________________________________________ Página principal: http://www.latiumsoftware.com/es/pascal/index.php Página del grupo: http://espanol.groups.yahoo.com/group/boletin-pascal/ Para suscribirse / apuntarse: boletin-pascal-subscribe@gruposyahoo.com Para cancelar / removerse: boletin-pascal-unsubscribe@gruposyahoo.com Para reportar problemas con la suscripción: eds2004 @ latiumsoftware.com ________________________________________________________________________ Este boletín se provee "TAL Y COMO ESTA", sin garantía de ninguna clase. Su uso implica la aceptación de nuestros términos de licencia y de la ausencia de garantía que puedes leer en nuestro sitio web. Allí también encontrarás una nota sobre marcas registradas. Te animamos a que redis- tribuyas este boletín, siempre y cuando lo hagas en forma completa (incluyendo la información de copyright), sin modificaciones y de manera gratuita. Los artículos son copyright de sus respectivos autores y se reproducen aquí con el permiso de los mismos. ________________________________________________________________________ Latium Software http://www.latiumsoftware.com/es/index.php Copyright (c) 2001 por Ernesto De Spirito. Todos los derechos reservados ________________________________________________________________________ |
Los ejemplos completos de código fuente de este número están disponibles para descargar.
![]() |
¿Errores? ¿Omisiones? ¿Comentarios? Por favor contáctanos!






