Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Imagenes en un TREEVIEW (https://www.clubdelphi.com/foros/showthread.php?t=46041)

mRoman 22-07-2007 07:27:22

Imagenes en un TREEVIEW
 
Hola Amigos.

Estoy trabajando un TreeView, y he estado buscando la forma de agregarle una imagen a cada nodo, dependiendo del titulo del nodo es la imagen que necesito poner.

Hasta el momento he logrado agregarle imagenes al TreeView por medio de un ImageList donde he agregado todas las imagenes que necesito, para esto en la propiedad images le asocie el componente del ImageList, pero cada vez que selecciono un NODO me cambie de imagen....y no se porque.

Hagan de cuenta que tengo los siguiente: Un cliente tiene varias notas de servicios realizados por una lavanderia, por cada nota se le realiza un nodo, y a su vez estas tienen tantos nodos como servicios tenga la nota.....entonces necesito saber como hacerle para que cuando yo seleccione un servicio no me cambie la imagen con otra q se encuentra dentro del ImageList.....

Les agredezco la ayuda que me proporcionen....

dec 22-07-2007 07:50:09

Hola,

¿Y no ocupas tú ningún evento del "TreeView", quiero decir, ¿la imagen se cambia ella sola? ¿Cuando seleccionas un nodo o algo?

mRoman 22-07-2007 20:00:28

Otro problema TreeView relacionado con imagenes
 
Cita:

Empezado por dec
Hola,

¿Y no ocupas tú ningún evento del "TreeView", quiero decir, ¿la imagen se cambia ella sola? ¿Cuando seleccionas un nodo o algo?

No, no estoy utilizando ningun evento del TreeView......de hecho desde anoche he estado buscandole....y ahora el problema ya no es ese, porque ya supe el porque me cambiaba las imagenes....no estaba utilizando la propiedad SelectIndex de la clase TTreeNode.

Ahora la bronca es otra, como le hago para q los nodos hijos tengan la misma imagen ?

Has de cuenta mi TreeView es como sigue:

+CLIENTE
····+NOTA1
····-SERVICIO 1
····Prenda 1
····Prenda 2
····Prenda 3
····+SERVICIO 2
····+NOTA2

Entonces necesito que los nodos NOTA1 y NOTA2 tengan la misma imagen y que los nodos SERVICIO 1 y SERVICIO 2 asi como los servicios q tenga el nodo de la NOTA2, tambien tengan la misma imagen.....en donde tambien una imagen para los nodos etiquetados en este ejemplo como "Prenda1, Prenda2, etc".


Mira este es el codigo....
Código Delphi [-]
procedure TfrmVerNotas.FormShow(Sender: TObject);
Var
   NodoNotas, NodoServicios,NodoPrendas,i,n,m,nNota, nNota2, nServicio, nServicio2:Integer;
   cCliente, cNotas,cServicio,cPrenda: TTreeNode;
   cNota, cServ, cPrendas:String;
begin
    i:=1;
    n:=2;
    m:=3;
    frmVerNotas.Caption:='Ver Notas';
    qryDatos.Close;
    qryDatos.ParamByName('CLIENTE').AsInteger:=frmGCliente.qryGCliente.fieldbyname('CLAVE_CLIENTE').AsIn  teger;
    qryDatos.Open;
    qryDatos.First;
    cCliente:=trvPrendas.Items.Add(nil,frmGCliente.qryGCliente.fieldbyname('NOMBRE_RAZON_SOCIAL').AsStri  ng);
//    trvPrendas.Items[0].ImageIndex:=0;
//    trvPrendas.Items[0].SelectedIndex:=0;
    While not (qryDatos.Eof) do
    begin
      nNota:=qryDatos.FieldValues['CONSEC_NOTA'];
      nNota2:=nNota;
      cNotas:=trvPrendas.Items.AddChild(cCliente,'Nota '+qryDatos.fieldbyname('CONSEC_NOTA').AsString+' Fecha Registro: '+qryDatos.fieldbyname('FECHA_REGISTRO').AsString);
//      trvPrendas.Items[i].ImageIndex:=1;
//      trvPrendas.Items[i].SelectedIndex:=1;
      While (nNota=nNota2) and not(qryDatos.Eof) do
      begin
           nServicio:=qryDatos.fieldbyname('clave_servicio').AsInteger;
           nServicio2:=nServicio;
           cServicio:=trvPrendas.Items.AddChild(cNotas,qryDatos.fieldbyname('SERVICIO').AsString);
//           trvPrendas.Items[2].ImageIndex:=2;
//           trvPrendas.Items[2].SelectedIndex:=2;
           While (nServicio=nServicio2) and not(qryDatos.Eof) do
           begin
               trvPrendas.Items.AddChild(cServicio,qryDatos.fieldbyname('PRENDA').AsString+'-'+qryDatos.fieldbyname('COLOR').AsString);
               qryDatos.Next;
               nServicio:=qryDatos.fieldbyname('CLAVE_SERVICIO').AsInteger;
{               if qryDatos.FieldByName('PRENDA_ENTREGADA').AsInteger=1 then
               begin
                 trvPrendas.Items[m].ImageIndex:=3;
                 trvPrendas.Items[m].SelectedIndex:=3;
               end Else Begin
                 trvPrendas.Items[m].ImageIndex:=4;
                 trvPrendas.Items[m].SelectedIndex:=4;
               end;
               inc(m);}
           end;
           nNota:=qryDatos.FieldValues['CONSEC_NOTA'];
//           inc(n);
      end;
//      inc(i);
    end;
end;

Hasta el momento esto me ha estado funcionando, pero solamente en NOTA1 del nodo padre, porq en el segundo (NOTA2) me pone la primer imagen q tiene ImagenList.

Si me puedes y tambien a todos los del foro, ayudar a resolverlo mucho se los agradecere....

Gracias de antemano por contestar.....

mRoman 22-07-2007 20:45:38

Oye DEC, en el codigo que puse tengo las lineas que ponen las imagenes como comentarios, ya lo habras visto, porque de momento los dejare asi, hasta que no encuentre la solucion optima.

Por otra parte quiesiera ser mas explicito con lo de las imagenes.....
en el nodo de CLIENTE tengo la imagen A
y dentro de CLIENTE tengo tantos nodos como notas haya tenido el cliente, en este caso tengo NOTA1 y NOTA2 con la imagen B.
Y dentro de NOTA1 y NOTA2 tengo tantos X servicios registrados, los cuales digamos q les toca la imagen C.

(Cometi un error de descripcion en el TreeView....puse los siguiente:
+CLIENTE
····+NOTA1
····-SERVICIO 1
····Prenda 1
····Prenda 2
····Prenda 3
····+SERVICIO 2
····+NOTA2

Lo cual las ultimas dos lineas debe quedas voltedas.....quedaria asi:
+CLIENTE
····+NOTA1
····-SERVICIO 1
····Prenda 1
····Prenda 2
····Prenda 3
····+NOTA2
····+SERVICIO 2

Y por ultimo una imagen especial que logre identificar a todas los nodos PRENDA1, PRENDA2, PRENDA3....PRENDASn, de cada nota (NOTA1, NOTA2...NOTAn)...

Neftali [Germán.Estévez] 23-07-2007 09:57:19

Cita:

Empezado por mRoman
...pero cada vez que selecciono un NODO me cambie de imagen....y no se porque.

Revisa la propiedad StateImages (también es de tipo ImageList); Posiblemente esté relacionada con que los nodos cambien de imagen (sin aparente razón) dependiendo de si están seleccionados o no (con el foco o no).

Chris 26-07-2007 17:10:12

Por lo que puedo ver, lo que tu quieres es agregar una especie de iconos para distinguir los tipos de registros, pues bien, lo que primero debes hacer, es deterninar el tipo de registro que es, (cliente, nota, servicio) luego almacernar este tipo de servicio en una propiedad del TREENODE (FIJATE QUE ES TREENODE y no TREEEVIEW a lo que me refiero). Luego en el evento OnGetImageIndex del treeview escribes código para leer el tipo de registro y asignarle al treenode el imageIndex que necesites, así como también lo debes hacer con la propiedade SelectedImageIndex y si has asignado un stateImage al treeview también lo debes hacer con la propiedad StateImage del treenode.

mRoman 28-07-2007 18:28:15

Imagenes TreeVIew
 
Cita:

Empezado por D&W
Por lo que puedo ver, lo que tu quieres es agregar una especie de iconos para distinguir los tipos de registros, pues bien, lo que primero debes hacer, es deterninar el tipo de registro que es, (cliente, nota, servicio) luego almacernar este tipo de servicio en una propiedad del TREENODE (FIJATE QUE ES TREENODE y no TREEEVIEW a lo que me refiero). Luego en el evento OnGetImageIndex del treeview escribes código para leer el tipo de registro y asignarle al treenode el imageIndex que necesites, así como también lo debes hacer con la propiedade SelectedImageIndex y si has asignado un stateImage al treeview también lo debes hacer con la propiedad StateImage del treenode.

Gracias...checare eso.. !

Chaja 27-05-2012 22:31:11

Imagenes en los nodos
 
Hola cris:

Cita:

Por lo que puedo ver, lo que tu quieres es agregar una especie de iconos para distinguir los tipos de registros, pues bien, lo que primero debes hacer, es deterninar el tipo de registro que es, (cliente, nota, servicio) luego almacernar este tipo de servicio en una propiedad del TREENODE (FIJATE QUE ES TREENODE y no TREEEVIEW a lo que me refiero). Luego en el evento OnGetImageIndex del treeview escribes código para leer el tipo de registro y asignarle al treenode el imageIndex que necesites, así como también lo debes hacer con la propiedade SelectedImageIndex y si has asignado un stateImage al treeview también lo debes hacer con la propiedad StateImage del treenode.
me pasa lo mismo que mRoman, he intentado hacer lo que propones , pero no he tenido exito. Perdon pero me podrias ampliar la solucion ?

Gracias

Luis Roldan
Mar del Plata
Argentina

ecfisa 27-05-2012 23:13:37

Hola Chaja.

Si el problema es el que menciona mRoman inicialmente:
Cita:

... entonces necesito saber como hacerle para que cuando yo seleccione un servicio no me cambie la imagen con otra q se encuentra dentro del ImageList
Basta con poner el mismo índice a las propiedades ImageIndex y SelectedIndex en cada Item .

Ejemplo:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i:= 0 to TreeView1.Items.Count-1 do
  begin
    TreeView1.Items.Item[i].ImageIndex:= i;
    TreeView1.Items.Item[i].SelectedIndex:= i;
  end;
end;

Saludos.

Chaja 27-05-2012 23:56:58

gracias.... caso solucionado.... lo que me falta aprender es como usar la priedad Data
si tenes un ejemplo practico estaria bueno, ahora si yo uso esta propiedad, se puede usar la forma tradicional tambien? es decir

Código Delphi [-]
 
Nodo1 := tvListado.Items.AddChild(tvListado.Items[N],
             CDSStockCODIGO_STK.AsString + '-' + CDSStockDETALLE_STK.Value);

lo que quiero es agrgar mas datos dentro de cada nodo..

sos una masa.... ( masa entiendase por un tipo con buena onda, dispuesto a yudar, o sinonimos a estos)

Luis Roldan
Mar del Plata
Argentina

ecfisa 28-05-2012 03:03:17

Hola Luís.

Te pongo un ejemplo simple que utiliza la propiedad Data, espero que te sea útil...
Código Delphi [-]
type
  TMiClase = class(TObject)
    Texto: string;
    //...
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Nodo: TTreeNode;
  MiClase: TMiClase;
begin
  Nodo:= nil;
  MiClase:= TMiClase.Create;
  MiClase.Texto:= '¡Joya! justo sobre el nodo';
  TreeView1.Items.AddChildObject(Nodo, 'Hace click aquí', MiClase);

end;

procedure TForm1.TreeView1Click(Sender: TObject);
var
  Nodo: TTreeNode;
  P: TPoint;
begin
  P:= ScreenToclient(Mouse.CursorPos);
  Nodo:= TreeView1.GetNodeAt(P.X, P.Y);
  if Nodo <> nil then
    ShowMessage(TMiClase(Nodo.Data).Texto)
  else
   ShowMessage('¡ Pif ! );
end;

Cita:

sos una masa....
Muchas gracias ;)

Saludos. :)

Lepe 28-05-2012 08:51:08

A mí no me gusta para nada hacer el moldeo de tipos (no hay más remedio, por eso uso siempre una función tonta):
Código Delphi [-]

function TMiClase.AsMiClase : TMiClase
begin
   Result := Self
end;

así se hace más clara la lectura del código:

Código Delphi [-]
ShowMessage(Nodo.Data.asMiClase.Texto)

Saludos

roman 28-05-2012 18:56:55

Cita:

Empezado por Lepe (Mensaje 433634)
Código Delphi [-]
ShowMessage(Nodo.Data.asMiClase.Texto)

No entiendo. Esto no compilaría.

// Saludos

maeyanes 28-05-2012 19:46:17

Hola...

Lo mismo pensé cuando leí el comentario.

Código Delphi [-]
TTreeNode.Data: Pointer;

Aparte que para usar algo como Objeto.AsMiClase.Metodo, este tendría que ser un método de clase.


Saludos...

Lepe 01-06-2012 16:59:25

pos sip, he metido la patita... y de qué modo... Perdón.

Saludos


La franja horaria es GMT +2. Ahora son las 08:42:24.

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