Función para buscar ficheros en un directorio de forma recursiva.
Devuelve una lista de nombres de fichero encontrados a partir de la carpeta inicial StartDir, que cumplen el patrón especificado por FileMask.
Mediante recursively se indica si se desea
hacer la busqueda en los subdirectorios.
El resultado se devuelve en FilesList (TStringList), que es la lista que se rellena con los nombres de fichero encontrados.
{: Devuelve una lista de nombres de fichero encontrados a partir
de la carpeta inicial StartDir, que cumplen el patrón especificado
por FileMask.Mediante recursively se indica si se desea hacer la
busqueda en los subdirectorios.
StartDir Carpeta desde la que empezar a buscar.
FileMask Patrón que han de cumplir los ficheros.
Recursively Si hay que continuar la búsqueda en los subdirectorios.
FilesList Lista con los nombres de fichero encontrados.
}procedure FindFiles(StartDir, FileMask:string;
recursively:boolean;var FilesList: TStringList);const
MASK_ALL_FILES ='*.*';
CHAR_POINT ='.';var
SR: TSearchRec;
DirList: TStringList;
IsFound:Boolean;
i:integer;beginif(StartDir[length(StartDir)] <> '\')thenbegin
StartDir := StartDir +'\';end;// Crear la lista de ficheos en el dir. StartDir (no directorios!)
IsFound :=FindFirst(StartDir + FileMask,
faAnyFile - faDirectory, SR)=0;// MIentras encuentrewhile IsFound dobegin
FilesList.Add(StartDir + SR.Name);
IsFound :=FindNext(SR)=0;end;FindClose(SR);// Recursivo?if(recursively)thenbegin// Build a list of subdirectories
DirList := TStringList.Create;// protecciontry
IsFound :=FindFirst(StartDir + MASK_ALL_FILES,
faAnyFile, SR)=0;while IsFound dobeginif((SR.Attrand faDirectory) <> 0)and(SR.Name[1] <> CHAR_POINT)thenbegin
DirList.Add(StartDir + SR.Name);
IsFound :=FindNext(SR)=0;end;// ifend;// whileFindClose(SR);// Scan the list of subdirectoriesfor i :=0to DirList.Count-1dobegin
FindFiles(DirList[i], FileMask, recursively, FilesList);end;finally
DirList.Free;end;end;end;
{: Devuelve una lista de nombres de fichero encontrados a partir
de la carpeta inicial StartDir, que cumplen el patrón especificado
por FileMask.Mediante recursively se indica si se desea hacer la
busqueda en los subdirectorios.
StartDir Carpeta desde la que empezar a buscar.
FileMask Patrón que han de cumplir los ficheros.
Recursively Si hay que continuar la búsqueda en los subdirectorios.
FilesList Lista con los nombres de fichero encontrados.
}
procedure FindFiles(StartDir, FileMask: string;
recursively: boolean; var FilesList: TStringList);
const
MASK_ALL_FILES = '*.*';
CHAR_POINT = '.';
var
SR: TSearchRec;
DirList: TStringList;
IsFound: Boolean;
i: integer;
begin
if (StartDir[length(StartDir)] <> '\') then begin
StartDir := StartDir + '\';
end;
// Crear la lista de ficheos en el dir. StartDir (no directorios!)
IsFound := FindFirst(StartDir + FileMask,
faAnyFile - faDirectory, SR) = 0;
// MIentras encuentre
while IsFound do begin
FilesList.Add(StartDir + SR.Name);
IsFound := FindNext(SR) = 0;
end;
FindClose(SR);
// Recursivo?
if (recursively) then begin
// Build a list of subdirectories
DirList := TStringList.Create;
// proteccion
try
IsFound := FindFirst(StartDir + MASK_ALL_FILES,
faAnyFile, SR) = 0;
while IsFound do begin
if ((SR.Attr and faDirectory) <> 0) and
(SR.Name[1] <> CHAR_POINT) then begin
DirList.Add(StartDir + SR.Name);
IsFound := FindNext(SR) = 0;
end; // if
end; // while
FindClose(SR);
// Scan the list of subdirectories
for i := 0 to DirList.Count - 1 do begin
FindFiles(DirList[i], FileMask, recursively, FilesList);
end;
finally
DirList.Free;
end;
end;
end;
Muestra como utilizar un BITMAP (en este caso extraído de un TImage) para modificar el cursor activo. Modificando un poco el Tip/Truco es fácil obtener la imagen de disco o desde un recurso.
Se utiliza la API CreateIconIndirect para generar el cursor que posteriormente se activará.
Se puede usar un color de fondo como transparente para obtener un cursos «opaco» o un segundo BITMAP para combinarlo con el primero y así obtener también efectos de transparencia en el cursor generado.
// Crear los bitmaps
BitmapMask := TBitmap.Create;
Bitmap := TBitmap.Create;// protecciontry// Cargar las imágenes
BitmapMask.Assign(Image2.Picture.Bitmap);
Bitmap.Assign(Image1.Picture.Bitmap);// Crear el icono del cursorwith iconInfo dobegin
fIcon :=false;
xHotspot :=(Bitmap.Widthdiv4);
yHotspot :=(Bitmap.Heightdiv3);
hbmMask := BitmapMask.Handle;
hbmColor := Bitmap.Handle;end;// Asignar el icono
Screen.Cursors[1]:= CreateIconIndirect(iconInfo);Self.Cursor:=1;finally// Liberar
BitmapMask.Free;
Bitmap.Free;end;
// Crear los bitmaps
BitmapMask := TBitmap.Create;
Bitmap := TBitmap.Create;
// proteccion
try
// Cargar las imágenes
BitmapMask.Assign(Image2.Picture.Bitmap);
Bitmap.Assign(Image1.Picture.Bitmap);
// Crear el icono del cursor
with iconInfo do begin
fIcon := false;
xHotspot := (Bitmap.Width div 4);
yHotspot := (Bitmap.Height div 3);
hbmMask := BitmapMask.Handle;
hbmColor := Bitmap.Handle;
end;
// Asignar el icono
Screen.Cursors[1] := CreateIconIndirect(iconInfo);
Self.Cursor := 1;
finally
// Liberar
BitmapMask.Free;
Bitmap.Free;
end;
Es ejemplo completo se puede descargar <AQUÍ>. Descargar.
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:
// ================================================================// 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 < 0then
RetVar :=falseelsebegin// Obtener las fechas
RetVar :=true;
GetFileTime(FileHandle,@FTimeC,@FTimeA,@FTimeM);// CerrarFileClose(FileHandle);// Creado
FileTimeToLocalFileTime(FTimeC,LTime);if FileTimeToSystemTime(LTime,STime)thenbegin
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)thenbegin
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)thenbegin
Modified :=EncodeDate(STime.wYear,STime.wMonth,STime.wDay);
Modified := Modified +EncodeTime(STime.wHour,STime.wMinute,
STime.wSecond, STime.wMilliSeconds);end;end;
Result := RetVar;end;
// ================================================================
// 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:
É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.
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).
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 abajoprocedure TNeftaliDBGrid.__PaintArrowDown(Canvas: TCanvas;var Rect: TRect);var
APolyLine:Array[0..2]of TPoint;
SaveCol, BrushCol : TColor;begin// Utilizamos el canvas pasado como parámetrowith Canvas dobegin// 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 arribaprocedure TNeftaliDBGrid.__PaintArrowUp(Canvas: TCanvas;var Rect: TRect);var
SaveCol, BrushCol : TColor;begin// Utilizamos el canvas pasado por parámetro.with Canvas dobegin// 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;
{ 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 DBGridprocedure TNeftaliDBGrid.DrawCell(ACol, ARow:Integer; ARect: TRect;
AState: TGridDrawState);begininherited;// Importante la llamada al inherited// No es fila de títulos?if(ARow <>0)thenbegin
Exit;end;// Columna 3 (por ejemplo)if(ACol =3)thenbegin
__PaintArrowUp(Canvas, ARect);end;// Columna 4 (por ejemplo)if(ACol =4)thenbegin
__PaintArrowDown(Canvas, ARect);end;end;
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 <> 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.
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:
É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).
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.
É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.
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.
É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)
É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.
Las imágenes resultantes de la división se guardan en disco.
Usamos cookies para asegurar que te damos la mejor experiencia en nuestra web. Si continúas usando este sitio, asumiremos que estás de acuerdo con ello.Aceptar