Tu aplicación en el systray con un clic

Investigando las utilidades de la suite "ABF components", he comprobado que tienen un componente llamado TabfTrayIcon que encapsula el código necesario para poner el icono de vuestra aplicación en el Systray.

Para ello arrastrar el componente "TabfTrayIcon" al form de vuestro programa y poner las siguientes propiedades a True.

MinimizeOnStart:=true;

MinimizeToTray:=true;

Así de fácil...

Esto lo agradecerán los usuarios de Delphi 7

Links relacionados:

- Componentes ABF

- Nunca ha sido tan fácil utilizar los threads


Nunca ha sido tan fácil utilizar los threads

.
La suite VCL "abfcomponents" incorpora un componente llamado TabfThreadComponent que encapsula el objeto tThread que simplifica enormemente la programación con hilos.

Para utilizarlo instalar la suite como se hace habitualmente y arrastrar el componente anterior a vuestro form.

Incorpora 4 eventos: OnException, OnExecute, OnTerminate, OnFinish, pues bien para ejecutar un prodimiento cualquiera en un thread simplemente hay que colocarlo en el evento OnExecute, así de fácil y nos olvidamos de definir el thread y demás historias, ya que eso lo hace el componente por nosotros.

Definición del evento OnExecute:

procedure TForm1.abfThreadComponent1Execute(Sender: TObject);
begin
// incluir aquí la llamada al procedimiento que hayamos definido en nuestra unit
end;
Y para lanzar el hilo teclear:
abfThreadComponent1.Execute;

Dado que no he encontrado mucho código en internet, si mis estimados lectores pueden postear código o indicar alguna web que lo contenga sería de agradecer y muy útil para todos.


Link:

Ejecutar directx con Delphi

Excelente post que muestra cómo ejecutar directx dentro de vuestras aplicaciones. Prefiero no copiarlo íntegro por su gran extensión, pero sin duda vale la pena leerlo con atención ya que explica con todo detalle y con ejemplos cómo se hace.
DirectX es un conjunto de APIs creadas para facilitar la programación multimedia. La última versión es la 10 incluida en Windows Vista.
En la próxima versión (la 11) se incluirá una nueva tecnología de computación de shaders para permitir que la GPU no sea solamente usada para gráficos 3D y así puedan los desarrolladores tomar ventaja de las tarjetas gráficas como procesadores en paralelo.
Al final del post deja para su descarga el código fuente, el ejecutable y una captura del ejecutable.

Link:
http://www.clubdelphi.com/foros/showthread.php?t=61992

10 trucos para optimizar el código en Delphi

1) Mantén el código limpio, usa nombres de variables significativos (no uses button1, edit1), utiliza en su lugar sMensaje, sNombre, iPrecio.
Los nombres de las constantes son en mayúsculas (iIMPUESTO, sCONDICION)
2) Mantén la directiva {$O+} (or {$Optimización On})
3) Puedes compilar tus programas sin los paquetes run-time. Pero si quieres distribuir tu aplicación necesitarás de esas dll's.
4) No crees todos los forms al arrancar el programa, en vez de eso constrúyelos dinámicamente.
5) Utiliza las funciones del API de Windows en vez de crearlas tú mismo, generalmente son mucho más rápidas
6) Cuando incluyas imágenes en tus programas optimízalas primero (Puedes convertirlas al formato gif para ahorrar espacio)
7) Si usas una o dos funciones de una unidad no la incluyas en la sección "unit" de tu programa. Esto evitará que Delphi añada al ejecutable todas las rutinas de esta unidad. (Es mejor usar Windows.CreateDirectory, que utilizar CreateDirectory y añadir "Windows" en la sección "Unit"
8)En vez de utilizar componentes no-visibles es mejor incluir su código en el programa. No existe necesidad de usar un componente que muestra un directorio cuando se puede hacer con unas pocas líneas de código.
9) Si tienes una función crítica deberías ir con cuidado. Lo que parece rápido en tu equipo puede no serlo en otros PC's.
10) Generalmente los programas tienden a hacer cálculos rudimentarios. Si simplificas tu código para utilizar las mejores funciones optimizarás tu código. Por ejemplo en el tema de búsquedas es mejor usar búsquedas binarias que lineales.

Detectar inactividad en el sistema

Aquí os dejo un programa que he realizado para apagar la pantalla del ordenador cuando se detecte inactividad a nivel del sistema.
Para ello he utilizado la función GetLastInputInfo presente en el WinAPI desde Windows 2000 que devuelve el tiempo desde el último evento de entrada en el sistema en la sesión del usuario actual.
El siguiente código arranca un tTimer al inicio y cuando detecta que el usuario no ha tecleado nada y tampoco ha movido el ratón procede a apagar la pantalla pasados 10 segundos.
UNIT Unit1;

INTERFACE

USES
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

TYPE
TForm1 = CLASS(TForm)
Button1: TButton;
Timer1: TTimer;
Label1: TLabel;
PROCEDURE Timer1Timer(Sender: TObject);
PROCEDURE FormCreate(Sender: TObject);
PROCEDURE FormDestroy(Sender: TObject);
PRIVATE
{ Private declarations }
PUBLIC
{ Public declarations }
END;

VAR
Form1: TForm1;
MonitorApagado: boolean;

IMPLEMENTATION

{$R *.dfm}

//Función que detecta la inactividad del sistema
FUNCTION SecondsIdle: DWord;
VAR
liInfo: TLastInputInfo;
BEGIN
liInfo.cbSize := SizeOf(TLastInputInfo);
GetLastInputInfo(liInfo);
Result := (GetTickCount - liInfo.dwTime) DIV 1000;
END;

PROCEDURE apagarMonitor;
BEGIN
SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 1);
END;

PROCEDURE TForm1.Timer1Timer(Sender: TObject);
VAR
segundos: integer;
BEGIN
segundos := SecondsIdle;
label1.Caption := IntTostr(segundos);
IF segundos > 10 THEN
BEGIN
IF NOT MonitorApagado THEN
BEGIN
ApagarMonitor;
MonitorApagado := true;
END;
END;
END;

PROCEDURE TForm1.FormCreate(Sender: TObject);
BEGIN
MonitorApagado := false;
timer1.enabled := true;
END;

PROCEDURE TForm1.FormDestroy(Sender: TObject);
BEGIN
timer1.enabled := false;
END;

END.

Relacionados:
wake on lan 
Apagar monitor pulsando una tecla
Apagar servidor de red cuando se apaguen los terminales

La historia de Delphi

Navegando por la red me fijé en este link (en inglés) donde se pueden encontrar documentos históricos de Delphi 1, código fuente, Turbo Pascal 1.0, Turbo C++ .
Recuerdan hace años cuando cada vez que aparecía una versión nueva de Turbo Pascal en su publicidad indicaba que compilaba un 30% más rápido que su predecesor y que incluso se publicó un comic llamado "Turboman" donde mostraba las bondades de este entorno de programación.
Por cierto ¿saben quién es Frank Borland? o de donde procede el nombre "Delphi", en resumen una página interesante para los interesados en la historia de este espectacular IDE.

http://dn.codegear.com/museum

Utilizar Flickr con Delphi


Para los interesados en utilizar Flickr con Delphi para compartir imágenes, aquí tienen Rawflickr.

Es un conjunto de funciones locales que permiten acceder al API de Flickr, proporcionando un set de clases para cada uno de los métodos del API (blogs, fotos..).
También tienen un blog donde encontrarán documentación y ejemplos de código.

Link:

Blog:
http://rawflickr.blogspot.com/

Documentación del API:

Utilizar Amazon S3 (Simple Storage Service)



Amazon S3 (Simple Storage Service) es un sistema de almacenamiento seguro de archivos que utiliza la infraestructura que Amazon tiene repartida por Internet. Se paga por el espacio utilizado y por la transferencia de datos siendo el coste el siguiente:

$0.18 por GB mensual de almacenamiento para los 50 primeros TB y $0.10 por cada GB de datos transferidos.

El tamaño máximo de archivo es de 5Gb y se pueden asignar derechos de acceso indicando si puede ser el archivo puede ser público o privado.

Amazon publica ejemplos para utilizar S3, pero ninguno de ellos en Delphi, sin embargo en la red encontré el siguiente código en Delphi por si os puede ser de utilidad.


Antes hay que instalar las librerías gratuitas "Synapse"

Computación en Grid con Delphi (librería hxgrid)


Aquí tenéis una librería - hxgrid- para C++ y Delphi que se utiliza en computación en grid, lo que permitirá ejecutar tareas en diferentes equipos con Windows XP utilizando el tiempo ocioso de las CPUs.
Este cluster software está formado por 3 partes:
1) Coordinador - que será instalado en una workstation, siempre estará online y será responsable del mantenimiento de los recursos y distribución de tareas al resto de los PCs.
2) Agentes -Que serán instalados en cada uno de los PCs del grid y permitirán usar el tiempo ocioso de la CPU
3) Usuarios - Se conectarán al Coordinador para obtener la lista de agentes para posteriormente conectar sólo con los agentes para obtener la lista de tareas a procesar
Link:

Cálculo parabólico


Delphi se puede utilizar para desarrollos matemáticos, como el tema que os presento ahora, en el que se muestra de una forma gráfica las propiedades de las parábolas.
Programa los siguientes temas:
-Ecuación de una parábola dado el vértice y su foco.
-Punto de intersección B de un rayo AB con la parábola.
-Línea tangente a la parábola CBD en el punto B.
-Ángulo de incidencia del rayo AB respecto a la recta tangente.
-Rayo reflejado desde el punto B hasta el eje FV de la parábola.


Link:
http://www.delphiforfun.org/Programs/Download/ParabolicReflectionSource.zip

Crear un captcha con Delphi



Captcha es el acrónimo de Completely Automated Public Turing test to tell Computers and Humans Apart (Prueba de Turing pública y automática para diferenciar a máquinas y humanos).
Se suele usar en páginas web en las que se solicita información que se quiere garantizar que ha sido tecleada por un humano, ya que se presume que las máquinas son incapaces de leer el captcha.
Aquí tienen el código en Delphi para generar captchas

Otra forma de hacerlo:
procedure TForm1.letrasAnguladas(c : string; angulo : integer; nextPos : Integer);
var
   logfont:TLogFont;
   font: Thandle;
begin
   LogFont.lfheight:=30;
   logfont.lfwidth:=10;
   logfont.lfweight:=900;

   LogFont.lfEscapement:=angulo;
   logfont.lfcharset:=1;
   logfont.lfoutprecision:=OUT_TT_ONLY_PRECIS;
   logfont.lfquality:= DEFAULT_QUALITY;
   logfont.lfpitchandfamily:= FF_SWISS;
   logfont.lfUnderline := 0;
   logfont.lfStrikeOut := 0;

   font:=createfontindirect(logfont);

   Selectobject(Image1.canvas.handle,font);

   SetTextColor(Image1.canvas.handle,rgb(0,180,0));
   SetBKmode(Image1.canvas.handle,transparent);

   Image1.canvas.textout(nextPos,Image1.Height div 3,c);
   SetTextColor(Image1.canvas.handle,rgb(Random(255),Random(255),Random(255)));
   deleteobject(font);
end;

//se llama así
for vX := 1 to Length(strCaptcha) do
      letrasAnguladas(strCaptcha[vX],Random(600)+1,25*vX-15);

//añadimos algunas líneas
  for i := 0 to 15 do begin
    Image1.Canvas.Pen.Color := Random(100000);
    Image1.Canvas.MoveTo(random(Image1.Width), random(Image1.Height));
    Image1.Canvas.LineTo(random(Image1.Width), random(Image1.Height));
  end;
y obtenemos esto: enter image description here


Relacionados:
Utilizar redes neuronales para resolver captchas

Redes neuronales con Delphi

Os presento una página donde muestra cómo se implementa en delphi una red neuronal utilizando backpropagación como algoritmo de aprendizaje.


Una red neuronal la forman varias capas, una de ellas es la capa de entrada, otra la capa de salida y una o varias capas ocultas. Cada capa se interconecta con la previa desde sus nodos (neuronas) simulando de alguna manera los sistemas neuronales biológicos.


La salida viene dada por tres funciones:

-función de propagación: Sumatorio de cada entrada multiplicado por el peso de su interconexión.
-función de activación: Suele ser la salida de la función de propagación
-función de transferencia: Acota la salida entre [-1,1] (en este caso utiliza la tangente hiperbólica - tanh-, aunque en otros casos se utiliza la función sigmoidea)


Link:
http://www.ibrtses.com/delphi/neuralnets.html


Links relacionados:
http://delphimagic.blogspot.com/search/label/Neural%20net


Extracción segura de un pendrive


Para los interesados en saber cómo extraer un pendrive de forma segura con Delphi, aquí os dejo un documento con varias funciones que os resolverán esta tarea.
function OpenVolume(ADrive: char): THandle;
function LockVolume(AVolumeHandle: THandle): boolean;
function DismountVolume(AVolumeHandle: THandle): boolean;
function PreventRemovalOfVolume(AVolumeHandle: THandle; APreventRemoval: boolean): boolean;
function AutoEjectVolume(AVolumeHandle: THandle): boolean;
function EjectVolume(ADrive: char): boolean;



También se puede extraer el pendrive mediante llamada a la función HotPlugEjectDevice de la librería hotplug.dll de Windows.

Su definición en Delphi es:
function HotPlugEjectDevice(hwndParent: Cardinal; lpDeviceInstanceId: PWideChar): LongBool; stdcall external 'hotplug';

El código con WinExec es el siguiente:
WinExec(PChar('c:\windows\system32\rundll32 hotplug.dll,HotplugEjectDevice '),SW_SHOWNORMAL);

y para hacer aparecer la ventana de desconectar hardware sería:
WinExec(PChar('c:\windows\system32\rundll32 shell32.dll,Control_RunDLL hotplug.dll'),SW_SHOWNORMAL);

Crear un antivirus con Delphi



Aquí tenéis un interesante artículo con código fuente en Delphi incluido, sobre cómo usar el interface de Microsoft IOfficeAntiVirus para desarrollar un antivirus para Microsoft Office.

Es un componente ActiveX y según el fabricante permitirá a los programadores desarrollar aplicaciones que comprueben si existen virus en los documentos de MSOffice antes de abrirlos. Inicialmente se preparó para IE5 y por falta de tiempo no he podido comprobar si funciona con la versión actual de IE, aunque de todas formas es un punto de partida muy interesante para desarrollar software antivirus y ver cómo funciona este tipo de aplicaciones.


Link:




Leer cabeceras de archivos de mp3 con Delphi


Aquí os dejo un componente (TAudioInfo) que extrae información de las cabeceras de archivos mp3 (MPEG 1, 2 Layers I, II, III) y de archivos con tags ID3V1.1.

También puede leer el formato Xing VBR (bitrate variable)

Freeware con código fuente Delphi incluido


Link:

Formato de cabeceras MP3: