Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Crear elementos en tiempo de ejecucion (https://www.clubdelphi.com/foros/showthread.php?t=22227)

Tecnic2 09-06-2005 17:47:30

Crear elementos en tiempo de ejecucion
 
Hola a todos,

Tengo un control TPageControl con una sola pestaña, dentro de él hay un ListView con 3 columnas. Cuando se abre mi aplicación, ésta lee unos determinados registros de una BD, y para cada uno tiene que crear una pestaña nueva igual que la primera, es decir, tendrá un nombre y caption diferentes a las demás pero deberá contener tambien un ListView igual que el primero.

Espero haberme explicado, muchas gracias por adelantado.

frudolph 09-06-2005 18:07:23

Probá con el siguiente código:

procedure TForm1.Button1Click(Sender: TObject);
var
TS: TTabSheet;
TV: TListView;
begin
TS := TTabSheet.Create(Self);
TS.Caption := 'TabSheet' + IntToStr(PageControl1.PageCount + 1);
TS.PageControl := PageControl1;
TV := TListView.Create(Self);
TV.Parent := TS;
TV.Align := alClient;
end;

Tecnic2 09-06-2005 18:35:44

Ha funcionado pero.....
 
Me ha funcionado perfectamente, muchas gracias, ahora necesito añadir 4 columnas, con su respectivo ancho y caption. Como lo hago?

Gracias.

Tecnic2 09-06-2005 18:55:00

Me contesto a mi mismo
 
Ya he descubierto como añadir columnas, lo que se me resiste y no llego a averiguar es cómo aplicarle un estilo de fuente, es decir, quiero que la propiedad Font del LlistView que creo en tiempo de ejecución tenga la letra Verdana y tamaño 8.

Gracias por adelantado.

Tecnic2 09-06-2005 19:25:52

Añado mas....
 
Una cosa en la que no habia pensado....

Si creo los ListViews en tiempo de ejecución, cómo lo hago para introducir código en sus eventos?
Al no estar creados en el diseño no puedo programarlo !!!

:confused: :confused: :confused:

pijo 09-06-2005 19:44:00

hola
a ver vamos por partes
para lo de la fuente, con el mismo código que has puesto pero modificando la propiedad FONT del listview que has creado:

procedure TForm1.Button1Click(Sender: TObject);
var
TS: TTabSheet;
TV: TListView;

begin
TS := TTabSheet.Create(Self);
TS.Caption := 'TabSheet' + IntToStr(PageControl1.PageCount + 1);
TS.PageControl := PageControl1;
TV := TListView.Create(Self);
TV.Parent := TS;
TV.Align := alClient;
TV.Font.Name := 'Verdana';
Tv.Font.Size := 8;
end;

En relacion a lo de meter código en los eventos:
Tienes que tener previamente creados los procedures para poderlos asignar en tiempo de ejecución a los eventos del nuevo TlistView, por ejemplo:

procedure TForm1.HacerClick(sender : TObject);
begin
// Lo que se tenga que hacer cuando hacen click
showmessage('Click');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
TS: TTabSheet;
TV: TListView;
begin
TS := TTabSheet.Create(Self);
TS.Caption := 'TabSheet' + IntToStr(PageControl1.PageCount + 1);
TS.PageControl := PageControl1;
TV := TListView.Create(Self);
TV.Parent := TS;
TV.Align := alClient;
TV.Font.Name := 'Verdana';
Tv.Font.Size := 8;
Tv.onclick := HacerClick;

end;

Tecnic2 10-06-2005 12:02:55

Ya funciona ;-)
 
Muchas gracias, era exactamente eso, no sé qué haria sin vosotros.....


GRACIAS.

Lepe 10-06-2005 16:29:12

por favor, encerrad el código entre

[ delphi ]
aqui vuestro codigo
[ /delphi ]

(sin espacios entre corchetes) Así consigues que respete el identado y aparezca las palabras reservadas en negrita y colores.

Un saludo
Código Delphi [-]
procedure Saludos();
begin 
   ShowMessage(' Un saludo y hasta luego');
end;

Tecnic2 14-06-2005 18:33:45

Una cosa más...
 
Por cierto, la función asignada al evento OnClick del ListView creado en tiempo de ejecución puede contener parámetros?

Garcias por adelantado.

Lepe 15-06-2005 12:17:50

El evento OnClick no. pero dentro del evento Onclick, puedes hacer algo genérico y lanzar otro evento, aquí si puedes usar los parámetros que quieras.

Cuando se hace clic en el listview, entra en el HacerClick, en ese evento, miro si hay algun item seleccionado, y lanzo un evento nuevo el Onclick2 que lleva los parámetros que yo quiero, y el programa irá al procedimiento Recibir.

Como no explicas exactamente lo que deseas hacer, yo he pasado 2 parámetros, la propiedad TExt del item seleccionado y el texto de la segunda columna del item seleccionado.

Código Delphi [-]
// Creamos un nuevo evento
type TOnclick2 = procedure (textoItem:string; SubString:string) of object; 

TForm1 = Class(Tform);
...
private Fonclic2:Tonclick2;

public
  OnClick2 : Tonclick2 read Fonclick2 write Fonclick2;

end;
implementation

procedure TForm1.Recibir(texto:string; SubString:string);
begin
  // aqui se llega cuando se haga clic en el listview,
// con los parametros que tu necesitas
end;

procedure TForm1.HacerClick(sender : TObject);
var Texto, subtexto:string;
begin
 if Listview.Selected<>Nil then
 begin
    texto := listview.selected.text;
    subtexto := listview.Selected.String[1];

// con esto lanzamos el evento personalizado
    if Assigned(FOnclick2) then
      FOnclick2(texto, subtexto); 
 end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
TS: TTabSheet;
TV: TListView;
begin
TS := TTabSheet.Create(Self);
TS.Caption := 'TabSheet' + IntToStr(PageControl1.PageCount + 1);
TS.PageControl := PageControl1;
TV := TListView.Create(Self);
TV.Parent := TS;
TV.Align := alClient;
TV.Font.Name := 'Verdana';
Tv.Font.Size := 8;
Tv.onclick := HacerClick;
TV.Oclick2:= recibir;


Un saludo

Tecnic2 15-06-2005 19:06:24

Lo que yo quiero hacer es lo siguiente...
 
En cada ListView hay información de una base de datos, información que tengo que actualizar cada cierto tiempo (cada ListView se actualiza en intervalos diferentes), para eso creo un Timer en tiempo de ejecución para cada ListView, al que al crearlo le asigno su intervalo de tiempo.

Entonces, quiero que en el evento OnTimer de cada Timer ejecute la función de actualizar, función que contiene como parámetros el ListView asociado a ese Timer y el nombre de la tabla a actualizar de la base de datos.

Cambia las cosa mi nuevo planteamiento?
Espero haberme explicado.

Muchas gracias.

jachguate 15-06-2005 19:58:29

Podes valerte de la propiedad TAG del timer. Esta propiedad no tiene un uso particular en la VCL, y es un entero que perfectamente puede contener un puntero ya que son del mismo tamaño.

Entonces, cuando creas el timer y el list view podrias hacer algo como:

Código Delphi [-]
  NuevoTimer := TTimer.Create;
  NuevoListView := TListView.Create(parametros);
  NuevoTimer.Tag := Integer(NuevoListView);  //asocias el listview al timer.

asi, en el evento OnTimer, podrias averiguar cual es el listview asociado asi:

Código Delphi [-]
Procedure TForm1Timer1Timer(Sender : TObject);

Var
  aListView : TListView;

Begin
  aListView := TListView(Pointer((Sender as TComponent).Tag));
  Actualizar(aListView);
End;

Hasta luego.

;)

Lepe 15-06-2005 20:12:42

Cita:

Empezado por Tecnic2
Cambia las cosa mi nuevo planteamiento?

Pues no sé que tiene que ver lo del timer, con el evento Onclick, ya que el Timer es cosa automática, el ususario no tiene que hacer click en ningun lado

Creo que no te entendí :confused:


Un saludo


La franja horaria es GMT +2. Ahora son las 10:12:38.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi