Se trata de un ejemplo sencillo que puede servir a quien esté comenzando con la creación de componentes en runtime y asignación de eventos. En este caso se trata de un visualizador de imágenes, que crea componentes TImage dentro de un TScrollBox, a modo de miniaturas, para luego visualizar esas imágenes en un control TImage a tamaño mayor.
Se utiliza también una TObjectList para almacenbar los objetos (componentes TImage y TPanel) que se van creando en ejecución para posteriormente poder acceder a ellos. Para crear los componentes se utiliza un código com este:
var
im:TImage;
i:Integer;
pnl:TPanel;begin// Para cada imagenfor i :=0to(imList.Count-1)dobegin// Crear el control imagen
im := TImage.Create(nil);// Asignar propiedades
im.Parent:= ScrollBox1;
im.Height:= ScrollBox1.Height;
im.Width:= im.Height;
im.Top:=0;
im.Left:=((im.Width+15{panel}+4)* i);
im.Transparent:=true;
im.Align:= alLeft;
im.Stretch:=True;
im.Proportional:=True;// Cargar
im.Picture.LoadFromFile(imList[i]);// vebto OnClick
im.OnClick:= ClickImage;// Añadirla a la lista de objetos
oList.Add(im);// Separados
pnl := TPanel.Create(nil);
pnl.Parent:= ScrollBox1;
pnl.Left:= im.Left+5;
pnl.Width:=15;
pnl.Height:= im.Height;
pnl.Align:= alLeft;
pnl.Color:= clBlack;// Aadirlo a la lista de objetos
oList.Add(pnl);end;
var
im:TImage;
i:Integer;
pnl:TPanel;
begin
// Para cada imagen
for i := 0 to (imList.Count - 1) do begin
// Crear el control imagen
im := TImage.Create(nil);
// Asignar propiedades
im.Parent := ScrollBox1;
im.Height := ScrollBox1.Height;
im.Width := im.Height;
im.Top := 0;
im.Left := ((im.Width + 15{panel} + 4) * i);
im.Transparent := true;
im.Align := alLeft;
im.Stretch := True;
im.Proportional := True;
// Cargar
im.Picture.LoadFromFile(imList[i]);
// vebto OnClick
im.OnClick := ClickImage;
// Añadirla a la lista de objetos
oList.Add(im);
// Separados
pnl := TPanel.Create(nil);
pnl.Parent := ScrollBox1;
pnl.Left := im.Left + 5;
pnl.Width := 15;
pnl.Height := im.Height;
pnl.Align := alLeft;
pnl.Color := clBlack;
// Aadirlo a la lista de objetos
oList.Add(pnl);
end;
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
Permite seleccionar componentes visuales (en Runtime) que haya en un form de forma visual como se hace con las imágenes en los programas de diseño o con los controles en el IDE de Delphi.
Además se pueden mover y redimensionar los controles seleccionados. Basta con soltar el control en el formulario, asignarle el control que se desea seleccionar/mover/redimensionar y activarlo.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
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.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
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 formprocedure 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 thenbegin// 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 thenbegin
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;
// 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;
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
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.
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.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…