Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-08-2008
cslbcn cslbcn is offline
Miembro
 
Registrado: jul 2008
Posts: 60
Poder: 16
cslbcn Va por buen camino
Modificar el tamaño y posicion de un TreeView

Hola. Os explico lo que quiero hacer.

Primero, mediante una estructura repetitiva se crean tantas casillas como dias del mes hay (las variables estan bien definidas):

Código Delphi [-]
for i:=1 to DiasDelMes do
begin
   Form1.findcomponent('TreeView'+ inttostr(i)).destroy;

   with TTreeView.Create(Form1) do
   begin
      Parent := Form1;
      Top    := Coordenadas[cajactual].CoordTop;
      Left   := Coordenadas[cajactual].coordLeft;
      Height := 89;
      Color  := Color1;
      Width  := Ancho;
      Name   := 'TreeView' + IntToStr(i);
      OnClick      := TreeViewAmpliar;
    end;
end;

Cuando hacemos click en un Treeview ejecuta este código:
Código Delphi [-]
procedure TForm1.TreeViewAmpliar(Sender: TObject);
begin
   DiaCal2 := StrToInt(Copy(TTreeView(Sender).Name,9,2));
   Form1.findcomponent('TreeView'+ Inttostr(DiaCal2)).destroy;
   
   with TTreeView.Create(Form1) do
   begin
      Parent := Form1;
      Top    := 100;
      Left   := 100;
      Height := 500;
      Width  := 500;
      Name   := 'TreeView' + IntToStr(DiaCal2);
  end;
end;

De este modo, cuando clickamos en el Treeview1, correspondiente al día 1 del mes, borra el TreeView1 y crea uno más grande y en una posición exacta y lo llama de la misma manera.

Hasta aquí todo bien. Cuando lo ejecuto, depende de en que día pulso me falla, o si pulso mas de 4 Treeview acaba fallando.

Alguien sabe porque pasa esto?
Sabéis si hay alguna manera de decirle que cuando hacemos OnClick, en lugar de borrar TreeView y volverlo a crear, sólo modifique el ancho, alto, top y left?

Gracias!
Responder Con Cita
  #2  
Antiguo 27-08-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
lo has probado? digo lo de cambiar el width y el height sin crearlo de nuevo.
Responder Con Cita
  #3  
Antiguo 27-08-2008
cslbcn cslbcn is offline
Miembro
 
Registrado: jul 2008
Posts: 60
Poder: 16
cslbcn Va por buen camino
si, y no lo hace. coge los valores iniciales
Responder Con Cita
  #4  
Antiguo 27-08-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
el problema es del ambito de la variable. Deberias crear los ttreeview de manera global en el form.

Código Delphi [-]
  public
    { Public declarations }
    Treeviews : array of TTreeview;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject); // crear ttreeviews
var
        i : integer;
const
        DiasDelMes : integer = 30;
begin
        SetLength(Treeviews,diasdelmes);
        for i:=0 to DiasDelMes - 1 do
        begin
                Treeviews[i] := TTreeview.Create(self);
                with treeviews[i] do
                begin
                Parent := Form1;
                Top    := (i div 5) * 60 + 5;
                Left   := (i mod 5) * 60 + 5;
                Height := 60;
                Width  := 60;
                Name   := 'TreeView_' + IntToStr(i);
                OnClick      := TreeViewAmpliar;
                end;
        end;
end;

procedure TForm1.TreeViewAmpliar(Sender: TObject);
begin
        (sender as TTreeview).Height := 100;
        (sender as TTreeview).Width := 100;
        (sender as TTreeview).Bringtofront;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
        i : integer;
const
        diasdelmes : integer = 30;
begin
        for i := 0 to diasdelmes - 1 do
                treeviews[i].free;

        setlength(treeviews,0);
end;

Última edición por coso fecha: 27-08-2008 a las 11:38:17.
Responder Con Cita
  #5  
Antiguo 27-08-2008
cslbcn cslbcn is offline
Miembro
 
Registrado: jul 2008
Posts: 60
Poder: 16
cslbcn Va por buen camino
One moment.
Dije que no cambia el tamaño, no es exactamente esto, cambiando solo el anho y alto o el top y el left, me cambia las propiedades del Form1, no del treeview...
Responder Con Cita
  #6  
Antiguo 27-08-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
igualmente, tu codigo no estaba mal, solo que en vez de destruir y volver a crear, podias asignarlo a una variable y alla tratarlo

Código Delphi [-]
procedure TForm1.TreeViewAmpliar(Sender: TObject);
var 
    t : TTreeview;
begin
   t := (Form1.findcomponent((sender as TTreeview).Name) as TTreeview);
   
   with t do
   begin
      Top    := 100;
      Left   := 100;
      Height := 500;
      Width  := 500;
   end;
end;

aunque, con el sender, es innecesario

Última edición por coso fecha: 27-08-2008 a las 11:57:39.
Responder Con Cita
  #7  
Antiguo 27-08-2008
cslbcn cslbcn is offline
Miembro
 
Registrado: jul 2008
Posts: 60
Poder: 16
cslbcn Va por buen camino
mmm. no lo entiendo. Tal y como tengo escrito mi código no hay alguna forma mas sencilla de modificar los atributos. Como digo, si solo pongo:

Código Delphi [-]
procedure TForm1.TreeViewAmpliar(Sender: TObject);
begin
    Top    := 100;
    Left   := 100;
    Height := 500;
    Width  := 500;
end;

Me cambia los atributos del Form1. Si solo quiero que me los cambio de Treeview seleccionado?
Responder Con Cita
  #8  
Antiguo 27-08-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
debes usar el sender como ttreeview,

Código Delphi [-]
procedure TForm1.TreeViewAmpliar(Sender: TObject);
begin    
(sender as TTreeview).Top    := 100;    
(sender as TTreeview).Left   := 100;    
(sender as TTreeview).Height := 500;    
(sender as TTreeview).Width  := 500;
end;

antes, lo que estabas cambiando era las propiedades de 'self', o sea, de la form1
Responder Con Cita
  #9  
Antiguo 27-08-2008
cslbcn cslbcn is offline
Miembro
 
Registrado: jul 2008
Posts: 60
Poder: 16
cslbcn Va por buen camino
Vale, funciona, aunque de una manera muy extraña...

El nuevo treeview se coloca detrás de todos los treeview y los treeviews "antiguos" no vuelven a aparecer
Responder Con Cita
  #10  
Antiguo 27-08-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
deberas colocar tambien el 'bringtofront', para dibujarlo delante de los otros componentes.luego deberas usar una funcion para restaurar el tamaño original...echa un vistazo al codigo que te he puesto arriba, que ya estaba puesto esto. saludos
Responder Con Cita
  #11  
Antiguo 27-08-2008
cslbcn cslbcn is offline
Miembro
 
Registrado: jul 2008
Posts: 60
Poder: 16
cslbcn Va por buen camino
con esto?

Código Delphi [-]
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
        i : integer;
const
        diasdelmes : integer = 30;
begin
        for i := 0 to diasdelmes - 1 do
                treeviews[i].free;

        setlength(treeviews,0);
end;

imagino que si, pero, donde y como declaro el FormClose?
Responder Con Cita
  #12  
Antiguo 27-08-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
no, esto es solo para liberar el array de manera segura, para nada mas
Responder Con Cita
  #13  
Antiguo 27-08-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
el formclose se declara en el evento OnClose del form
Responder Con Cita
  #14  
Antiguo 27-08-2008
cslbcn cslbcn is offline
Miembro
 
Registrado: jul 2008
Posts: 60
Poder: 16
cslbcn Va por buen camino
entonces, para volver a la posicion inicial?
Responder Con Cita
  #15  
Antiguo 27-08-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
para restaurar la posicion inicial no esta escrita, deberas escribirla tu. Es exactamente lo mismo que TreeViewAmpliar. La tendras que colocar en algun evento del TreeView, como por ejemplo al seleccionar un item o no se, segun tus necesidades. Puedes, tambien, cambiar el OnClick una vez se haya ampliado
Código Delphi [-]
procedure TForm1.TreeViewAmpliar(Sender: TObject);
begin    
(sender as TTreeview).Top    := 100;    
(sender as TTreeview).Left   := 100;    
(sender as TTreeview).Height := 500;    
(sender as TTreeview).Width  := 500;
(sender as TTreeview).OnClick := TreeViewRestaurar;
end;
Responder Con Cita
  #16  
Antiguo 27-08-2008
cslbcn cslbcn is offline
Miembro
 
Registrado: jul 2008
Posts: 60
Poder: 16
cslbcn Va por buen camino
mmmm, y si se tiene que restaurar aunque se clicke en otro treeview tambien hay que hacer otro eveto...

pensaré sobre ello

muchas gracias!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Tamaño y posición de Form modal Wiarbumu Varios 3 23-07-2008 22:15:54
Hacer que un Form no pueda modificar su tamaño vejerf OOP 8 30-05-2008 12:55:53
Modificar tamaño y fuente de Messagedlg Moparova Varios 1 29-03-2007 13:29:34
Ajustar la posición al tamaño del texto Carmelo Cash Impresión 2 12-07-2006 22:40:24
Modificar tamaño de fuentes dmagui Varios 0 24-11-2005 17:41:11


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


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
Copyright 1996-2007 Club Delphi