Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Sencilla pregunta sobre owners (https://www.clubdelphi.com/foros/showthread.php?t=78817)

DarkBlue 18-05-2012 22:43:27

Sencilla pregunta sobre owners
 
bueno companeros la cosa esta muy sencilla y empezamos con el siguiente codigo:

Código Delphi [-]

checkbox1.Parent:=groupbox1;
image2.Parent:=groupbox1;
label1.Parent:=groupbox1;
groupbox1.Parent:=scrollbox1;
scrollbox1.Components

showmessage( inttostr( scrollbox1.Controls[0].ComponentCount ) ) ;
'

y pues resulta que la linea del mensaje me muestra 0. que no deveria decirme que tiene 3 componentes el groupbox1? por que el padre de los tres es groupbox1 y que obviamiente el scrollbox es padre de este ultimo? . Digo que esto es un problema por que en un futuro quiero anadir mas componente y hacer algo como esto el bloque de codigo numero 2


bueno este es un código de lo que quiero llegar a hacer para que me puedan ayudar solo es la idea alguna mejora sera bien aceptada.
principal problema es que con esto quiero decir scrollbox1.controls[i].components[j2] dentro del scrollbox1 en sus controles alguno debe de ser tgroupbox y dentro sus componentes que estoy recorriendo uno debe de ser tlabel o tcheckbox.




Código Delphi [-]

for i=0 to scrollbox1.ControlCount-1 do
begin

  if  Scrollbox1.Controls[i]   is TGroupbox then
  begin
     for j=0 to 3 //le pongo 3 por que se que siempre hay 3 elementos en el group box pero si no?? como lo sabria por eso el problema del //showmeesage
         if  ( tcheckbox(scrollbox1.controls[i].component) = cbcheck )  then //aqui intento decirle que reccorra los componentes y si
///encuentra uno que sea checkbox y este seleccionado entonces hacemos
         begin
                
               for j2=0 to 3 do
               begin
                 if   scrollbox1.controls[i].components[j2]  is Tlabel then nombreimagen:=(tlabel(GroupBox1.Controls[j2]).Caption);
               end;

         end;
  end;



end;
gracias de nuevo. Mucho exito su amigo darkblue

roman 18-05-2012 22:48:04

Cita:

Empezado por DarkBlue
Código Delphi [-]
showmessage( inttostr( scrollbox1.Controls[0].ComponentCount ) ) ;

Debería ser ControlCount, no ComponentCount:

Código Delphi [-]
showmessage( inttostr( scrollbox1.Controls[0].ControlCount ) ) ;

Agrego: No confundas la lista Controls con la lista Components. Controls consiste de los objetos contenidos (visualmente), es decir, aquellos cuyo Parent es el componente. Components consiste de los objetos cuyo dueño es el componente.

// Saludos

cloayza 19-05-2012 03:40:16

Mucho ojo...
Cita:

Empezado por roman (Mensaje 432932)
No confundas la lista Controls con la lista Components. Controls consiste de los objetos contenidos (visualmente), es decir, aquellos cuyo Parent es el componente. Components consiste de los objetos cuyo dueño es el componente.

Como dice el Chavo del Ocho....eso eso eso...

DarkBlue 19-05-2012 22:33:42

oh bueno muchas gracias me ha quedado muy claro, owner es el components y parent es el controls

ecfisa 19-05-2012 22:49:44

Hola DarkBlue.

Si, más o menos es así la relación.

Dicho de otro modo, la propiedad vectorial Components contiene a los componentes que tienen en común ese mismo propietario (Owner) y la propiedad vectorial Controls contiene a los controles que tienen en común ese mismo padre (Parent).

Saludos.

DarkBlue 21-05-2012 19:03:13

ja no existe showmessage( inttostr( scrollbox1.Controls[0].ControlCount ) ) ; supongo que me las arreglare de otra manera gracias por su ayuda ya me queda mas claro =)

roman 21-05-2012 19:25:37

Cita:

Empezado por DarkBlue (Mensaje 433108)
ja no existe showmessage( inttostr( scrollbox1.Controls[0].ControlCount ) ) ; supongo que me las arreglare de otra manera gracias por su ayuda ya me queda mas claro =)

Ponlo así:

Código Delphi [-]
(scrollbox1.Controls[0] as TWinControl).ControlCount

// Saludos

DarkBlue 21-05-2012 21:02:29

agradeceria si pudieras ayudarme con mi código mi estimado roman creo que sera sencillo para alguien de tus conocimientos


oh ya veo :s pero ahora me quedo mas perplejo con eso de twincontrol existe un alguna documentacion para leer ?



Código Delphi [-]
for i:=0 to scrollbox1.ControlCount-1 do
begin

  if  (Scrollbox1.Controls[i]  is  TGroupbox) then
  begin

       for x:=0 to  (Tgroupbox(scrollbox1.Controls[i]).ControlCount-1) do
        begin

                 if   (Tgroupbox(scrollbox1.Controls[i]).Controls[x] is Tcheckbox )
                 and ( tcheckbox(tgroupbox(scrollbox1.Controls[i]).Controls[x]).Checked=true   )  then
                 begin

                        for w:=0 to  (Tgroupbox(scrollbox1.Controls[i]).ControlCount-1) do // lo recorro de nuevo por que deseguro se      me paso el label que busco para saber el nombre de la imagen
                        begin
                              if   (Tgroupbox(scrollbox1.Controls[i]).Controls[x] is Tlabel ) then
                              begin
                               listadenombres.add( tlabel(tgroupbox(scrollbox1.Controls[i]).Controls[x]).Caption );
                               continue;
                              end;

                        end;



                 end;

       end;
bueno creo que se me acaba de ocurrir ahorita mismo es así

ecfisa 21-05-2012 23:46:38

Hola.

Aunque seguramente no lo haga tan claro como roman, con respecto al código, te pongo un ejemplo con un ScrollBox que contiene además del GroupBox un Panel con controles.

Lo podes hacer de este modo:
Código Delphi [-]
var
  i,j: Integer;
begin
  for i:= 0 to ScrollBox1.ControlCount-1 do
  begin
    if ScrollBox1.Controls[i] is TGroupBox then  // Es un GroupBox ?
      with TGroupBox(ScrollBox1.Controls[i]) do  // con el GroupBox hacer
        for j:= 0 to ControlCount-1 do
        begin
          if Controls[j] is TCheckBox then  // Es un CheckBox ?
            TCheckBox(Controls[j]).Checked:= True;
          if Controls[j] is TLabel then  
            ListaDeNombres.Add(TLabel(Controls[j]).Caption);
          if Controls[j] is TRadioButton then  
            TRadioButton(Controls[j]).Checked:= True;
        end;
    if ScrollBox1.Controls[i] is TPanel then  // Es un TPanel ?
      with TPanel(ScrollBox1.Controls[i]) do  // Con el TPanel hacer
        for j:= 0 to ControlCount-1 do
        begin
          if Controls[j] is TEdit then
            TEdit(Controls[j]).Color:= clRed;
          if Controls[j] is TButton then
            TButton(Controls[j]).Caption:= 'Hola';
        end;
  end;
end;
Pero quizá te resulte más entendible así:
Código Delphi [-]
var
  i,j: Integer;
  Gb: TGroupBox;
  Tp: TPanel;
begin
  for i:= 0 to ScrollBox1.ControlCount-1 do
  begin
    if ScrollBox1.Controls[i] is TGroupBox then // Es un GroupBox ?
    begin
      Gb:= TGroupBox(ScrollBox1.Controls[i]);  // Gb es el GroupBox
      for j:= 0 to Gb.ControlCount-1 do
      begin
        if Gb.Controls[j] is TCheckBox then
          TCheckBox(Gb.Controls[j]).Checked:= True;
        if Gb.Controls[j] is TLabel then
          ListaDeNombres.Add(TLabel(Gb.Controls[j]).Caption);
        if Gb.Controls[j] is TRadioButton then
          TRadioButton(Gb.Controls[j]).Checked:= True;
      end;
    end;
    if ScrollBox1.Controls[i] is TPanel then  // Es un TPanel ?
    begin
      Tp:= TPanel(SCrollBox1.Controls[i]);  // Tp es el TPanel
      for j:= 0 to Tp.ControlCount - 1 do
      begin
        if Tp.Controls[j] is TEdit then
          TEdit(Tp.Controls[j]).Color:= clRed;
        if Tp.Controls[j] is TButton then
          TButton(Tp.Controls[j]).Caption:= 'Hola';
      end;
    end;
  end;
end;

TWinControl es la clase base para todos los controles que contienen ventanas (TObject->TPersistent->TComponent->TControl->TWinControl). De TWinControl derivan por ejemplo: TEdit, TPanel, TButton, TComboBox,...

Saludos.


La franja horaria es GMT +2. Ahora son las 16:33:30.

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