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 31-05-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.474
Poder: 21
newtron Va camino a la fama
Acceder al "data" de un treeview

Hola a tod@s.

Tengo un problema al intentar acceder al "data" de un treeview, lo creo de la siguiente manera:

Código Delphi [-]
procedure TFormFamilias.ActualizaArbol;
var
Nodo0,Nodo1,Nodo2,Nodo3,Nodo4: TTreeNode;
N: SmallInt;
begin
  Screen.Cursor:=crHourGlass;
  TreeView1.Items.Clear;
  Nodo0:=TreeView1.Items.AddChild(nil, 'Familias');
  DataModule1.EDBQuery1.SQL.Clear;
  DataModule1.EDBQuery1.SQL.Add('SELECT * FROM FAMILIAS ORDER BY CODIGO');
  DataModule1.EDBQuery1.ExecSQL;
  while not DataModule1.EDBQuery1.eof do begin
    N:=Length(DataModule1.EDBQuery1.FieldByName('CODIGO').AsString);
    case N of
      3: begin
        Nodo1:=TreeView1.Items.AddChild(Nodo0, DataModule1.EDBQuery1.FieldByName('NOMBRE').AsString);
        Nodo1.Data := Pointer(DataModule1.EDBQuery1.Fieldbyname('Codigo').AsString);
      end;
      6: begin
        Nodo2:=TreeView1.Items.AddChild(Nodo1, DataModule1.EDBQuery1.FieldByName('NOMBRE').AsString);
        Nodo2.Data := Pointer(DataModule1.EDBQuery1.Fieldbyname('Codigo').AsString);
      end;
      9: begin
        Nodo3:=TreeView1.Items.AddChild(Nodo2, DataModule1.EDBQuery1.FieldByName('NOMBRE').AsString);
        Nodo3.Data := Pointer(DataModule1.EDBQuery1.Fieldbyname('Codigo').AsString);
      end;
      12: begin
        Nodo4:=TreeView1.Items.AddChild(Nodo3, DataModule1.EDBQuery1.FieldByName('NOMBRE').AsString);
        Nodo4.Data := Pointer(DataModule1.EDBQuery1.Fieldbyname('Codigo').AsString);
      end;
    end;
    DataModule1.EDBQuery1.Next;
  end;
  Screen.Cursor:=crDefault;
end;

El problema es que después quiero acceder al valor del data, por ejemplo en el evento click del treeview pero no me da el valor correcto. He estado echando un vistazo a los post del foro y no encuentro dónde puede estar el problema.

He probado de dos maneras:

Código Delphi [-]
procedure TFormFamilias.TreeView1Click(Sender: TObject);
var
Nodo: TTreeNode;
begin
  Nodo:=TreeView1.Selected;
  ShowMessage(String(Nodo.Data));
end;

con este código salen cosas raras que no tienen nada que ver con el dato que debe de tener almacenado.

Código Delphi [-]
procedure TFormFamilias.TreeView1Click(Sender: TObject);
var
Nodo: TTreeNode;
begin
  Nodo:=TreeView1.Selected;
  ShowMessage(String(Nodo.Data^));
end;

con este otro código o no sale nada o da un access violation error

Agradeceré cualquier ayuda.

Gracias y un saludo
__________________
Be water my friend.
Responder Con Cita
  #2  
Antiguo 31-05-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola amigo.

En principio veo que tendrías que cambiar:
Código Delphi [-]
  ...
  DataModule1.EDBQuery1.SQL.Add('SELECT * FROM FAMILIAS ORDER BY CODIGO');
  DataModule1.EDBQuery1.ExecSQL;
  ...
Por:
Código Delphi [-]
  ...
  DataModule1.EDBQuery1.SQL.Add('SELECT * FROM FAMILIAS ORDER BY CODIGO');
  DataModule1.EDBQuery1.Open;
  ...

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 31-05-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.474
Poder: 21
newtron Va camino a la fama
Cita:
Empezado por ecfisa Ver Mensaje
Hola amigo.

En principio veo que tendrías que cambiar:
Código Delphi [-] ... DataModule1.EDBQuery1.SQL.Add('SELECT * FROM FAMILIAS ORDER BY CODIGO'); DataModule1.EDBQuery1.ExecSQL; ...

Por:
Código Delphi [-] ... DataModule1.EDBQuery1.SQL.Add('SELECT * FROM FAMILIAS ORDER BY CODIGO'); DataModule1.EDBQuery1.Open; ...


Saludos.
¿y eso? ¿qué diferencia hay entre una forma y otra?
__________________
Be water my friend.
Responder Con Cita
  #4  
Antiguo 31-05-2012
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
La diferencia es la siguiente

Este no te devuelve nada, la consulta la realiza internamente
Código Delphi [-]
DataModule1.EDBQuery1.SQL.Add('SELECT * FROM FAMILIAS ORDER BY CODIGO'); DataModule1.EDBQuery1.ExecSQL;
Este te devuelve la consulta del query con todos los campos
Código Delphi [-]
DataModule1.EDBQuery1.SQL.Add('SELECT * FROM FAMILIAS ORDER BY CODIGO'); DataModule1.EDBQuery1.Open;
Un saludo.
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.

Última edición por olbeup fecha: 31-05-2012 a las 13:55:39.
Responder Con Cita
  #5  
Antiguo 31-05-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por newtron Ver Mensaje
¿y eso? ¿qué diferencia hay entre una forma y otra?
Bueno, es que cuando se trata de una consulta (que devolverá datos) se debe utilizar Open o Active. ExecSQL se utiliza cuando se manipula algún dato (inserta, modifica, borra, etc).

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 31-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Quieres creer que nunca he usado esa propiedad "data" de un ttreenode?.

Me parece que ayer mismo había un hilo que trataba sobre ese asunto, a ver si lo encuentro.
Responder Con Cita
  #7  
Antiguo 31-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Aquí está, no sé si te servirá.

Aunque depende de los componentes que uses, lo normal es .Open para los select (te devuelve registros) y .ExecSQL para insert, update, etc. (ejecuta una acción, pero no devuelve registros)
Responder Con Cita
  #8  
Antiguo 31-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Vale, ya me callo, que parezco un loro repitiendo lo que dice ecfisa.

p.s. Es que no lo había visto, no vayáis a pensar que soy un loro de verdad.
Responder Con Cita
  #9  
Antiguo 31-05-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Vale, ya me callo, que parezco un loro repitiendo lo que dice ecfisa.

p.s. Es que no lo había visto, no vayáis a pensar que soy un loro de verdad.
Entonces también debo tener algo de papagayo (o de ciego), me pasa bastante seguido...

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #10  
Antiguo 31-05-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.474
Poder: 21
newtron Va camino a la fama
Gracias por vuestra aclaración pero imagino que será por la base de datos las dos instrucciones me hacen exactamente lo mismo. Miraré en la documentación de la base de datos a ver qué diferencias tiene.

Casimiro, ya había visto ese post pero me parecía más simple como se hace en este que es algo parecido a lo que yo estoy haciendo.

Intentaré hacerlo de la manera que se comenta en tu post a ver cómo va.

Gracias a todos.
__________________
Be water my friend.
Responder Con Cita
  #11  
Antiguo 31-05-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.474
Poder: 21
newtron Va camino a la fama
Solucionado

Hola de nuevo. He modificado el código en función al post que me comentaba Casimiro y funciona correctamente. Se ha quedado de la siguiente forma:

Código Delphi [-]
procedure TFormFamilias.ActualizaArbol;
var
Nodo0,Nodo1,Nodo2,Nodo3,Nodo4: TTreeNode;
N: SmallInt;
MiClase: TMiClase;
begin
  Screen.Cursor:=crHourGlass;
  TreeView1.Items.Clear;
  Nodo0:=TreeView1.Items.AddChildObject(nil, 'Familias', MiClase);
  DataModule1.EDBQuery1.SQL.Clear;
  DataModule1.EDBQuery1.SQL.Add('SELECT * FROM FAMILIAS ORDER BY CODIGO');
  DataModule1.EDBQuery1.Open;
  DataModule1.EDBQuery1.First;
  while not DataModule1.EDBQuery1.eof do begin
    N:=Length(DataModule1.EDBQuery1.FieldByName('CODIGO').AsString);
    MiClase:= TMiClase.Create;
    MiClase.Codigo :=DataModule1.EDBQuery1.Fieldbyname('Codigo').AsString;
    case N of
      3: begin
        Nodo1:=TreeView1.Items.AddChildObject(Nodo0, DataModule1.EDBQuery1.FieldByName('NOMBRE').AsString, MiClase);
      end;
      6: begin
        Nodo2:=TreeView1.Items.AddChildObject(Nodo1, DataModule1.EDBQuery1.FieldByName('NOMBRE').AsString, MiClase);
      end;
      9: begin
        Nodo3:=TreeView1.Items.AddChildObject(Nodo2, DataModule1.EDBQuery1.FieldByName('NOMBRE').AsString, MiClase);
      end;
      12: begin
        Nodo4:=TreeView1.Items.AddChildObject(Nodo3, DataModule1.EDBQuery1.FieldByName('NOMBRE').AsString, MiClase);
      end;
    end;
    DataModule1.EDBQuery1.Next;
  end;
  Screen.Cursor:=crDefault;
end;

y en el evento OnClick

Código Delphi [-]
procedure TFormFamilias.TreeView1Click(Sender: TObject);
var
Nodo: TTreeNode;
begin
  Nodo:=TreeView1.Selected;
  ShowMessage(TMiClase(Nodo.Data).Codigo)
end;



Gracias a todos y un saludo

Edito: para que veais que soy bueno he cambiado el ExecSql por el Open :P
__________________
Be water my friend.

Última edición por newtron fecha: 31-05-2012 a las 14:06:09.
Responder Con Cita
  #12  
Antiguo 31-05-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola newtron.

No cambies todo todavía, primero revisá esta prueba reducida, usando básicamente tu código y que funciona correcto.

Saludos.

Edito: ¿ Ves lo que te decía Casimiro? (no ví el mensaje que ya estaba solucionado )
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 31-05-2012 a las 14:23:31.
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
El programa se queda "colgado" mientras copia y luego "despierta" NeWsP OOP 5 10-03-2010 22:05:40
"String or binary data would be truncated" Gaim2205 Conexión con bases de datos 2 17-05-2008 14:32:40
Cómo acceder a las propiedades de un "Parent" NeoAnderson API de Windows 14 12-02-2008 21:13:46
Sólo para expertos: "Error reading iError.Picture.Data:Out of system resources" sami76 Varios 2 04-10-2007 13:53:31
Necesito llamar a métodos de clases "hija" desde su clase "padre" Flecha OOP 17 20-04-2007 00:03:53


La franja horaria es GMT +2. Ahora son las 18:47:14.


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