Archivo

Archivo para la categoría ‘Delphi’

Convertir un Menu en un TreeView

domingo, 24 de febrero de 2008 3 comentarios
Share Button

En este ejemplo se muestra de forma sencilla cómo «pasar» o convertir un Menu existente (componente TMainMenu) en un TTreeView; Conservando la jerarquía de los elementos y asignando las imágenes que ya existan en el ejemplo.

Imagen del ejemplo

Download Descargar ejemplo

Categories: Delphi, Ejemplos Tags: , ,

Obtener la lista de procesos ejecutándose

domingo, 24 de febrero de 2008 1 comentario
Share Button

Con ésté trozo de código se puede obtener la lista de los procesos (nombre del ejecutable) que están en marcha en ese momento en la máquina:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var
  i: Integer;
  bContinue: BOOL;
begin
   // Limpiar la lista
   ListBox1.Items.Clear;
   // Recoge la lista de procesos en éste momento
   aSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
   aProcessEntry32.dwSize := SizeOf(aProcessEntry32);
   // Acceder al primer proceso
   bContinue := Process32First(aSnapshotHandle, aProcessEntry32);
   // Recorerr los procesos activos
   while (Integer(bContinue) <> 0) do begin
      // Añadirlo a la lista
      ListBox1.Items.Add(ExtractFileName(aProcessEntry32.szExeFile));
      // Hay más?
      bContinue := Process32Next(aSnapshotHandle, aProcessEntry32);
   end;
   // cerrar la estructura
   CloseHandle(aSnapshotHandle);

Utilizando aProcessEntry32 se puede obtener más información de cada uno de los procesos, como:

* Identificador
* Nombre competo
* …

IntToHex(aProcessEntry32.th32ProcessID, 4)
aProcessEntry32.szExeFile

Categories: Delphi, Trucos Tags: , , ,

Crear, mover y redimensionar controles en Runtime (IDE)

viernes, 15 de febrero de 2008 3 comentarios
Share Button

Se trata de un sencillo ejemplo para mostrar el funcionamiento del componente TSelectOnRuntime que se encuentra en la sección de componentes de ésta página. De una forma muy burda (pero suficiente para ver el funcionamiento del componente) se ilustra con una imitación a IDE de Delphi cómo se pueden crear y modificar diferentes componentes en Runtime.

Se puede ver cómo se crean componenetes en «tiempo de ejecución» y cómo se mueven y redimensionan utilizando el componente TSelectOnRuntime.

Ejemplo de Runtime Designer

Download Descargar ejemplos

Categories: Delphi, Ejemplos Tags: , , ,

Mover controles de un form en Runtime

sábado, 2 de febrero de 2008 2 comentarios
Share Button

Creando tres sencillos procedimientos en un formulario se pueden mover controles visuales en Runtime colocados en un form siempre que deriven de TControl. Basta con definir los siguientes procedimientos y asignarlos a todos los controles que queramos mover; Además se deben definir dos variables en la parte privada del form:

NOTA: Los procedimientos se deben definir no en la parte privada, sino como eventos del form.

En la parte final de artículo se puede descargar un ejemplo compilado con Delphi 6.

  • procedure MouseMove;
  • procedure MouseUp;
  • procedure MouseDown;
// Definirlos como ventos del form
procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure MouseUp(Sender: TObject; Button: TMouseButton; 
                           Shift: TShiftState; X, Y: Integer);
procedure MouseDown(Sender: TObject; Button: TMouseButton; 
                               Shift: TShiftState; X, Y: Integer);
 
...
 
// Definir éstas variables en la parte privada...
private
  Capturing:Boolean;
  MouseDownSpot:TPoint;
 
....
 
// IMPLEMENTACION
// Procedimintos a asignar a los eventos de los controles...
procedure TForm1.MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
  // Estamos capturando?
  if Capturing then begin
    // Mover el componente
    TControl(Sender).Left := TControl(Sender).Left - (MouseDownSpot.x - x);
    TControl(Sender).Top := TControl(Sender).Top - (MouseDownSpot.y - y);
  end;
end;
 
 
procedure TForm1.MouseUp(Sender: TObject; Button: TMouseButton; 
                            Shift: TShiftState; X, Y: Integer);
begin
  // Estamos capturando?
  if Capturing then begin
    ReleaseCapture; // Liberar la captura
    Capturing := false;
    TControl(Sender).Left := TControl(Sender).Left - (MouseDownSpot.x - x);
    TControl(Sender).Top := TControl(Sender).Top - (MouseDownSpot.y - y);
  end;
end;
 
procedure TForm1.MouseDown(Sender: TObject; Button: TMouseButton; 
                                          Shift: TShiftState; X, Y: Integer);
begin
  // Comenzar la captura y movimiento
  Capturing := true;
  MouseDownSpot.X := x;
  MouseDownSpot.Y := Y;
end;

Se puede descargar un ejemplo:

Descargar

Categories: Delphi, Trucos Tags: , ,

Ejemplo sobre Threads

domingo, 6 de enero de 2008 3 comentarios
Share Button

Este ejemplo es una muestra simple de como crear diferentes Threads y hacerlos funcionar; Es básico pero puede servir como comienzo para aprender el funcionamento. Como crearlos, ponerlos en marcha, pausarlos/reanudarlos y modificar su prioridad.
Hay diferentes tipos, aunque al final la estructura de todos ellos es similar.

Imagen del ejemplo

Download Descargar ejemplo

Categories: Delphi, Ejemplos Tags: ,

Ejemplo de tratamiento de «Planos y figuras»

viernes, 4 de enero de 2008 5 comentarios
Share Button

Es bantante común encontrarse en programación con aplicaciones que requieren una interface del tipo «plano y figuras». Son aquellos programas cuya entrada de datos se realiza a partir de un formulario que presenta un plano y donde se deben poder «colocar» elementos/objetos que después se utilizarán en el programa.

Planos de ejemplo

En éstos proyectos suele haber dos «modos de trabajo» básicos:

  • Modo Administrador: Se utiliza para configurar el escenario de trabajo. Seleccionar un Mapa, y crear los objetos, con las propiedades que luego utilizará el programa. Un mismo programa puede trabajar con varios escenarios.
  • Modo Explotación: Es el modo en que se trabaja con el programa normalmente; Se basa en una o varias configuraciones que se han creado anteriormente en el «modo administrador».

Como ayuda a éste tipo de Interfaces de cara al usuario, se han creado los componentes TSaveComps y TSelectOnRuntime que puedes encontrar en la sección de componentes de ésta página. Y como muestra para éstos dos componentes se ha creado ésta demo. Muestra cómo sería su utilización en una interface sencilla, que en éste caso simula un restaurante. Muestra el funcionamiento básico de ambos modos de trabajo.

Imagen de la demo

Download Descargar ejemplo

Descargar un fichero y copiarlo en local (Indy)

miércoles, 2 de enero de 2008 2 comentarios
Share Button

Se trata de un sencillo ejemplo para mostrar cómo descargar un fichero desde internet y copiarlo en local.
En su día lo desarrollé para montar la actualización en línea de una aplicación.
Previamente a esto, se descargaba un fichero de texto para comprobar ambas versiones; Si la actual estaba anticuada, se descargaba la nueva utilizando éste sistema.

Descargar fichero

Download Descargar ejemplo

Categories: Delphi, Ejemplos Tags: , ,

Simular barras flotantes en torno al formulario

miércoles, 2 de enero de 2008 1 comentario
Share Button

La idea de éste ejemplo llega a partir de una petición de obtener en un formulario unas barras de herramientas (toolbars) similares a las que aparecen en los Expertos para Delphi CnPack/cnWizard (muy buenos y gratuítos, por cierto).
En el caso de los CnPack, cuando aparece un formulario en el IDE de Delphi, aparecen varias barras de herramientas «flotantes» que se «pegan» literalmente al formulario.

De forma que si mueves el form, automáticamente se mueven las barras también. Una imagen descriptiva podría ser esta:

Barras flotantes

La forma de conseguirlo es utlizando el mensaje WM_WINDOWPOSCHANGING accesible desde los descencientes de TCustomForm.

Download Descargar ejemplo

Categories: Delphi, Ejemplos Tags: , , ,

Arrastrar elementos entre dos TListBox

martes, 1 de enero de 2008 6 comentarios
Share Button

Se trata de un ejemplo de cómo arrastrar elementos entre dos componentes de tipo TListBox utilizando el ratón.
Está basado en un formulario que ya trae el propio Delphi como ejemplo y accesible desde el menú de:

File/New/Other/Forms/Dual List Box

En este ejemplo se añaden 4 procedimientos que introducen la posibilidad de mover elementos utilizando el ratón y que en el original sólo se puede realizar utilizando controles del formulario.
La técnica de Drag & Drop que se usa en este ejemplo entre dos TListBox, puede ser fácilmente exportable para utilizarla con otros controles; StringGrids, DBGrid,…

Arrastrar entre 2 TListbox

Download Descargar ejemplo

Modificar propiedades de controles en ejecución utilizando RTTI

miércoles, 5 de diciembre de 2007 2 comentarios
Share Button

A veces durante la ejecución de código necesitamos modificar una determinada propiedad de diferentes tipos de controles. Para la explicación podemos pensar por ejemplo en como desactivar (Enabled=False) todos los controles de un formulario; Una primera opción podría ser un código como éste:

// recorrer los controles
for i := 0 to (Self.ComponentCount - 1) do begin
 
   // Es un Edit
   if (Components[i] is TEdit) then
   TEdit(Components[i]).Enabled := False;
   // Es un LAbel
   if (Components[i] is TLabel) then
   TLabel(Components[i]).Enabled := False;
   // Es un ListBox
   if (Components[i] is TListBox) then
   TListBox(Components[i]).Enabled := False;
   ...
end;

Una implementación como ésta tiene muchos problemas e inconvenientes; Los más claros podrían ser:* Es poco «ortodoxa», por decirlo así;

  • Es un código repetitivo y nada eficiente.
  • Es por definición incompleta, ya que el número de componentes que podemos tener en un form es inmenso y de muchas clases (yo sólo las básicas que trae Delphi).
  • Es poco flexible.

Utilizando RTTI podemos de forma relativamente sencilla modificar todos los componentes utilizando una única instrucción.
Podemos utilizar un procedimiento como éste:

{:Asigna valor a una propiedad a través del Nombre (RTTI). }
function SetPropAsString(AObj: TObject; const PropName, Value: String):Boolean;
var
   PInfo: PPropInfo;
begin
   // Intentamos acceder (con un puntero) a la info. de la propiedad
   PInfo := GetPropInfo(AObj.ClassInfo, PropName);
   Result := PInfo &lt;&gt; nil;
   // Se ha obtenido la información...
   if (Result) then begin
      // Se ha encontrado la propiedad con éste nombre; Chequear el tipo...
      if (PInfo^.Proptype^.Kind = tkString) or
          (PInfo^.Proptype^.Kind = tkLString) then begin
        // Asignar el valor de tipo String
        SetStrProp(AObj, PInfo, Value);
      end
      else if (PInfo^.Proptype^.Kind = tkInteger) then begin
        // Asignar el valor...
        if (PInfo^.PropType^.Name = 'TColor') then begin
          SetOrdProp(AObj, PInfo, StringToColor(Value));
        end
      else if (PInfo^.PropType^.Name = 'TCursor') then begin
        SetOrdProp(AObj, PInfo, StringToCursor(Value));
      end
      else begin
        SetOrdProp(AObj, PInfo, StrToInt(Value));
      end;
   end
   else if (PInfo^.Proptype^.Kind = tkEnumeration) then begin
    // Bloque de proteccion
    try
      if (PInfo^.PropType^ = TypeInfo(System.Boolean)) then begin
        SetOrdProp(AObj, PInfo, StrToInt(Value));
      end
      else begin
        SetOrdProp(AObj, PInfo, StrToInt(Value));
      end;
    except
      raise;
    end;
   end
   else begin
    Result := False;
   end;
  end
  else begin
    // No se ha encontrado la propiedad con ese nombre
    Result := False;
  end;
end;

Su utilización es muy sencilla, y en el ejemplo anterior el código utilizado pasaría a ser similar a éste:

NOTA: Añadir la unit TypInfo al USES.

NOTA2: (Gracias Arsenio por comentarmelo) Se deben añadir al uses también las units Graphics y Controls ya que son usados por StringToColor y StringToCursor respectivamente.

// recorrer los controles
for i := 0 to (Self.ComponentCount - 1) do begin
   SetPropAsString(Components[i], 'Enabled', '0'{FALSE});
end;
// Otros ejemplos
SetPropAsString(Components[i], 'Left', '10');
SetPropAsString(Components[i], 'Color', 'clRed');
...
Categories: Delphi, Trucos Tags: , , ,