FAQ Word / Excel

PREGUNTAS



¿Cómo mover el cursor hasta el final de un documento Word?

¿Cómo cambiar el tipo de letra de una celda?

¿Cómo cambiar el color de la tabla?

¿Cómo imprimir sin mostrar el cuadro de diálogo?

Cómo alinear texto en Word

Utilizar Excel a través de la interfaz COM

Utilizar Excel usando OLE

COMPROBAR SI OLE está instalado

¿Cómo exportar una tabla Word a un StringGrid?



RESPUESTAS



¿Cómo mover el cursor hasta el final de un documento Word?


Function EndOfDoc:boolean;


begin


EndOfDoc:=true;


try


W.ActiveDocument.Range.Select;


W.Selection.Start:=W.Selection.End;


except


EndOfDoc:=false;


end;


End;





¿Cómo cambiar el tipo de letra de una celda?




Function SelectCell(Table:integer;


Row,Column:integer):boolean;


begin


SelectCell:=true;


try


W.ActiveDocument.Tables.Item(Table).Columns.Item


 
(Column).Cells.Item(Row).Select;


except


SelectCell:=false;


end;


End;





Function FontToEFont(font:Tfont;EFont:variant;





ColorIndex:integer):boolean;


begin


FontToEFont:=true;


try


EFont.Name:=font.Name;


if
fsBold
in
font.Style


 
then
EFont.Bold:=True 


 
else
EFont.Bold:=False; 


if
fsItalic
in
font.Style


 
then
EFont.Italic:=True


 
else
EFont.Italic:=False; 


EFont.Size:=font.Size; 


if
fsStrikeOut
in
font.Style


 
then
EFont.Strikethrough:=True 


 
else
EFont.Strikethrough:=False; 


if
fsUnderline
in
font.Style


 
then
EFont.Underline:=wdUnderlineSingle 


 
else
EFont.Underline:=wdUnderlineNone; 


EFont.ColorIndex:=ColorIndex; 


except


FontToEFont:=false;


end;


End;





Cuando se selecciona un objeto, podemos cambiar la fuente, para ello utilizamos la siguiente función para la selección de objetos:




Function SetFontSelection(font:Tfont;


ColorIndex:integer):boolean;


begin


SetFontSelection:=true;


try


SetFontSelection:=FontToEFont(font,W.Selection.font,ColorIndex);


except


SetFontSelection:=false;


end;


End;





¿Cómo cambiar el color de la tabla?


W.ActiveDocument.Tables.Item(tab_).Columns.Item(col_).Cells.Item(row_).Borders.Item(wdBorderTop).ColorIndex:=wdDarkRed;





¿Cómo imprimir sin mostrar el cuadro de diálogo?




Function PrintOutDoc(NumCopies:integer):boolean;


begin


PrintOutDoc:=true;


try


W.ActiveDocument.PrintOut(NumCopies);


except


PrintOutDoc:=false;


end;





Cómo alinear texto




W.Selection.ParagraphFormat.Alignment:=wdAlignParagraphCenter;


W.Selection.ParagraphFormat.Alignment:=wdAlignParagraphRight;


W.Selection.ParagraphFormat.Alignment:=wdAlignParagraphJustify;





Utilizar Excel a través de la interfaz COM





EJEMPLO 1 




var
Excel, WorkBook, Sheet: Variant;


begin


Excel :=
CreateOleObject(
'Excel.Application');


Excel.WorkBooks.Open(FileName,False);


WorkBook
:= Excel.WorkBooks.Item[
1];


Sheet :=
Workbook.Sheets.Item[
3];


Sheet.Cells[1,2]:='ASDFG';


Sheet.Cells[2,2]:=230;





EJEMPLO 2


uses


ComObj,
ActiveX;





var


Row,
Col: integer;


DestRange: OleVariant;


Excel:
Variant;





begin


Excel :=
CreateOleObject(
'Excel.Application');


Excel.Visible := True;


Excel.WorkBooks.Add; 


Excel.ActiveSheet.Range['A2', 'B3'].Value := 'Тест';


Excel.ActiveSheet.Range['A4', 'B5'].Value := 42;


Excel.ActiveSheet.Range['A10', 'A11'].Formula := '=RAND()';


Excel.ActiveSheet.Cells.Item[1, 1].Value := 'prueba';





Row:=1;


Col:=3;


Excel.ActiveSheet.Cells.Item[Row, Col].Value := 'prueba';





DestRange := Excel.Range['D6', 'F10'];


Excel.Range['A1', 'C5'].Copy(DestRange);





Excel.Range['A2', 'A2'].Font.Size := 20;


Excel.Range['A2', 'A2'].Font.FontStyle := 'Bold';


Excel.Range['A2', 'A2'].Font.Color := clFuchsia;


Excel.Range['A2', 'A2'].Font.Name := 'Arial';


Excel.Range['B2', 'C6'].Interior.Color := RGB(223,
123, 123);


end;





EJEMPLO 3







uses


ComObj,
ActiveX;





var


Excel:
Variant;


WBk :
OleVariant;


SaveChanges: OleVariant;


begin


Excel :=
CreateOleObject(
'Excel.Application');


Excel.Visible := True;


WBk :=
Excel.WorkBooks.Open(
'C:\Test.xls');




...





WBk.Close(SaveChanges := True);


Excel.Quit;


end;








Utilizar Excel usando OLE







{


Ejemplo para imprimir un archivo utilizando OLE


}


uses


ComObj;





procedure TForm1.Button1Click(Sender: TObject);


var


ExcelApp: OLEVariant;


begin


//
Create an Excel instance


//
Excel Instanz erzeugen


ExcelApp
:= CreateOleObject(
'Excel.Application');


try


  
ExcelApp.Workbooks.Open(
'C:\test\xyz.xls');


  
// you can also modify
some settings from PageSetup


  
// Man kann auch noch
einige Einstellungen von "Seite Einrichten" anpassen


  
ExcelApp.ActiveSheet.PageSetup.Orientation := xlLandscape;


  
// Print it out


  
// Ausdrucken


  
ExcelApp.Worksheets.PrintOut;


finally


  
// Close Excel


  
// Excel wieder
schliessen


  
if
not
VarIsEmpty(ExcelApp)
then


  
begin


    
ExcelApp.Quit;


    
ExcelApp := Unassigned;


  
end;


end;


end;  










//COMPROBAR SI OLE está instalado




if
not
IsOLEObjectInstalled(
'Excel.Application') then


  
ShowMessage(
'no instalado')


else


  
ShowMessage(
'instalado');








function IsOLEObjectInstalled(Name: String): boolean;


var


ClassID:
TCLSID;


Rez :
HRESULT;


begin





Rez :=
CLSIDFromProgID(PWideChar(WideString(
Name)), ClassID);





if
Rez = S_OK
then


  
Result := true


else


  
Result := false;


end;








¿Cómo exportar una tabla Word a un StringGrid?







uses


ComObj;





procedure TForm1.Button1Click(Sender: TObject);


const


AWordDoc
=
'C:\xyz\testTable.doc';


var


MSWord,
Table: OLEVariant;


iRows,
iCols, iGridRows, jGridCols, iNumTables, iTableChosen: Integer;


CellText: string;


InputString: string;


begin


try


  
MSWord := CreateOleObject(
'Word.Application');


except


  
// Error....


   Exit;


end;





try


  
MSWord.Visible := False;


  
MSWord.Documents.Open(AWordDoc);





  
// Get number of tables
in document


  
iNumTables := MSWord.ActiveDocument.Tables.Count;





  
InputString := InputBox(IntToStr(iNumTables) +


    
' Tables in Word
Document'
, 'Please Enter Table
Number'
, '1');


  
// Todo: Validate string
for integer, range...


  
iTableChosen := StrToInt(InputString);





  
// access table


   Table
:= MSWord.ActiveDocument.Tables.Item(iTableChosen);


  
// get dimensions of
table


   iCols
:= Table.Rows.Count;


   iRows
:= Table.Columns.Count;


  
// adjust stringgrid
columns


  
StringGrid1.RowCount := iCols;


  
StringGrid1.ColCount := iRows +
1;





  
// loop through cells


  
for
iGridRows :=
1
to
iRows
do


    
for
jGridCols :=
1
to
iCols
do


    
begin


      
CellText := Table.Cell(jGridCols, iGridRows).Range.FormattedText;


      
if
not
VarisEmpty(CellText)
then


      
begin


        
// Remove Tabs


        
CellText := StringReplace(CellText,


           #$D, '',
[rfReplaceAll]);


        
// Remove linebreaks


        
CellText := StringReplace(CellText, #$7,
'',
[rfReplaceAll]);





        
// fill Stringgrid


        
Stringgrid1.Cells[iGridRows, jGridCols] := CellText;


      
end;


    
end;


  
//..


finally


  
MSWord.Quit;


end;


end;





































Delphi twain



Implementación de las funciones twain para Delphi.

Captura imágenes  desde una webcam con unas pocas líneas de código.

3 modos de transferencia de imágenes:

-Desde la memoria,

-Utilizando un handle de windows.

-Utilizando un archivo temporal.



Autor: Gustavo Daud

http://delphitwain.sourceforge.net/

Sitio2:












Trabajar en Google












Esta es una conferencia dada por Arturo Gómez del Castillo (máster en Ingeniería del Software e Ingeniero Técnico en Informática - nota media de 8-) que tiene la suerte de trabajar en la sede de Google en Londres, en la que nos describe su trabajo, nos habla sobre Google, cómo contrata, que requisitos hacen falta para trabajar allí, cuanto se puede ganar, como gestionan la movilidad del personal entre departamentos, etc...por cierto las entrevistas previas a su contratación fueron en inglés.

Casi dos horas de video, muy instructivo para los jóvenes ingenieros que han acabado su carrera.



Asegurar / monitorizar Firebird

Estos son algunos tips que hay que tener encuenta para proteger las bases de datos Firebird:



-Cambiar la contraseña:

gsec –user SYSDBA –pa "antiguo pass" –modify SYSDBA –pw "nuevo pass"


-Abrir el puerto 3050 como aquí te indica si quieres que los usuarios accedan desde fuera a tu sistema, si estás en un entorno web en donde tienes en el servidor tus bases de datos esto no hace falta hacerlo.

Ejecutar Firebird como non-system-user:

-Crear un usuario por ejemplo "UsuarioFB", que no pertenezca a ningun grupo de usuarios del sistema y en la ventana de propiedades desmarcar el check "Allow logon to terminal server"

-En la carpeta donde estén las bases de datos en Propiedades->Seguridad añadir el usuario "UsuarioFB" con los permisos de lectura, escritura,listar directorios, listado y ejecución.

En entornos web con que des permisos al usuario "iusr" de lectura y escritura es suficiente.

- Hay que cambiar las propiedades del servicio "Firebird Server – DefaultInstance" y "FB Guardian" de la siguiente manera:

1) desde Propiedades->Recovery cambiando todos los desplegables a "restart recovery"

2) desde Propiedades->Log on pinchar en "This account" y seleccionar el usuario "UsuarioFB" con la contraseña y usuario que hayamos indicado previamente.

3) desde Propiedades->General marcar en tipo de inicio "Automático"

Por regla general, sólo el proceso del servidor Firebird debería tener acceso a los archivos de base de datos. Los usuarios no necesitan, y no deben tener, el acceso a los archivos - ni siquiera de sólo lectura. Ellos consultan bases de datos a través del servidor, y el servidor se asegura de que sólo los usuarios obtengan el tipo de acceso permitido (en su caso) a cualquier objeto dentro de la base de datos.



Monitorización

Firebird incorpora tablas de monitorización que permiten conocer información relativa a la base de datos y a las consultas de los clientes respecto a la base de datos conectada, sentencias preparadas, transacciones, etc

Las tablas son las siguientes:

MON$DATABASE: base de datos conectada. Con información como ruta de la base de

datos, versión de ODS, identificadores de proceso, etc.

- MON$ATTACHMENTS: Conexiones realizadas. Con información de estado, usuario que

hace la conexión, protocolo de conexión, etc.

- MON$STATEMENTS: Sentencias preparadas para ejecutar. Con información como

identificadores, texto, estado, etc.

- MON$CALL_TACK: Pila de llamadas de las sentencias PSQL activas.

- MON$IO_STATS: Estadísticas de I/O.

- MON$RECORD_STATS: Estadísticas a nivel de fila.

- MON$MEMORY_USAGE: Uso de memoria actual.

- MON$CONTEXT_VARIABLES: Variables de contexto conocida



Ejemplos de consultas:



-Para saber todos los identificadores de procesos con carga de CPU actuales:

SELECT MON$SERVER_PID

FROM MON$ATTACHMENTS

WHERE MON$ATTACHMENT_ID <> CURRENT_CONNECTION

AND MON$STATE = 1



-Para obtener información sobre las aplicaciones clientes

SELECT MON$USER, MON$REMOTE_ADDRESS,

MON$REMOTE_PID,

MON$TIMESTAMP

FROM MON$ATTACHMENTS

WHERE MON$ATTACHMENT_ID <> CURRENT_CONNECTION



-Para obtener el nivelde aislamiento de la transacción actual

SELECT MON$ISOLATION_MODE

FROM MON$TRANSACTIONS

WHERE MON$TRANSACTION_ID = CURRENT_TRANSACTION



-Para obtener las sentencias actualmente activas

SELECT ATT.MON$USER,

ATT.MON$REMOTE_ADDRESS,

STMT.MON$SQL_TEXT,

STMT.MON$TIMESTAMP

FROM MON$ATTACHMENTS ATT

JOIN MON$STATEMENTS STMT

ON ATT.MON$ATTACHMENT_ID = STMT.MON$ATTACHMENT_ID

WHERE ATT.MON$ATTACHMENT_ID <> CURRENT_CONNECTION

AND STMT.MON$STATE = 1



Créditos:

Simon Carter

Vicente Tejero Trueba (Monitorización)


















Multibuscador con Delphi


Este pequeño programa realiza una búsqueda de archivos utilizando programación multi-hilo.

El buscador estándar de Window permite también realizar búsquedas en varias rutas, pero las realiza en serie, es decir: cuando termina de buscar en una carpeta comienza con la siguiente.

Con este programa se puede buscar en varias carpetas de forma simultanea, mejorando así el tiempo de búsqueda, especialmente en búsquedas sobre unidades de red de distintos servidores (mejora los tiempos del buscador de Windows en un 140% para unidades locales de disco duro y en un 300% para unidades en red.

La idea original y el desarrollo son de Salvador Jover (www.sjover.com) y JM (www.lawebdejm.com).

Realizado inicialmente para la revista Síntesis del Grupo Albor (www.grupoalbor.com)



Codigo fuente






Biblioteca de funciones matemáticas MPArith


Esta es una impresionante biblioteca de funciones matemáticas en Delphi, para cálculos en punto flotante, con números racionales y operaciones en alta precisión con enteros.


Según el autor el código no es el más eficiente, pero a cambio es comprensible, compacto, open source y puede ser compilado a partir de Delphi 7.

Para ejecutar los demos hay que cambiar la extensión del archivo demo *.pas a *.dpr y se iniciará en modo consola.



Ejemplo:

Si queremos calcular la operación z=1/3 habría que hacer lo siguiente:



uses

BTypes, mp_types, mp_base, mp_supp, mp_real,sysutils;



var

p,r,s,t,z:mp_float;

r1:real;

begin



//se inicializan las variables

mpf_initp3(s,t,z,mpf_get_default_prec);

mpf_set_ext(s,1);

mpf_set_ext(t,3);

mpf_div(s,t,z);

writeln('Rdo con MPArit ',mpf_decimal(z,80));

mpf_clear3(s,t,z); //Se liberan las variables

//El rdo es: 3.333333333333333333333333333333333333333333E-1



//comparación con el método habitual para calcular 1/3

r1:=1/3.0;

writeln('Rdo con Delphi: '+FloatToStrF(r1,ffexponent,8,20));

//el Rdo es: 3.3333333E-1



end;





Descargar biblioteca de funciones


Pagina oficial












LIBROS:



Matemáticas, el fascinante mundo de los números



Matrix computations (Matematical Science)



Geometría analítica del plano y del espacio



Mecánica de fluidos



Geometría Afín y Euclidea

Dar capacidades de scripting a tu aplicacion

Hoy os presento el componente freeware Artformula que permite dar capacidades de scripting a una aplicación Delphi , para que un usuario pueda escribir y ejecutar código dentro de nuestro programa. En el programa demo asimila los scripts a macros y los utiliza para aplicarlos en un tRichEdit haciéndonos ver lo fácil que es utilizarlos en caso de que tengamos que programar un editor de textos.

Ejemplo de scripts:
1) Abrir un fichero y mostrar su contenido:

begin
print('This is a TArtFormula Demo');
print('==========================');
print('');
var 'f' end;
$f := file.new;
file($f).name := 'info';
file($f).open('read');
while not file($f).eof do
print(file($f).readln);
wend;
file.freeall;
end

2) Resolver una ecuación lineal utilizando matrices:

begin
var "n","i","j","k","d" end;
$n := input("Input dimension","Dimension of matrix:",3);

for $i:=1; $i <= $n; $i++ do
for $j:=1; $j <= $n; $j++ do
var "a"+$i+"_"+$j end;
$a[$i,$j] := input("Input element","a["+$i+","+$j+"] = ",if $i = $j ; 1 ; 0 end);
next;
next;

for $i:=1; $i <= $n; $i++ do
var "b"+$i, "x"+$i end;
$b[$i] := input("Input element","b["+$i+"] = ",1);
next;

for $i:=1; $i < $n; $i++ do
for $k:=$i+1; $k <= $n; $k++ do
$d:=$a[$k,$i]/$a[$i,$i];
for $j:=$i+1; $j <= $n; $j++;
$a[$k,$j]:=$a[$k,$j]-$a[$i,$j]*$d;
end;
$b[$k]:=$b[$k]-$b[$i]*$d;
next;
next;

for $i:=$n; $i >= 1; $i-- do
for $j:=$i+1; $j <= $n; $j++;
$b[$i]:=$b[$i]-$a[$i,$j]*$x[$j];
end;
$x[$i]:=$b[$i]/$a[$i,$i];
next;
print("Result:");
for $i:=1; $i <= $n; $i++; print("x["+$i+"] = "+$x[$i]); end;

end


El lenguaje de script tiene las siguientes características:
-Permite definir variables
-Tiene comandos de asignación
-Operadores de incremento y decremento
-Función Return
-Utiliza:
BEGIN...END
Sentencias IF
Bucles WHILE, UNTIL y LOOP
funciones de interface como: msg('text','caption',props), input('caption', 'text', defvalue)


El componente incorpora la posibilidad de evaluación de expresiones y el cálculo de derivadas con respecto a "x" o "y" de una función.
Las funciones que permite son las siguientes: (tomado de la ayuda del programa)

Arithmetic operation:

x + y, x - y, x * y, x / y, x % y (Mod), x ^ y (power), x\ y (Div)

Logical operation (true=1, false=0):
x > y, x < y, x >= y, x <= y, x = y, x <> y, ! x (not), x & y (and), x | y (or), x xor y

Bitwise operations:
x && y (band), x || y (bor), !!x (bnot), x bxor y, x >> y (shr), x << y (shl)

Predefined constants:
Pi = 3.1415926535897932385
True = 1
False = 0

Functions:

sin, cos, tan, sinh, cosh, tanh, asin, acos, atan, asinh, acosh, atanh, sqrt, exp, log, lg (log base 10), int (integer part of a number), frac (fractional part of a number), abs, sign, rnd, randomize,max(x,y...), min(x,y,...), count(x,y,...), sum(x,y,...), sumofsquares(x,y,...), avg(x,y,...), variance(x,y,...), variancep(x,y,...), stddev(x,y,...), stddevp(x,y,...) , iff(cond,x,y) (if cond = true then result = x else result = y), isnumber(x), chr(x), length(s), trim(s), trimleft(s), trimright(s) lowercase(s), uppercase(s), midstr(s,x,y), leftstr(s,x), rightstr(s,x), pos(s,t), code(s), format(s,x), formatf(s,x), stringofchar(c,n), concat(s1,s2,...), date(s), now, formatdate(s,d), year(d), month(d), day(d), hour(d), minute(d), second(d), millisecond(d), isleapyear(n), dayofweek(d), encodedate(y,m,d)


Autor:

Artem V. Parlyuk, e-mail:artsoft@nm.ru, http://artsoft.nm.ru

Descargar codigo



















Solucion del cubo de Rubik con Delphi








Este soft permite ver de una forma gráfica y paso a paso cada uno de los movimientos que hay que hacer para solucionar el cubo de Rubik.


Realmente es espectacular ver el cubo moviéndose en 3D siguiendo cada uno de los patrones calculados por el programa.


Las animaciones se implementan en Delphi "a pelo" sin utilizar módulos parecidos a OpenGL o GLScene, por lo que es muy instructivo ver cómo se hace la transformación de coordenadas del cubo 3D a 2D junto con su rotación.


Pulsando con el botón derecho del ratón sobre la imagen del cubo podremos rotarlo en la dirección que nos interese.

Si hacéis clic sobre el cubo en la ventana "Vue 3D"  veréis cómo se mueve en 3 dimensiones.

¿Sabías que hay muchos tipos de cubo de rubik, los puedes ver aquí ?



Descargar programa



Descargar codigo



Sitio Web


























Como instalar el componente tProeffectimage

Continuando con el post de ayer

http://delphimagic.blogspot.com/2011/05/programa-para-generar-efectos-graficos.html

a continuación os muestro cómo instalarlo en Windows XP:



Instalación en Delphi 7:



1) Abrimos el archivo dclusr.dpk que está en

c:\archivos de programa\borland\delphi7\lib

2) En la ventana que nos aparece pulsamos el botón "Add"

3) Desde la pestaña "Add unit" y en la caja "Unit File name" localizamos el archivo Proeffectimage.pas y pulsamos el botón OK

4) Después pulsamos el botón "Compile" y "Install" y si todo está correcto veremos en la pestaña de componentes "Samples" el icono Proeffectimage.



Instalación en Delphi 2009:



Es prácticamente igual lo que cambia es que hay que abrir el archivo dclusr.dproj que está en

c:\archivos de programa\CodeGear\RadStudio\6.0\lib

y después hay que ir al menú View->Project Manager












Programa para generar efectos gráficos


Con el componente freeware tProeffectimage escrito por Babak Sateli podrán generar alucinantes efectos gráficos en sus programas, además de una manera muy sencilla ya que lo único que hay que hacer es añadir un trackbar para obtener el parámetro asociado a cada una de las funciones ( está probado en Delphi 7 y Delphi 2009) :



El siguiente código viene en el ejemplo que acompaña a la instalación:



Case EffectsList.ItemIndex of

0: ProEffectImage.Effect_GaussianBlur (TrackBar.Position);

1: ProEffectImage.Effect_SplitBlur (TrackBar.Position);

2: ProEffectImage.Effect_AddColorNoise (TrackBar.Position * 3);

3: ProEffectImage.Effect_AddMonoNoise (TrackBar.Position * 3);

4: For i:=1 to TrackBar.Position do

ProEffectImage.Effect_AntiAlias;

5: ProEffectImage.Effect_Contrast (TrackBar.Position * 3);

6: ProEffectImage.Effect_FishEye (TrackBar.Position div 10+1);

7: ProEffectImage.Effect_Lightness (TrackBar.Position * 2);

8: ProEffectImage.Effect_Darkness (TrackBar.Position * 2);

9: ProEffectImage.Effect_Saturation (255-((TrackBar.Position * 255) div 100));

10: ProEffectImage.Effect_Mosaic (TrackBar.Position div 2);

11: ProEffectImage.Effect_Twist (200-(TrackBar.Position * 2)+1);

12: ProEffectImage.Effect_Splitlight (TrackBar.Position div 20);

13: ProEffectImage.Effect_Tile (TrackBar.Position div 10);

14: ProEffectImage.Effect_SpotLight (TrackBar.Position ,

Rect (TrackBar.Position ,

TrackBar.Position ,

TrackBar.Position +TrackBar.Position*2,

TrackBar.Position +TrackBar.Position*2));

15: ProEffectImage.Effect_Trace (TrackBar.Position div 10);

16: For i:=1 to TrackBar.Position do

ProEffectImage.Effect_Emboss;

17: ProEffectImage.Effect_Solorize (255-((TrackBar.Position * 255) div 100));

18: ProEffectImage.Effect_Posterize (((TrackBar.Position * 255) div 100)+1);

19: ProEffectImage.Effect_Grayscale;

20: ProEffectImage.Effect_Invert;



end;{Case}



Fuente:

babak_sateli@yahoo.com

http://raveland.netfirms.com




Descargar codigo











Detector de movimiento con Delphi



Este software detecta el movimiento entre imágenes tomadas por una webcam, se pueden ajustar varios parámetros como la sensibilidad, pixels verificados y el retardo antes de avisar. Cuando salta un aviso nos enviará un email ( antes hay que cambiar el nombre del host SMTP ) y se guardará en la carpeta "detection" una imagen jpg de ese instante.

Es interesante observar cómo se inicializa el dispositivo de captura de imagen de la siguiente forma:



hcam:=capCreateCaptureWindowA('',0,0,0,320,240,handle,0);

sendmessage(hcam,1034,0,0);

form1.DoubleBuffered:=true;



Descargar codigo fuente


















Ejemplo de uso de un proxy con Delphi

Este es un ejemplo de utilización de un proxy con indy.
Es interesante observar cómo se programa el componente AntiFreeze que se utiliza para evitar el bloqueo de la aplicación, ya que indy trabaja en modo no asíncrono, de tal forma que cuando se intenta realizar una conexión la aplicación se quedará bloqueada hasta que lo consiga, añadiendo el componente AntiFreeze se consigue minimizar este comportamiento.
El procedimiento UTF8ToWideString está en la biblioteca JEDI VCL.
procedure TForm1.Button1Click(Sender: TObject);
Var
Resp : String;
begin
Resp := webSession('http://www.elmundo.es');
if Length(Resp)>0 then
MessageDlg('Got the body ok',mtInformation,[mbOk],0);
end;

function TForm1.webSession(sURL : ansistring) : ansistring;
var
SStream : Tstringstream;
HTTPCon : TIdHTTP;
AntiFreeze : TIdAntiFreeze;
begin
Result := '';
if Length(SettingsForm.edtProxyServer.text) >= 7 then // 0.0.0.0
Try
SStream := NIL;
AntiFreeze := NIL;
HTTPCon := NIL;
Try
SStream := tstringstream.Create('');
{ Create & Set IdHTTP properties }
HTTPCon := TIdHTTP.create;
HTTPCon.HandleRedirects := true;
{ Check Proxy }
if checkproxy('http://www.google.com') then
Begin
HTTPCon.ProxyParams.ProxyServer := SettingsForm.edtProxyServer.text;
HTTPCon.ProxyParams.ProxyPort := StrToInt(SettingsForm.edtProxyPort.Text);
HTTPCon.ProxyParams.BasicAuthentication := True;
HTTPCon.ProxyParams.ProxyUsername := SettingsForm.edtProxyServer.Text;
HTTPCon.ProxyParams.ProxyPassword := SettingsForm.edtProxyUserName.Text;
End;
{ Create another AntiFreeze - only 1/app }
AntiFreeze := TIdAntiFreeze.Create(nil);
AntiFreeze.Active := true;
HTTPCon.Get(sURL,SStream);
Result := UTF8ToWideString(SStream.DataString);
Finally
If Assigned(HTTPCon) then FreeAndNil(HTTPCon);
If Assigned(AntiFreeze) then FreeAndNil(AntiFreeze);
If Assigned(SStream) then FreeAndNil(SStream);
End;
Except
{ Handle exceptions }
On E:Exception do
MessageDlg('Exception: '+E.Message,mtError, [mbOK], 0);
End;
end;

function TForm1.checkproxy(sURL : ansistring) : boolean;
var
HTTPCon : TIdHTTP;
AntiFreeze : TIdAntiFreeze;
begin
Result := False;
Try
{ Inti vars }
AntiFreeze := NIL;
HTTPCon := NIL;
Try
{ AntiFreeze }
AntiFreeze := TIdAntiFreeze.Create(NIL);
AntiFreeze.Active := true;
{ Create & Set IdHTTP properties }
HTTPCon := TIdHTTP.Create(NIL);
HTTPCon.ProxyParams.ProxyServer := SettingsForm.edtProxyServer.text;
HTTPCon.ProxyParams.ProxyPort := StrToInt(SettingsForm.edtProxyPort.Text);
HTTPCon.ProxyParams.BasicAuthentication := True;
HTTPCon.ProxyParams.ProxyUsername := SettingsForm.edtProxyServer.Text;
HTTPCon.ProxyParams.ProxyPassword := SettingsForm.edtProxyUserName.Text;
HTTPCon.HandleRedirects := true;
HTTPCon.ConnectTimeout := 1000;
HTTPCon.Request.Connection := 'close';
HTTPCon.Head(sURL);
Finally
{ Cleanup }
if Assigned(HTTPCon) then
Begin
{ Return Success/Failure }
Result := HTTPCon.ResponseCode = 200;
If HTTPCon.Connected then HTTPCon.Disconnect;
FreeAndNil(HTTPCon);
End;
if Assigned(AntiFreeze) then FreeAndNil(AntiFreeze);
End;
Except
On E:EIdException do ;
{ Handle exceptions }
On E:Exception do
MessageDlg('Exception: '+E.Message,mtError, [mbOK], 0);
End;
end;

Simulación del movimiento de los electrones en un campo electrico

Espectacular simulación realizada con OpenGL del movimiento de los electrones cuando atraviesan un campo eléctrico. Como muestra la image...