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
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
LoPiTaL Va por buen camino
Un apunte de última hora, y no es por ir de "listillo" :P y por favor, corregidme si me equivoco....

El problema que tenías originalmente, era con acceder a los datos del campo "Data" del TreeView, no con la base de datos, ¿correcto?

Tú hacías lo siguiente (lo pongo de nuevo, ya que hace tropecientos mensajes que pasó):

Código Delphi [-]
Nodo1.Data := Pointer(DataModule1.EDBQuery1.Fieldbyname('Codigo').AsString);

Y al hacer:

Código Delphi [-]
ShowMessage(String(Nodo.Data^));

no te funcionaba.

Pues bien, yo creo, independientemente de todo el tema de bases de datos que habéis estado discutiendo (del cual, yo no tengo ni idea), que no te funciona porque el tipo "string" es un tipo manejado, creado y destruido por Delphi cuando se queda sin referencias. Si haces un casting a Pointer, la referencia se pierde y Delphi te destruye la string nada más salir de la función, pudiendo ser reutilizado su espacio.

Por eso tu otra solución SI funciona:

Código Delphi [-]
MiClase.Codigo :=DataModule1.EDBQuery1.Fieldbyname('Codigo').AsString;
Nodo1:=TreeView1.Items.AddChildObject(Nodo0, DataModule1.EDBQuery1.FieldByName('NOMBRE').AsString, MiClase);

ya que tienes una instancia de un objeto NO manejado (de tipo TMiClase), por lo que no se te autodestruye. Y este objeto mantiene una referencia al string (MiClase.Codigo) por lo que tampoco te destruye éste y todo funciona bien.

Otra solución, sin usar clases auxiliares, podría haber sido la siguiente (escrita sobre el navegador y sin probar):

Código Delphi [-]
var
  LPAnsiChar: PAnsiChar;
  LStr: AnsiString;
begin
  //Hago casting a AnsiString porque así cada caracter ocupa un único byte. Para usar 
  //la versión Unicode, en lugar de length, usar la función ByteLength
  LStr:=AnsiString(DataModule1.EDBQuery1.Fieldbyname('Codigo').AsString);
  LPAnsiChar:=AllocMem(length(LStr)+1);
  Move(LStr[1], LPAnsiChar^, length(LStr);
  Nodo1.Data:=LPAnsiChar;
end

Por supuesto, cuando elimines el nodo del TreeView, deberás hacer un Dispose(Nodo1.Data).

Un saludo,
LoPiTaL
Responder Con Cita
  #2  
Antiguo 31-05-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.471
Poder: 21
newtron Va camino a la fama
Siempre está bien ver distintas formas para hacer cualquier cosa.

Gracias LoPiTal.
__________________
Be water my friend.
Responder Con Cita
  #3  
Antiguo 31-05-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
newtron, supongo que lo has considerado, pero en caso de que no sea así, te comento que hay que tener cuidado con el código que finalmente escogiste, en el sentido de que debes destruir en algún momento los objetos que creas y pegas en el Data de los nodos.

// Saludos
Responder Con Cita
  #4  
Antiguo 31-05-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.471
Poder: 21
newtron Va camino a la fama
Cita:
Empezado por roman Ver Mensaje
newtron, supongo que lo has considerado, pero en caso de que no sea así, te comento que hay que tener cuidado con el código que finalmente escogiste, en el sentido de que debes destruir en algún momento los objetos que creas y pegas en el Data de los nodos.

// Saludos
Amigo roman, veo que me sobreestimas . No había caido en eso.

¿Cómo se destruirían esos objetos entendiendo que se ha creado uno por cada item del treeview?
__________________
Be water my friend.
Responder Con Cita
  #5  
Antiguo 31-05-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Usa el evento OnDeletion del TreeView.

// Saludos
Responder Con Cita
  #6  
Antiguo 31-05-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.471
Poder: 21
newtron Va camino a la fama
Cita:
Empezado por roman Ver Mensaje
Usa el evento OnDeletion del TreeView.

// Saludos
Vale... ¿y sería posible un ejemplito para torpes?
__________________
Be water my friend.
Responder Con Cita
  #7  
Antiguo 31-05-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Supongo, así sin revisarlo mucho:

Código Delphi [-]
procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
  TMiClase(Node.Data).Free;
end;

// Saludos
Responder Con Cita
  #8  
Antiguo 31-05-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Cita:
Empezado por roman Ver Mensaje
newtron, supongo que lo has considerado, pero en caso de que no sea así, te comento que hay que tener cuidado con el código que finalmente escogiste, en el sentido de que debes destruir en algún momento los objetos que creas y pegas en el Data de los nodos.

// Saludos
Lo mismo iba a comentar. Si hubiera visto tu mensaje, hubiera terminado como Casimiro, repitiendo lo que otros dicen :P
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
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 14:11:46.


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