Fechas de un fichero (creación, modificación y últ. acceso)

sábado, 29 de marzo de 2008 2 comentarios
Share Button

Para cualquier fichero que se encuentra en el sistema de archivos de Windows se almacenan varias fechas. Para acceder a todas ellas puede utilizar el siguiente truco:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// ================================================================
// Return the three dates (Created,Modified,Accessed)
// of a given filename. Returns FALSE if file cannot
// be found or permissions denied. Results are returned
// in TdateTime VAR parameters
// ================================================================
// ================================================================
// Devuelve las tres fechas (Creación, modificación y último acceso)
// de un fichero que se pasa como parámetro.
// Devuelve FALSO si el fichero no se ha podido acceder, sea porque
// no existe o porque no se tienen permisos. Las fechas se devuelven
// en tres parámetros de ipo DateTime
// ================================================================
function GetFileTimes(FileName : string; var Created : TDateTime;
    var Modified : TDateTime; var Accessed : TDateTime) : boolean;
var
   FileHandle : integer;
   Retvar : boolean;
   FTimeC,FTimeA,FTimeM : TFileTime;
   LTime : TFileTime;
   STime : TSystemTime;
begin
  // Abrir el fichero
  FileHandle := FileOpen(FileName,fmShareDenyNone);
  // inicializar
  Created := 0.0;
  Modified := 0.0;
  Accessed := 0.0;
  // Ha tenido acceso al fichero?
  if FileHandle < 0 then
    RetVar := false
  else begin
 
    // Obtener las fechas
    RetVar := true;
    GetFileTime(FileHandle,@FTimeC,@FTimeA,@FTimeM);
    // Cerrar
    FileClose(FileHandle);
    // Creado
    FileTimeToLocalFileTime(FTimeC,LTime);
 
    if FileTimeToSystemTime(LTime,STime) then begin
      Created := EncodeDate(STime.wYear,STime.wMonth,STime.wDay);
      Created := Created + EncodeTime(STime.wHour,STime.wMinute,
              STime.wSecond, STime.wMilliSeconds);
    end;
 
    // Accedido
    FileTimeToLocalFileTime(FTimeA,LTime);
 
    if FileTimeToSystemTime(LTime,STime) then begin
      Accessed := EncodeDate(STime.wYear,STime.wMonth,STime.wDay);
      Accessed := Accessed + EncodeTime(STime.wHour,STime.wMinute,
              STime.wSecond, STime.wMilliSeconds);
    end;
 
    // Modificado
    FileTimeToLocalFileTime(FTimeM,LTime);
 
    if FileTimeToSystemTime(LTime,STime) then begin
      Modified := EncodeDate(STime.wYear,STime.wMonth,STime.wDay);
      Modified := Modified + EncodeTime(STime.wHour,STime.wMinute,
                     STime.wSecond, STime.wMilliSeconds);
    end;
  end;
  Result := RetVar;
end;

Para llamar a ésta función se puede utilizar un código como éste:

1
2
3
4
5
6
7
8
9
10
var
   CDate,MDate,ADate : TDateTime;
begin
  // Correcto?
  if GetFileTimes('c:\autoexec.bat', CDate, MDate, ADate) then begin
    Label1.Caption := FormatDateTime('dd/mm/yyyy hh:nn',CDate);
    Label2.Caption := FormatDateTime('dd/mm/yyyy hh:nn',MDate);
    Label3.Caption := FormatDateTime('dd/mm/yyyy hh:nn',ADate);
  end;
end;

Crear un menu de aplicación a partir de texto

lunes, 24 de marzo de 2008 1 comentario
Share Button

Éste ejemplo muestra cómo crear en una aplicación, un menú dinámicamente a partir de texto; Normalmente la opción más común es que éste texto se almacene en un fichero o incluso en Base de Datos. Para el ejemplo, el texto ya está almacenado en un memo; Las formas de almacenar ese texto correspondiente al menú son muy variadas.

Imagen del ejemplo

En el ejemplo podemos ver cómo crear menús en tiempo de ejecución y además cómo asignarles los eventos y acciones necesarias.
Además está implementada la creación del menú a partir de un formato de Texto. En este caso almacenado en un TMeno, pero fácilmente exportable a otros formatos.
Es ideal para aplicaciones que trabajen con menús dinámicos, con algun sistema de plugins (y el menú no sea fijo) o para aquellas que por temas de seguridad deban fucncionar con diferentes menús (segun los diferentes permisos de los usuarios, por ejemplo).

Download Descargar ejemplo

Categories: Delphi, Ejemplos Tags:

Dibujar una flecha (ordenación) en el título de un DBGrid

sábado, 15 de marzo de 2008 9 comentarios
Share Button

A veces nos puede interesar dibujar en el título de un DBGrid una flecha para indicar la ordenación ASCENDENTE o DESCENDENTE sobre esa columna; De forma muy similar a como se muesta aquí, se pueden dibujar otros símbolos e incluso colocar imágenes.

Para conseguir ésto se debe derivar el componente de DBGrid estandard y añadir los dos métodos de dibujo a la parte privada:

{ Private declarations }
procedure __PaintArrowUp(Canvas: TCanvas; var Rect: TRect);
procedure __PaintArrowDown(Canvas: TCanvas; var Rect: TRect);
 
....y la implementación....
 
// Dibuja la línea hacia abajo
procedure TNeftaliDBGrid.__PaintArrowDown(Canvas: TCanvas; var Rect: TRect);
var
  APolyLine: Array[0..2] of TPoint;
  SaveCol, BrushCol : TColor;
begin
  // Utilizamos el canvas pasado como parámetro
  with Canvas do begin
    // Guardar los valores actuales
    SaveCol := Pen.Color;
    BrushCol := Brush.Color;
    // Activar los nuevos valores depintado
    Brush.Style := bsSolid;
    Pen.Color := Self.FixedColor;
    Brush.Color := Self.FixedColor;
    // Dibujar un rectágulo debajo para tapar el título
    Rectangle(Rect.Right-13, Rect.Top+3, Rect.Right-1, Rect.Top+15);
    // Dibujamos la flecha
    Pen.Color := clGray{clBlack};
    APolyLine[0]:=Point(Rect.Right-4, Rect.Top+5);
    APolyLine[1]:=Point(Rect.Right-11, Rect.Top+5);
    APolyLine[2]:=Point(Rect.Right-8, Rect.Top+11);
    PolyLine(APolyLine);
    Pen.Color := clWhite;
    MoveTo(Rect.Right-7, Rect.Top+11);
    LineTo(Rect.Right-4, Rect.Top+5);
    // Restaurar valores guardados
    Brush.Color := BrushCol;
    Pen.Color := SaveCol;
  end;
end;
 
// Dibuja la línea hacia arriba
procedure TNeftaliDBGrid.__PaintArrowUp(Canvas: TCanvas; var Rect: TRect);
var
  SaveCol, BrushCol : TColor;
begin
  // Utilizamos el canvas pasado por parámetro.
  with Canvas do begin
    // Guardar los valores de los colores
    SaveCol := Pen.Color;
    BrushCol := Brush.Color;
    // Nuevo estilo de pintado.
    Brush.Style := bsSolid;
    Pen.Color := Self.FixedColor;
    Brush.Color := Self.FixedColor;
    // Rectangulo por debajo para tapar el título
    Rectangle(Rect.Right-13, Rect.Top+3, Rect.Right-1, Rect.Top+15);
    // Dibujar la flacha
    Pen.Color := clGray{clBlack};
    MoveTo(Rect.Right-11, Rect.Top+11);
    LineTo(Rect.Right-8, Rect.Top+5);
    LineTo(Rect.Right-7, Rect.Top+5);
    Pen.Color:=clWhite;
    MoveTo(Rect.Right-7, Rect.Top+5);
    LineTo(Rect.Right-4, Rect.Top+11);
    LineTo(Rect.Right-11, Rect.Top+11);
    //Restaurar los colores
    Brush.Color := BrushCol;
    Pen.Color := SaveCol;
  end;
end;

Para poder pintar la flecha cuando te interese se debe redefinir el método para dibujar una celda existente en el TCustomDBGrid llamado DrawCell del componente de DBGrid estandard y añadir los dos métodos de dibujo a la parte privada:

procedure DrawCell(ACol, ARow: Longint; ARect: TRect;
	            AState: TGridDrawState); override;
 
....y su implementación...
 
// Método para pintar una celda del DBGrid
procedure TNeftaliDBGrid.DrawCell(ACol, ARow: Integer; ARect: TRect;
	    AState: TGridDrawState);
begin
  inherited; // Importante la llamada al inherited
 
  // No es fila de títulos?
  if (ARow &lt;&gt; 0) then begin
    Exit;
  end;
 
  // Columna 3 (por ejemplo)
  if (ACol = 3) then begin
    __PaintArrowUp(Canvas, ARect);
  end;
 
  // Columna 4 (por ejemplo)
  if (ACol = 4) then begin
    __PaintArrowDown(Canvas, ARect);
  end;
end;

Y en la implementacion se hacen las comprobaciones de fila y columna, para que sólo pinte las flechas en la fila de títulos y en la columna que se desee. En éste ejemplo las columnas están como constantes, pero posiblemente se deberán obtener a partir de alguna variable/propiedad (por ejemplo la que el usuario pulse con el ratón. Puedes descargar el código de ejemplo del componente.

Download Descargar

Categories: Delphi, Trucos Tags: , , ,

Ejecutar DTS (SQL Server) desde Delphi

viernes, 7 de marzo de 2008 10 comentarios
Share Button

Con éste ejemplo se muestra cómo ejecutar un DTS (Data Transformation Services) creado en SQL server 2000 desde un programa de Delphi 6.
Para trabajar con DTS desde Delphi, se debe generar la unit DTS_TLB a partir del objeto «Microsoft DTSPackage Object Library (Versión X.X)».

Para generar la unit se deben seguir los pasos desde el IDE de Delphi:

  1. Project / Import Type Librery
  2. Seleccionar: «Microsoft DTSPackage Object Library (Versión X.X)»
  3. Create Unit

La unit creada se deberá añadir al USES del proyecto.

Download Descargar ejemplo

Categories: Delphi, Ejemplos Tags: ,

Color y alineación en celdas de un StringGrid

miércoles, 5 de marzo de 2008 9 comentarios
Share Button

Éste ejemplo muestra cómo programar el evento OnDrawCell de un TStringGrid para modificar la alineación y color de las celdas pertenecientes a una columna completa; Además implementa los metodos de Importar desde un fichero separado por comas e interacción con el portapapeles de filas completas (Cortar/Copiar/Pegar).

Imagen del ejemplo

En este ejemplo está el código necesario para:

  • Cambiar la alineacióin de las columnas del StringGrid (columnas 0, 1 2).
  • Cambiar el color de una columna.
  • Cambiar el color de una fila.
  • Realizar operaciones sobre el portapapeles con una o varias filas.
  • Cargar (Importar) datos a un StringGrid desde un fichero.

Download Descargar ejemplo

Categories: Delphi, Ejemplos Tags: , ,

Generar una búsqueda (Like *) utilizando SQL

martes, 4 de marzo de 2008 2 comentarios
Share Button

Éste ejemplo muestra cómo crear una sentencia SQL para realizar búsquedas sobre una tabla del estilo de «…Campo LIKE ‘Pes*’ «; Sencillo y simple, utiliza la Base de Datos de pruebas DBDemos que viene con Delphi.

Imagen del ejemplo

En el ejemplo se muestra cómo construir la sentencia SQL (que se muestra en la parte inferior) a partir del texto que se introduce en el Edit. Esta misma consulta es la que se utiliza en un control de búsqueda (TQuery) para filtrar datos de la tabla.
En este caso el texto «an» se busca en el campo Common_Name de la tabla utilizando el operador LIKE.

Download Descargar ejemplo

Categories: Delphi, Ejemplos Tags: ,

Abrir un fichero de Excel, escribir en celdas y ocultar hojas

lunes, 3 de marzo de 2008 6 comentarios
Share Button

Éste ejemplo muestra cómo realizar algunas sencillas operaciones sobre un documento de Excel a través de Automatización, sin utilizar los componentes de la paleta Servers de Delphi.

En mi caso necesitaba hacer pruebas para:

  • Escribir en una celda (Worksheets.Items[i].Cells)
  • Ocultar una hoja del libro (Worksheets.Items[i].Visible)
  • Activar otra(Worksheets.Item[i].Select).

Download Descargar ejemplo

Categories: Delphi, Ejemplos Tags:

Trocear un Bitmap a modo de puzzle en n imagenes

domingo, 2 de marzo de 2008 Sin comentarios
Share Button

Éste ejemplo muestra cómo «trocear» una imagen (un bitmap en éste caso) en n pequeñas imágenes a «modo de cudrícula»; El número de imágenes (de ancho y de alto) se puede configurar y finalmente las n partes de la imagen se guardan en disco.

Imagen del ejemplo

Las imágenes resultantes de la división se guardan en disco.

Download Descargar ejemplo

Categories: Delphi, Ejemplos Tags: ,

API LockFile para detectar instancias de aplicación activas en red

sábado, 1 de marzo de 2008 Sin comentarios
Share Button

Éste ejemplo muestra cómo utilizar la API LockFile para detectar aplicaciones que están ejecutándose.

La situación es la siguiente: Una aplicación que se ejecuta en Red. Puede haber muchos puestos/estaciones que la están ejecutándo simultáneamente. Y nos interesa saber en cada momento qué puestos la ejecutan.

Las ventajas de éste método son su sencillez (poco código), fiabilidad (ya que al ser bloqueos controlados por el sistema operativo, si algunas estación «se cuelga» no hace falta ningun código de recuperación de identificadores, el sistema librera el bloqueo) y pocos recursos, ya que aunque bloqueemos mucha posiciones del fichero, el tamaño de éste simpre será de 0 bytes.

Imagen del ejemplo

Download Descargar ejemplo

Categories: Delphi, Ejemplos Tags: ,

Realizar búsqueda incremental y visualizarla sobre un DBGrid

martes, 26 de febrero de 2008 3 comentarios
Share Button

En este ejemplo se muestra de forma sencilla de realizar una búsqueda incremental sobre un campo y mostrar el resultado de la búsqueda sobre un DBGrid estandard. Para este ejempo se ha utilizado un TClientDataset, de forma que todos los datos estén cargados en memoria (en local). Hay que tener en cuenta que este método puede ser costoso si la tabla es muy grande o los datos datos no se encuentran en local (cursores server-side, por ejemplo).

Busqueda incremental

Download Descargar ejemplo

Categories: Delphi, Ejemplos Tags: , ,