Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Modificar el tamaño y posicion de un TreeView (https://www.clubdelphi.com/foros/showthread.php?t=59439)

cslbcn 27-08-2008 11:09:19

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!

coso 27-08-2008 11:21:55

lo has probado? digo lo de cambiar el width y el height sin crearlo de nuevo.

cslbcn 27-08-2008 11:23:05

si, y no lo hace. coge los valores iniciales

coso 27-08-2008 11:28:37

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;

cslbcn 27-08-2008 11:32:11

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... :confused:

coso 27-08-2008 11:44:53

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

cslbcn 27-08-2008 11:53:17

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?

coso 27-08-2008 11:55:24

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

cslbcn 27-08-2008 12:04:39

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

coso 27-08-2008 12:06:52

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

cslbcn 27-08-2008 12:21:19

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?

coso 27-08-2008 12:22:11

no, esto es solo para liberar el array de manera segura, para nada mas

coso 27-08-2008 12:22:49

el formclose se declara en el evento OnClose del form

cslbcn 27-08-2008 12:24:37

entonces, para volver a la posicion inicial?

coso 27-08-2008 12:27:47

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;

cslbcn 27-08-2008 12:38:48

mmmm, y si se tiene que restaurar aunque se clicke en otro treeview tambien hay que hacer otro eveto...

pensaré sobre ello

muchas gracias!


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

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