Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   checklistbox y pagecontrol para usarlo dockeable (https://www.clubdelphi.com/foros/showthread.php?t=76357)

asdbernardo 25-10-2011 19:13:37

checklistbox y pagecontrol para usarlo dockeable
 
Buenas foristas del clubdelphi, tengo ciertas dudas con respecto a la creacion en modo de ejecucion de checklistbox, y transformarlo en dockeable y colocarlo dentro del page control como pestañas.. el punto es.

estoy intentando crear mediante un boton y un combobox los checklistbox. la cuestion es cuando se repite el nombre dice que ya esta creado uno, como capturo que ese checklistbox se cerro y libere el formulario? aqui mas o menos lo que llevo..

PD: soy novato, estoy animandome con el delphi gracias de antemano.. aca el codigo

Código Delphi [-]
............. 
 public
  cajas : tchecklistbox;
      { Public declarations }
  end;
.............

procedure TfrmVentas.Button1Click(Sender: TObject);
begin

  cajas := tchecklistbox.Create(frmventas);
  cajas.Top := 10;
  cajas.Left := 10;
  cajas.Height := 300;
  cajas.Width := 300;
  cajas.Parent := pagecontrol1;
  cajas.Name := combobox1.Text;
  cajas.Items.Add('el nombre es:'+cajas.Name);
  cajas.Items.Add(combobox1.Text);
  cajas.DragKind := dkDock;
  cajas.DragMode := dmAutomatic;

 end;

el combobox lo llenare con base de datos, son como grupos.. cuando seleccione grupo1 buscara en base de datos mysql todos los que esten con ese grupo... los agregue en checklistbox.. ( todavia no llego ahi ) pero estoy tratando de que sea asi... porque las pestañas necesito que se llamen igual como el grupo, pero no consigo ponerle caption ... y mire aca DockForm, pero no se mucho si sea factible crear formularios y dentro de ese formulario el checklistbox, porque necesito capturar cuando se cierre el checklistbox para liberar ese checklistbox para que pueda ser creado de nuevo..

por otra parte tmb pense en ejecutarlos todos los grupos y tenerlos ocultos pero no se si seria practico eso... aparte que no conozco cuantos grupos seran.. ya pueden ser ilimitados grupos...

Saludos espero puedan orientarme un poco..

ecfisa 25-10-2011 20:05:40

Hola adsbernardo.

Cita:

la cuestion es cuando se repite el nombre dice que ya esta creado uno, como capturo que ese checklistbox se cerro
Si no te entendí mál, creo que podrías hacerte una función que verifique si el CheckListBox existe:
Código Delphi [-]
...
function TForm1.ExisteCtrl(Nombre: string):Boolean;
var
  i: Integer;
begin
  Result:= False;
  for i:= 0 to ComponentCount -1 do
    if Components[i].Name = Nombre then
      Result:= True;
end;

Para usarla por ejemplo:
Código Delphi [-]
procedure TfrmVentas.Button1Click(Sender: TObject);
begin
  if not ExisteCtrl(ComboBox1.Text) then  // ¿ Ya fue creado ?
    with TCheckListBox.Create(Self) do    // no, crearlo
    begin
      Parent:= Self;
      Name:= ComboBox1.Text;
      DragKind:= dkDock;
      DragMode:= dmAutomatic;
      ...
    end
   else                                       
     ShowMessage('Ya existe');  //si, ya existe. (aca la acción que desees hacer)
end;

Un saludo.

asdbernardo 25-10-2011 20:42:27

[quote=ecfisa;416704] Hola adsbernardo.

Si no te entendí mál, creo que podrías hacerte una función que verifique si el CheckListBox existe:
Código Delphi [-]
...
function TForm1.ExisteCtrl(Nombre: string):Boolean;
var
  i: Integer;
begin
  Result:= False;
  for i:= 0 to ComponentCount -1 do
    if Components[i].Name = Nombre then
      Result:= True;
end;

Con respecto a esa funcion si estoy creando checklistbox en modo de ejecucion, como hago para que verifique todos los creados? porq en ComponentCount y en Components[i].Name me dice que no esta declarado, asumo que aqui es donde coloco los checklistbox?

Añado: que estoy creando los checklistbox en modo ejecucion, en ese caso como se deberia validar si esta o no esta? con la funcion que me diste?

pd: Mil gracias amigo ecfisa!

ecfisa 25-10-2011 21:01:31

Hola.

No entiendo bién a que te referis, pero a ver si puedo explicarme mejor:

La función 'ExisteCtrl' (o el nombre que le des) recorre todos los componentes del form verificando que el componente exista (haya sido creado) y devuelve True si es así. Caso contrario devuelve False.

Como en la creación del TCheckListBox le asignas el nombre de este modo:
Código Delphi [-]
  cajas.Name := combobox1.Text;
Antes de dicha creación deberías verificar:
Código Delphi [-]
 
  if ExisteCtrl(combobox1.Text) then 
  ...

Agregándola a tu código inicial sería:
Código Delphi [-]
procedure TfrmVentas.Button1Click(Sender: TObject);
begin
  if not ExisteCtrl(ComboBox1.Text) then     // si no existe el componente
  begin
    cajas := tchecklistbox.Create(frmventas);  // crearlo
    cajas.Top := 10;
    cajas.Left := 10;
    cajas.Height := 300;
    cajas.Width := 300;
    cajas.Parent := pagecontrol1;
    cajas.Name := combobox1.Text;
    cajas.Items.Add('el nombre es:'+cajas.Name);
    cajas.Items.Add(combobox1.Text);
    cajas.DragKind := dkDock;
    cajas.DragMode := dmAutomatic;
   end
   else  // el componente existe,
          // aquí la accion que decidas tomar 
          // o ninguna en cuyo caso sobraría 'else'
end;

Un saludo.

Edito: No había visto tu último comentario:
Cita:

Añado: que estoy creando los checklistbox en modo ejecucion, en ese caso como se deberia validar si esta o no esta? con la funcion que me diste?
Si, asi es Bernardo.

asdbernardo 25-10-2011 21:41:59

Cita:

Empezado por ecfisa (Mensaje 416709)
Hola.

No entiendo bién a que te referis, pero a ver si puedo explicarme mejor:

La función 'ExisteCtrl' (o el nombre que le des) recorre todos los componentes del form verificando que el componente exista (haya sido creado) y devuelve True si es así. Caso contrario devuelve False.

Como en la creación del TCheckListBox le asignas el nombre de este modo:
Código Delphi [-]
  cajas.Name := combobox1.Text;
Antes de dicha creación deberías verificar:
Código Delphi [-]
 
  if ExisteCtrl(combobox1.Text) then 
  ...

Agregándola a tu código inicial sería:
Código Delphi [-]
procedure TfrmVentas.Button1Click(Sender: TObject);
begin
  if not ExisteCtrl(ComboBox1.Text) then     // si no existe el componente
  begin
    cajas := tchecklistbox.Create(frmventas);  // crearlo
    cajas.Top := 10;
    cajas.Left := 10;
    cajas.Height := 300;
    cajas.Width := 300;
    cajas.Parent := pagecontrol1;
    cajas.Name := combobox1.Text;
    cajas.Items.Add('el nombre es:'+cajas.Name);
    cajas.Items.Add(combobox1.Text);
    cajas.DragKind := dkDock;
    cajas.DragMode := dmAutomatic;
   end
   else  // el componente existe,
          // aquí la accion que decidas tomar 
          // o ninguna en cuyo caso sobraría 'else'
end;

Un saludo.

Edito: No había visto tu último comentario:

Si, asi es Bernardo.

Ok amigo Ecfisa gracias de nuevo por tomarte la amabilidad de responderme.. coloque la funcion, pero me muestra undeclared identifiquer? ComponentCount y en Components[i].Name por eso te hice la pregunta ... Saludos voy a chequear a ver...

ecfisa 25-10-2011 22:02:43

Hola Bernardo.
Cita:

me muestra undeclared identifiquer
Es probable que hayas declarado la cabecera como función y no como método de TfrmVentas, ya que en realidad es Self.ComponentCount (o visto de otro modo, frmVentas.ComponentCount).

Debería estar más o menos así:
Código Delphi [-]
type
  TfrmVentas = class(TForm)
  ...
  private
     function ExisteCtrl(Nombre: string):Boolean; // puede ir en la sección public...
  public
  end;
...
implementation

function TfrmVentas.ExisteCtrl(Nombre: string):Boolean;
var
  i: Integer;
begin
  Result:= False;
  for i:= 0 to ComponentCount -1 do
    if Components[i].Name = Nombre then
      Result:= True;
end;
...

También se puede utilizar como función pero deberás indicar el form a que te refieres precediendo a ComponentCount y Components así:
Código Delphi [-]
   frmVentas.ComponentCount ...
   frmVentas.Components[i]...

Un saludo.

asdbernardo 25-10-2011 22:07:26

Si amigo, acabe de componerlo quedo así,
la función
Código Delphi [-]

function ExisteCtrl(Nombre: string):Boolean;
var
  J: Integer;
begin
   with frmventas do
    begin
  Result:= False;
  for J:= 0 to ComponentCount - 1 do
    if Components[J].Name = Nombre then
      Result:= True;
    end;
end;

Código Delphi [-]
procedure TfrmVentas.Button1Click(Sender: TObject);
begin
if not ExisteCtrl(ComboBox1.Text) then  // ¿ Ya fue creado ?
    with TCheckListBox.Create(Self) do    // no, crearlo
    begin
  cajas := tchecklistbox.Create(frmventas);
  cajas.Top := 10;
  cajas.Left := 10;
  cajas.Height := 300;
  cajas.Width := 300;
  cajas.Parent := pagecontrol1;
  cajas.Name := combobox1.Text;
  cajas.Items.Add('el nombre es:'+cajas.Name);
  cajas.Items.Add(combobox1.Text);
  cajas.DragKind := dkDock;
  cajas.DragMode := dmAutomatic;
    end
    else
     ShowMessage('Ya existe');  //si, ya existe. (aca la acción que desees hacer)
 end;

Gracias amigo ecfisa, Muy amable! y sobre todo con excelente paciencia..

PD: Hoy estoy con poca cabeza, espero ya recuperarme!

cloayza 26-10-2011 15:39:07

Otra alternativa para prescindir de crear una funcion que busque el componente es

Código Delphi [-]
procedure TfrmVentas.Button1Click(Sender: TObject);
begin
{FindComponent, se encuentra en la Unit Classes
Devuelve el componente asociado al nombre que recibe de parametro}
    if FindComponent(ComboBox1.Text)=Nil then  // ¿ Ya fue creado ?
    with TCheckListBox.Create(Self) do    // no, crearlo
    begin
           cajas := tchecklistbox.Create(frmventas);
           cajas.Top := 10;
           cajas.Left := 10;
           cajas.Height := 300;
           cajas.Width := 300;
           cajas.Parent := pagecontrol1;
           cajas.Name := combobox1.Text;
           cajas.Items.Add('el nombre es:'+cajas.Name);
           cajas.Items.Add(combobox1.Text);
           cajas.DragKind := dkDock;
           cajas.DragMode := dmAutomatic;
    end
    else
     ShowMessage('Ya existe');  //si, ya existe. (aca la acción que desees hacer)
 end;

Saludos

asdbernardo 26-10-2011 18:52:15

Gracias amigo Cloayza, Tambien si funciona esa alternativa... Saludos!


La franja horaria es GMT +2. Ahora son las 01:19:01.

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