El juego del Tangram con Delphi

.


El Tangram es un juego de origen chino que consiste en formar figuras con las siete piezas que lo componen sin solaparlas entre sí. El juego se remonta a los años 618 a 907 de nuestra era, época en la que reinó en China la dinastía Tang de donde se derivaría su nombre.
En la siguiente página tienen el código fuente en Delphi que incorpora varios niveles de dificultad. Muy recomendable para aquellos que quieran pasar un rato entretenido solucionando los retos que nos plantea el programa.

Link de la página (inglés)

Simular un clic sobre un link de una página web

.

Para recuperar los links de una página html es necesario abrir una instancia de Internet Explorer y utilizar las funciones OLE como muestra el siguiente ejemplo:

procedure ListarLinks(List: TStrings; IEApp: OLEVariant; aURL:string);
var
IEApp: OLEVariant;
nbLinks,i:Integer;
begin
//Si el objeto OLE no ha sido creado
if(VarIsEmpty(IEApp))then
begin
//crear el objeto
IEApp := CreateOleObject('InternetExplorer.Application');
//hacerlo visible
IEApp.Visible := true;
//Abrir la página especificada
IEApp.Navigate(aURL);
end;

//Esperar a que la página sea completamente cargada
// READYSTATE_COMPLETE = 4
while Cardinal(IEApp.readyState) <> 4 do sleep(1000);

//Recuperar el nombre de los links
nblinks := Cardinal(IEApp.Document.links.length);
//Volcar los links en un tString
List.Add(Format('Nombre de los links = %d',[nblinks]));

for i := 0 to nblinks - 1 do
Self.MemoLog.Lines.Add(string(IEApp.Document.links.item(i).href));
end;

Para simular un clic hacer lo siguiente:

procedure ClicSobreLink(LinkIndex:Integer);
begin
IEApp.Document.links.item(LinkIndex).click;
end;

Transformación de un metafile Windows


Esta unidad contiene procedimientos de transformación de un metafichero Windows (son ficheros de imágenes que contienen la descripción vectorial de un diseño.) Tienen la ventaja de poder ser redimensionados sin perder calidad, por contra su modificación en memoria es muy complicada.
Para utilizarlos hay que pasar el handle de un TMetafile al procedimiento indicando las transformaciones deseadas, con ciertas excepciones, por ejemplo en el caso de que el fichero contenga texto, en cuyo caso las modificaciones se ignoran.

Link de descarga


Leer las pistas de un CD de audio

.


Los ficheros ".cda" describen las pistas contenidas en un CD audio. Estos ficheros están visibles en el explorador de Windows cuando abres una ventana correspondiente a un CD.
No existe una función del API que permita consultar el contenido de estos ficheros pero podéis utilizar las procedimientos contenidos en el siguiente fichero:

Autor: Pierre Castelain
Link de descarga


Relacionados:
Osciloscopio con la tarjeta de sonido
Visualizar el espectro de las frecuencias de sonido 
Leer las cabeceras de un archivo mp3 
Conversor MPEG4 a AVI 
Reproducir notas musicales 
Vumetro con Delphi


Reproducir notas musicales

.

El siguiente procedimiento permite teclear una nota musical en función de su frecuencia y duración, no sobre el altavoz interno del PC, que habitalmente se haría con la función Windows.Beep() , sino sobre la tarjeta de sonido.
Para ello se configura las propiedades del archivo "wav" (en la estructura WaveFormatEx), esta estructura se escribe en un MemoryStream que se pasa como parámetro a la función sndPlaySound indicando la lectura de un flujo de memoria.

Por ejemplo un "LA" que dura 1 segundo se reproduciría así:

procedure TForm1.Button1Click(Sender: TObject);
begin
  MakeSound(440, 1000, 60);
end;

Link de descarga del programa

Una nota musical se caracteriza por 3 parámetros: altura, amplitud y timbre.
Altura: también llamada "frecuencia". Musicalmente para aumentar una octava haría falta mutiplicar su frecuencia por 2.
Amplitud: Es la potencia sonora - volumen. El fichero WAV no utiliza la noción de decibelios, sino un valor comprendido entre 0 -silencio- y 127 -el más fuerte posible-.
Timbre
: Es el parámetro que caracteriza el sonido. Es el que permite diferenciar 2 instrumentos musicales que tocan la misma nota.

Frecuencias informativas de las notas musicales: (Octava nº 3)

  • Do : 264 Hz
  • Ré : 297 Hz
  • Mi : 330 Hz
  • Fa : 352 Hz
  • Sol : 396 Hz
  • La : 440 Hz
  • Si : 495 Hz
  • Do4 : 528 Hz

Más información

Estructura del fichero WAV:Wotsit's format
Tutoriales sobre WAV : http://sub0.developpez.com
Manipulación de ficheros WAV :Concaténation de fichiers WAV

Monitor de red con Delphi


Monitor de red que utiliza la Dll "IPHLPAPI.DLL" del API de Microsoft.

Para cada interfaz de red el programa muestra:
-Su nombre.
-Su dirección MAC.
-Su velocidad.
-MTU.
-Total de bytes enviados y recibidos.
-Diagrama con la tasa de transferencia instantánea.

Link de descarga del programa


Salvapantallas programado en Delphi


Aquí tienen un salvapantallas realizado en Delphi. Después de compilarlo se generará un archivo llamado "FeuxDartifice.scr" (que es el salvapantallas que pueden instalar en Windows).

Para ver cómo funciona hay que hacer clic con el botón derecho del ratón sobre el archivo anterior y en el menú emergente activar la opción "Probar".

Link de descarga


Relacionados:
Pasos para crear un salvapantallas

Espectacular actuación de Mariachis

No todo va a ser informática, programación, etc... voy a hacer un alto en el camino con un poco de música, y es que hace unos meses asistí a un Concierto en el Auditorio Nacional de Música de Madrid en el que actuaban varios grupos de Mariachis con un éxito arrollador todos ellos (Era la primera vez que los pude ver en directo y quedé sumamente impresionado por la fuerza de sus voces, la habilidad con el violín y la calidad artística del grupo) y para muestra aquí tienen la actuación del MARIACHI VARGAS DE TECALITLAN ...simplemente ESPECTACULAR...
...Dedicado a mis amigos mexicanos...

Link en youtube: http://www.youtube.com/watch?v=dZPYKcIZqH8


Crear un punto de restauración del sistema

Aquí tienen cómo crear un punto de restauración del sistema con Delphi.
Para comprobar que se ha creado correctamente tienen que ir a INICIO-
Todos los programas-Accesorios-Herramientas de sistema-Restaurar sistema.

Autor: chrisbhmg@gmail.com

Link de descarga

Matrix con Delphi

.

Aquí tienen una imitación realizada en Delphi de la pantalla que muestra caracteres como si fuesen gotas de lluvia de la película Matrix.

Autor: Pierre Castelain

Código fuente


Solución de la ecuación de Schrödinger con Delphi

.
Esta aplicación calcula la ecuación de Schrödinger dependiente del tiempo y hace los cálculos de los estados y energía según Hamilton-Jacobi.
Como la ecuación tiene números complejos, separa la parte real y la imaginaria utilizando la unidad tMatrix (viene con su código fuente).
De la unidad tMatrix se usa una función para diagonalizar una matriz simétrica real con el fin de resolver la ecuación, pero contiene muchas otras que las pueden usar en sus programas como son:
Cálculo del determinante, matriz transpuesta, matriz nula, suma, resta, descomposición de una matriz M=L*U donde L y U son las matrices triangulares superior e inferior, descomposición de M=Q*L donde Q es la matriz unitaria y L es la matriz triangular inferior, Método de reducción de Hessenberg, etc...

Link del programa y código fuente

Relacionados:
Wikipedia: Ecuación de
Schrödinger

Acceder a los contadores del sistema



La siguiente aplicación les permitirá acceder a los contadores de rendimiento de Windows. Para ello se utilizan las funciones de la librería PDH, que funcionan bajo 2X/XP.
Se pueden ver el % de utilización de la CPU, por procesos, utilización de memoria, rendimiento de disco (lectura / escritura), etc.
Está probado con Delphi 7 y recordar que tienen que incluir en el uses la unit uPDH.

Link de descarga

Obtener los KBDI de los parches instalados en el sistema

Con este procedimiento se puede obtener una relación de las códigos de las actualizaciones de Microsoft que están instaladas en vuestro equipo. Hay que añadir en el uses la unit Registry y poner en el form de la aplicación un objeto tListbox y un tButton.

Si quieren más información sobre una actualización (p. ej. la nº 23422) modificar el enlace siguiente de esta forma:

http://support.microsoft.com?kbid=23422


Código fuente en Delphi

Emulador PIC 16F84 con Delphi


Es uno de los microcontroladores más populares del mercado, ideal para principiantes, debido a su arquitectura de 8 bits, 18 pines, y un set de instrucciones RISC muy amigable para memorizar y fácil de entender, internamente consta de:
  • Memoria Flash de programa (1K x 14).
  • Memoria EEPROM de datos (64 x 8).
  • Memoria RAM de 68 registros x 8.
  • Un temporizador/contador (timer de 8 bits).
  • Un divisor de frecuencia.
  • Varios puertos de entrada-salida (13 pines en dos puertos, 5 pines el puerto A y 8 pines el puerto B).
En este caso os presento un emulador freeware realizado en Delphi con código fuente incluido.

Link de descarga



Relacionados:
Calculo de valores de resistencias electricas
Visualizar el espectro de frecuencias del sonido
Delphi y arduino



Calcular el MD5

MD5 es un algoritmo de reducción criptográfico de 128 bits, que se usa ampliamente en informática para asegurar, entre otras cosas, que los archivos descargados desde internet no han sufrido cambios debidos a virus o troyanos.
Esta soft es una implementación del driver test descrita en RFC 1321. Se puede usar para comprobar las funciones MD5String y MD5File es decir para calcular el MD5 de un texto y de un fichero.

Código fuente en Delphi

Bloquear disco

Esta es una utilidad que permitirá bloquear el acceso a cualquier unidad de disco de vuestro sistema. No usa componente de terceros, todo se programa con las units de Delphi standard.
Recordar que antes de cerrar la aplicación tienen que pulsar el botón "unlock" para desbloquear el disco.
Está probado en Delphi 7 y funciona incluso con unidades USB.

Código fuente

Port scanner en Delphi

Aquí tienen un escaner de puertos en modo línea de comandos, con su código fuente en Delphi.
El programa lanza un hilo para analizar cada puerto utilizando la función BeginThread, con lo que podrán comprobar la rapidez de este programa.
Se puede modificar el máximo número de puertos a analizar (por defecto analiza los 20000 primeros)

Para iniciarlo, desde la consola ms-dos teclear: portscan (ip)

Link de descarga

Automátas celulares de estados finitos


Un autómata celular es un modelo matemático para un sistema dinámico que evoluciona en pasos discretos. Es adecuado para modelar sistemas naturales que puedan ser descritos como una colección masiva de objetos simples que interactúen localmente unos con otros.
Estos sistemas se aplicaron al campo de la física computacional por John Von Neumann en la década de los 50's.
Este caso es un ejemplo que se aplica a la conducta de los votantes. Desde el botón de "Configuración" se puede definir el algoritmo a utilizar (Moore, Von Neumann), modo de evolución (automática o paso a paso), radio y el tipo de inicialización (aleatoria, predeterminada)
Link:
http://ar.geocities.com/hlaforcada/Archivos/Vote.zip

Skype con Delphi


Para los que utilizan skype, seguro que les interesará este componente que permite desarrollar aplicaciones propias utilizando la funcionalidad de skype. Incorpora una carpeta con muchos ejemplos de programación.

http://www.sokratez.de/downloads/skypecontrol.rar

Página en inglés con más información sobre skype
http://www.drbob42.com/examines/examin75.htm

Evitar que se inicie una aplicación varias veces


El iniciar la misma aplicación varias veces puede ser un problema si tenemos que interactuar con un recurso compartido, como el puerto serie, una base de datos, etc...
Para evitarlo, una de las formas más sencillas es crear un mutex cada vez que se inicie nuestro software.
El truco está en comprobar si la función CreateMutex devuelve un error, en caso afirmativo podemos tener la seguridad que la aplicación estaba abierta anteriormente y procederemos a detener su ejecución.

El código es el siguiente :

....
var
hnd:thandle;

IMPLEMENTATION
....

initialization
hnd := CreateMutex(nil, True, 'mutexprincipal');
if GetLastError = ERROR_ALREADY_EXISTS then Halt;

finalization
if hnd <> 0 then CloseHandle(hnd);
.....

end.

Fases de la Luna


Ahora que se celebra el 40 aniversario de la llegada del hombre a la Luna, este soft viene al pelo, ya que lo que hace es mostrar sobre una imagen las fases de la Luna.
En sí el programa muestra el uso del objeto TCanvas y de las funciones arc y floodfill sin hacer cálculos astronómicos que es lo que uno podría pensar a priori.
Cuando lo instalen les recomiendo pulsar el botón "show moon image" para conseguir que la animación sea más realista.

Descargar programa:
http://www.delphiforfun.org/Programs/Download/DrawMoonSource.zip

Código fuente:
http://www.delphiforfun.org/Programs/Delphi_Techniques/DrawMoonSource.html

NUEVO=============
Relacionados:
Página que proporciona una simulación del principal ordenador de viaje de las misiones lunares del programa Apolo de la NASA llamado A.G.C. (Apollo Guidance Computer) y de las misiones de aterrizaje. Tanto el módulo de control, como el módulo de aterrizaje tienen sus propios A.G.C. aunque con diferente software.
http://www.ibiblio.org/apollo/
http://code.google.com/p/virtualagc/

Código fuente del programa del apollo:
http://googlecode.blogspot.com/2009/07/apollo-11-missions-40th-anniversary-one.html

http://code.google.com/p/virtualagc/source/browse/trunk/Comanche055/CM_BODY_ATTITUDE.s?r=258

Ecuaciones de guia de aterrizaje lunar
http://code.google.com/p/virtualagc/source/browse/trunk/Luminary099/LUNAR_LANDING_GUIDANCE_EQUATIONS.s?r=258
http://code.google.com/p/virtualagc/source/browse/trunk/FP8/FP8.s?r=258

Simular un doble clic sobre la pantalla

Hace tiempo que quería obtener una función como la siguiente, sobre todo para conseguir
ahorrarme alguna acción repetitiva que tengo que realizar diariamente como informático.
Según Microsoft recomienda utilizar la función SendInput en vez de Mouse_Event, sin
embargo las pruebas que he realizado con SendInput no me han funcionado cuando se trata
de simular clics de ratón.

procedure TForm1.Button1Click(Sender: TObject);
var
P: TPoint;
begin
GetCursorPos(P); //almcacena la posición actual del cursor
SetCursorPos(Left + 10, Top + 10);
Mouse_Event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
Mouse_Event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
GetDoubleClickTime;
Mouse_Event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
Mouse_Event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
SetCursorPos(P.X, P.Y); //restaura el cursor a la posición original
end;

Cálculo de la fracción egipcia con Delphi


Una fracción egipcia es la suma de fracciones unitarias distintas, es decir, de fracciones de numerador 1 y cuyos denominadores sean enteros positivos distintos. Se puede demostrar que cualquier número racional positivo se puede escribir como fracción egipcia.

Los Egipcios (2000 A.C.) utilizaron una técnica particular para calcular el cociente de 2 números. Ellos establecen ciertos múltiplos para el denominador y multiplican el número obtenido por 2 hasta la obtención de un número superior como numerador.

Código fuente en Delphi para calcular la fracción egipcia de la división de dos números enteros:

http://www.darkskull.net/fichiers/tips/egypt.zip

Convertir caracteres de chino simplificado a tradicional



Existen 2 juegos de caracteres chinos: el simplificado y el tradicional.
Desde la revolución cultural china, los caracteres tradicionales se han simplificado (ya que son más fáciles de dibujar y de leer). El chino simplificado es el que se usa actualmente, mientras que el tradicional se utiliza en Hong-Kong y Taïwan.
En nuestro caso el truco está en utilizar la función LCMapStringW (unit Windows)

El código sería el siguiente:
function SimplificadoATradicional(Str:Widestring):Widestring;
begin
SetLength(Result,Length(Str));
LCMapStringW($404,LCMAP_TRADITIONAL_CHINESE,
PWideChar(Str),Length(Str),
PWideChar(Result),Length(Result));
Result:=Result;
end;

function TradicionalASimplificado(Str:Widestring):Widestring;
begin
SetLength(Result,Length(Str));
LCMapStringW($804,LCMAP_SIMPLIFIED_CHINESE,
PWideChar(Str),Length(Str),
PWideChar(Result),Length(Result));
end;

Optimizando la memoria del sistema


Cuando una aplicación se minimiza se libera parte de la memoria virtual no utilizada y eso es porque Windows realiza una llamada a la función SetProcessWorkingSetSize.

En el caso de Delphi existe un código de inicialización de las units que ocupa mucho espacio, pero que sólo se necesita durante el arranque del programa. Por consiguiente realizando regularmente llamadas a esta función podremos optimizar la utilización de memoria de nuestra aplicación.

El código sería el siguiente:

procedure
Optimizar_memoria;
var
MainHandle : THandle;
begin
try
MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID);
SetProcessWorkingSetSize(MainHandle,DWORD(-1),DWORD(-1));
finally
CloseHandle(MainHandle);
end;
end;

Crear un salvapantallas con Delphi


Aquí tienen un interesante artículo sobre cómo realizar un salvapantallas en Delphi.

http://www.mindspring.com/~cityzoo/scrnsavr.html

Un salvapantallas no es más que un ejecutable típico de Windows al que se le ha renombrado con la extensión "scr" en lugar de "exe". Este ejecutable debe tener los siguientes requisitos imprescindibles:

1) Debe terminar cuando el usuario mueva el ratón y pulse una tecla.
2) No debe permitir que se ejecuten múltiples copias de sí mismo.
3) Tiene que tener un modo activo de funcionamiento del salvapantallas y un modo de configuración, que permita cambiar los parámetros que lo definen.

En esta página os explican cómo programar cada uno de estos apartados.

Código fuente en zip :

Apagar monitor pulsando una tecla



El siguiente software muestra la forma de utilizar hooks de teclado para apagar el monitor (pulsando la tecla "Pause" en este caso). Éste se volverá a encender cuando se pulse una tecla o se mueva el ratón.

Lo que hace el programa es:
- Hacer una llamada a LoadLibrary para cargar la Dll (MonitorOffDll).
LibHandle:=LoadLibrary('MonitorOffDLL.dll')

- Llama a GetProcAddres para conseguir la dirección de la DLL.
HookProcAddress:=GetProcAddress(LibHandle, pchar(1) ); InitializeHook:=GetProcAddress(LibHandle,pchar(2) );

- Llama a SetWindowsHookEx especificando WH_KEYBOARD como tipo de hook y con la dirección obtenida en el punto anterior. El parámetro ThreadID se pone a cero para indicar que es un hook global.
CurrentHook:=SetWindowsHookEx(WH_KEYBOARD,HookProcAddress,LibHandle,0);

- Llama al procedimiento de inicialización del DLL para pasar el handle asignado al hook.
InitializeHook(CurrentHook, Extractfilepath(application.exename));

(Pruebas realizadas en Delphi 7)

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




Utilizar hilos sin la clase vcl thread

Para utilizar hilos sin la clase Thread tenemos que hacer 2 cosas:

1) Crear el thread

La llamada para crear el hilo sería así:
procedure TForm1.Button1Click(Sender: TObject);
var
thr : THandle;
thrID : DWORD;
begin
thr := CreateThread(nil, 0, @HacerAlgo, nil, 0, thrID);
if (thr = 0) then ShowMessage('Error al crear el hilo);
end;

2) Proporcionar una función al hilo.

Requerimientos de la función:
- Se le puede dar el nombre que se quiera
- Debe tener un parámetro de tipo puntero
- La función devolverá un parámetro del tipo longint
- En la declaración se debe añadir la directiva stdcall, lo que le dice al compilador que la función le pasará los parámetros según la convención de Windows.

Ej.
FUNCTION HacerAlgo(Ptr : Pointer) : LongInt; STDCALL;
BEGIN
SetThreadPriority(DWORD(-2), THREAD_PRIORITY_IDLE); //Establece la prioridad del hilo
//Opcional. Evita el acceso simultáneo a las variables contenidas entre InterlockedIncrement e
// InterlockedDecrement
InterlockedIncrement(iValor);
--
--
--
InterlockedDecrement(iValor);
END;

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:



Traducir mensajes de Outlook con Delphi

.

Para los que no quieren perder tiempo en traducir emails acudiendo a páginas web, aquí tienen un COM add-in para Outlook que usa el servicio SOAP desde http://babelfish.altavista.com/ que los traducirá directamente desde el programa Microsoft Outlook.

Para ello simplemente hay que seleccionar un mensaje de la bandeja de entrada y pulsar el botón "Traducir" que aparecerá en el menú principal del Outlook, tal como muestra la imagen del post.
Para compilarlo se necesita Delphi 6 o 7 (Enterprise) ya que ambas soportan SOAP nativamente.

El "esqueleto" de este código os puede servir para crear vuestro propio add-in.

Descargar código fuente:
¿Qué es un add-in? (wikipedia)
http://es.wikipedia.org/wiki/Add-in

Apagar servidor de red cuando se apaguen los terminales

-


Continuando con los posts sobre ahorro de energía os presento este software. Su función es ir comprobando continuamente el estado (ON, OFF) de cada uno de los equipos y en el momento que detecta que todos ellos están OFF ejecutará la acción de apagado del servidor que se haya definido (por defecto "shutdown -s").

Desde el archivo "parametros.ini" podemos configurar las variables necesarias para su funcionamiento (ip del servidor, acción de apagado, intervalo de comprobación, IPs de los equipos de red). Hay que tener en cuenta que este programa se deberá iniciar desde el servidor de red.
Seguramente en vuestro trabajo como administradores de redes tendréis momentos en los que están todos los terminales de red apagados y sin embargo está encendido el servidor por lo que evidentemente es un gasto energético innecesario, por tanto si aplicamos este software ahorraremos energía, evitaremos emisiones de CO2, y se amplia la vida útil del equipo al estar encendido menos horas. Un servidor de red consume aprox. 250 watios/hora por lo que el ahorro energético acumulado en un año podría llegar a ser muy importante.

Link para su descarga (código fuente en Delphi y ejecutable)
http://JJavierPareja.googlepages.com/Apagarservidor.zip

 

wake on lan 

Detectar inactividad en el sistema

Apagar monitor pulsando una tecla

Apagar servidor de red cuando se apaguen los terminales

Software para backup en Delphi

--


Aquí tienen un software de backup multi-hilo con multitud de funciones. La versión 8 está bajo licencia "Mozilla Public License 1.1"

Se puede usar como aplicación o servicio y según su autor usa muy pocos recursos, puede ser iniciado en background o como aplicación independiente, también puede copiar archivos de un destino a otro en modo normal, comprimido o encriptado (utilizando diferentes métodos)

Software Cobian Backup V8.0 (código fuente y ejecutable)



Página del fabricante

Google Maps - API Codificación Geográfica

Excelente post de Neftalí -Germán Estévez- sobre codificación geográfica para aquellos que quieran utilizar Google Maps en sus aplicaciones Delphi. Es de lo mejor que he visto en Internet en Español sobre este tema.

El link es:
http://neftali.clubdelphi.com/?p=335

Integración con Google Maps:
http://neftali.clubdelphi.com/?p=380

Obtener las modificaciones que un usuario realiza sobre el Mapa y trasladarlas a nuestro programa en delphi:
http://neftali.clubdelphi.com/?p=413

Links relacionados
http://delphimagic.blogspot.com/2008/10/utilizar-google-maps-en-delphi.html

Utilizar Google Search con Delphi
http://delphimagic.blogspot.com/2008/10/buscar-en-google-con-delphi.html

Osciloscopio en tiempo real

Aquí os dejo un link interesante para montaros vuestro osciloscopio programado en Delphi.



Es un componente de dibujo en tiempo real y un osciloscopio virtual.

Tiene ejemplos de código para Cpp, Visual, Mathworks y por supuesto Delphi.

Se puede descargar desde aquí:
http://www.oscilloscope-lib.com/oscilloscope_DLL.zip


Página principal:
http://www.oscilloscope-lib.com/

Relacionados:

Calculo de valores de resistencias electricas
Osciloscopio con la tarjeta de sonido
Visualizar el espectro de las frecuencias de sonido 
Vumetro con Delphi

Crea espectaculares fractales con Delphi

Aquí tienen un fantástico programa "Apophisys" para visualizar espectaculares imágenes fractales.


Con este software podrán editar, crear y renderizar fractales. Viene con muchísimos ejemplos prediseñados, a cada cual más original, pudiéndose modificar diferentes parámetros (color, gradiente, posición de la cámara, perspectiva, escala, etc.) para conseguir nuevos efectos.




Se puede descargar desde aquí, (con código fuente incluido)

http://sourceforge.net/projects/apophysis/

Links relacionados:

The fractal flame algorithm http://flam3.com/flame.pdf

Ahorrar energía con Delphi

A continuación os presento una serie de funciones para ahorrar energía en vuestros equipos.

//pasar monitor a modo de ahorro de energía
procedure modoAhorroDeEnergia;
begin SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 1);
end;

//apagar monitor
procedure apagarMonitor;
begin SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
end;

//Encender monitor:
procedure encenderMonitor;
begin SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1);
end;


//Apagar equipo (requiere permisos administrativos)
PROCEDURE apagarEquipo;
begin
IF NOT (ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE, 0)) then
showmessage('No puedo apagar el equipo');
end;

//Reiniciar equipo
PROCEDURE ReiniciarEquipo;
begin
IF NOT (ExitWindowsEx(EWX_REBOOT, 0)) then
showmessage('No puedo reiniciar el equipo');
end;

//Devuelve TRUE si el sistema puede Hibernar
FUNCTION TForm1.SystemCanHibernate(): boolean;
RESOURCESTRING
rsDll = 'powrprof.dll';
rsFunc = 'IsPwrHibernateAllowed';
TYPE
TFunc = FUNCTION: boolean; stdcall;
VAR
func: TFunc;
hDll: THandle;
BEGIN
result := false;
hDll := LoadLibrary(PChar(rsDll));
IF (hDll <> 0) THEN
TRY
@func := GetProcAddress(hDll, PChar(rsFunc));
result := Assigned(func) AND func();
FINALLY
FreeLibrary(hDll);
END;
END;


//Devuelve TRUE si el sistema puede ser suspendido
FUNCTION tform1.SystemCanSuspend(): boolean;
RESOURCESTRING
rsDll = 'powrprof.dll';
rsFunc = 'IsPwrSuspendAllowed';
TYPE
TFunc = FUNCTION: boolean; stdcall;
VAR
func: TFunc;
hDll: THandle;
BEGIN
result := false;
hDll := LoadLibrary(PChar(rsDll));
IF (hDll <> 0) THEN
TRY
@func := GetProcAddress(hDll, PChar(rsFunc));
result := Assigned(func) AND func();
FINALLY
FreeLibrary(hDll);
END;
END;


Relacionados:
wake on lan 
Detectar inactividad en el sistema

Apagar monitor pulsando una tecla
Apagar servidor de red cuando se apaguen los terminales

OCR con Delphi

Aquí tenéis un OCR (Optical Character Recognition) en Delphi, que traduce lo que se ha tecleado o escrito en formato de imagen (como un bitmap) dentro de un fichero editable (texto), viene con código fuente (freeware y licencia open source)

Tiene la capacidad de aprender patrones desde un tipo y tamaño de font determinado utilizando una red neural con el algoritmo de backpropagación.

Hay que tener encuenta que el OCR no ha sido entrenado, por lo que lo primero que hay que hacer es entrenarlo para que pueda reconocer el texto.

Para ello hay que abrir la ventana "Process->Training...", seleccionar los patrones desde los fonts disponibles y el tamaño de letra (Manteniendo pulsado shift o Ctrl se seleccionan varios items), o también se puede dibujar con el ratón un patrón, y para finalizar pulsar el botón "Add Training Pairs".

Cuando estén todos items definidos (podemos probar p.ej. con los números "1,2,3,4")
pulsamos el botón "Train".

El botón "Test" prueba la red. (Es conveniente pulsarlo para ver el tanto por ciento de coincidencia del patrón con el dato de prueba)

Ventana de entrenamiento:
Seleccionar el Font, Char y Size y después pulsar "Add Training Pairs"



Ventana para teclear los datos:
Escribir con el ratón en la parte superior alguno de los números seleccionado en la pantalla anterior (con cuidado de imitar el font y su tamaño) y después activar el menú "Process->Recognize"
En la parte inferior de la ventana aparecen los caracteres reconocidos por el programa.

En este caso la coincidencia ha sido del 100 por ciento.



Descargar el programa con su código fuente:


Pruebas realizadas con Delphi 7

El programa utiliza el componente TBackProp

Autor:        Theo Zacharias (theo_yz@yahoo.com)

Descripción : TBackProp es una clase que encapsula un objeto de red neuronal backpropagation

Eventos: OnTraining, OnTrainingFinish

Propiedades: ErrorThreshold (r/w), InputLayer (r/w),
                  InputPatternHeight (r/o), InputPatternWidth (r/o),
                  KnownSymbol (r/o), LearningRate (r/w), MaxEpoch (r/w),
                  Modified (r/o), NHiddenNeuron (r/o), NInputNeuron (r/o),
                  NNeuronError (r/o), NOutputNeuron (r/o), NTrainingEpoch (r/o),
                  NTrainingNeuron (r/o), NTrainingPair (r/o), OutputLayer (r/o),
                  StopTraining (r/w), TargetClassificationError (r/w),
                  TargetPatternHeight (r/o), TargetPatternWidth (r/0),
                  TargetSquaredError (r/o), TrainingError (r/o),
                  WeightsInitFactor (r/w)


Métodos: : AddTrainingPairs, Apply, GetResult, NewKnowledge,
                  OpenKnowledge, Retrain, SaveKnowledge, Train


Descargar el componente tBackProp

 

Post relacionados:
OCR con Tesseract

Dibuja el fractal Mandelbrot con Delphi





Calcular el enésimo número de fibonacci

{
Fibonacci integers are defined as:
Fibonacci Zahlen sind wie folgt definiert:

fib[n+2] = fib[n+1] + fib[n];
fib[1] = 1;
fib[0] = 1;

Example/Beispiel: fib[4] = fib[3] + fib[2] = fib[2] + fib[1] + fib[1] + fib[0] =
fib[1] + fib[0] + fib[1] + fib[1] + fib[0] = 5
}

function fibit(n: Integer): Integer;
var
a, b, i, temp: Integer;
begin
temp := 1;
a := 1;
b := 1;
for i := 1 to n - 1 do
begin
temp := a + b;
a := b;
b := temp;
end;
Result := temp;
end;

function fibrec(n: Integer): Integer;
var
temp: Integer;
begin
temp := 0;
if (n = 0) then temp := 1;
if (n = 1) then temp := 1;
if (n > 1) then temp := fibrec(n - 1) + fibrec(n - 2);
Result := temp;
end;


// Example:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(fibit(10)));
ShowMessage(IntToStr(fibrec(10)));
end;



Autor: Dev4u.ch
Homepage: http://www.dev4u.ch