Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   integer(node.data) pero en string cómo? (https://www.clubdelphi.com/foros/showthread.php?t=69312)

mrnovice 10-08-2010 02:15:48

integer(node.data) pero en string cómo?
 
Buen día foreros he manejado los nodos de los treeviews en si en lo que respecta los treeview pero me tope con una problemática, antes yo manejaba puro dato numérico como primary key pero ahora me topo con strings, entonces cuando era número utilizaba Showmessage(IntToStr(Integer(node.data));
y con eso era sufiente pero ahora cuando es String el node.data cómo le hago porque intente Con String(node.data) y me ponía basura al igual que con PString entre otros alguien me puede guiar por favor gracias de antemano

ecfisa 10-08-2010 08:04:48

Hola mrnovice.

No entiendo bién que es lo que querés mostrar, pero esto muestra el texto del nodo:
Código Delphi [-]
    ShowMessage(Node.Text);



Saludos.

ecfisa 10-08-2010 09:01:49

Hola de nuevo mrnovice.

Me quedé pensando y era obvio que había interpretado mal tu consulta :o (no es raro a esta hora :D )

Así que supongo que querés obtener el contenido a que está apuntando el nodo no a su caption, en ese caso es:

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

Sin el operador '^' estabas haciendo referencia a la dirección de memoria, no al contenido.


Saludos

mrnovice 10-08-2010 16:27:14

Código Delphi [-]
readfiles(nil);


Código Delphi [-]
if Node=nil then
   begin
    begin
         QModulo.First;
         while not QModulo.Eof do
            begin
               Child:=JvCheckTreeView1.Items.AddChild(Node,'<'+Qmodulo.fieldbyname('modulo').AsString+'>');
               Child.Data:=pointer(Qmodulo.FieldByName('modulo').AsString);
               ShowMessage(child.Text);
               ShowMessage(String(child.Data)); //este sí sale correcto
               Child.HasChildren:=True;
               QModulo.Next;
            end;
     end;
   end else begin
         ShowMessage(String(Node.Data));
         ShowMessage(String(Node.Data^));
         ShowMessage(node.Text);
end;
no salió del todo :( y muchas gracias por tu apoyo mira el código de arriba es algo que manejo en el evento OnExpanding, como verás cuando lo agergo si sale pero lo intento expandir no sale a qué se puede deber incluso me aparece un Access Violation

mrnovice 10-08-2010 16:47:51

algo raro pasó, supongo que ha de ser porque uso jvchecktreeview deja lo checo

ecfisa 10-08-2010 19:18:55

Hola mrnovice.

No conozco el componente jvchecktreeview, pero supongo que no debe ser muy distinto al TTreeView.

Pareciera que el error esta en estas líneas:
Código Delphi [-]
    Child:= JvCheckTreeView1.Items.AddChild(Node,'<'+Qmodulo.fieldbyname('modulo').AsString+'>');
    Child.Data:=pointer(Qmodulo.FieldByName('modulo').AsString);
Hice una prueba simple cargando un TreeView con la tabla Country (DBDEMOS). Creo que lo que está en negrita te va a dar una pauta
para hallar la solución.
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  Root, Child: TTreeNode;
  Str: string;
begin
  QModulo.First;
  while not QModulo.Eof do
  begin
    Root:= TreeView1.Items.Add(nil,'<'+Qmodulo.fieldbyname('Name').AsString+'>');
    Child:= TreeView1.Items.AddChild(Root,QModulo.FieldByName('Capital').AsString);
    Str:= Qmodulo.FieldByName('Capital').AsString;
    Child.Data:= @Str; // ó igualmente: Addr(Str) 
    Root.HasChildren:=True;
    QModulo.Next;
  end;
end;

Para desreferenciar y convertir usá:
Código Delphi [-]
   string(Nodo.Data^)

Saludos.:)

ContraVeneno 10-08-2010 19:44:56

Yo también utilizo un TjvCheckTreeView y no es muy diferente al TreeView, salvo la casilla de verificación, vamos, es lo mismo. Y con esto me ayudo mucho para manejar y obtener información de un nodo.
Código Delphi [-]
//definición de datos que se adminitiran en Nodo.Data:
  type
  PInfoNodo = ^TInfoNodo;
  TInfoNodo = record
    Caption: string;
    ID: Integer;
  end;
......
//Para agregar un nuevo nodo:
var   InfoNodo: PInfoNodo;
.....
   New(InfoNodo);
   InfoNodo^.Caption := Nombre; //nombre es una variable string
   InfoNodo^.ID := 1;
   if TreeView.Selected.HasChildren then begin
    Nodo := TreeView.Items.AddChildObject(TreeView.Selected, Nombre, InfoNodo);
   end else begin
    Nodo := TreeView.Items.AddObject(TreeView.Selected, Nombre, infoNodo);
 end;
...
//Para obtener información del nodo.data
 if (TreeView.Selected.Data <> nil) then begin
   edtNodoCaption.Text := PInfoNodo(TreeView.Selected.Data)^.Caption;
   edtNodoId.Text := IntToStr(PInfoNodo(TreeView.Selected.Data)^.ID);
end;

Saludos.

mrnovice 11-08-2010 00:22:38

Gracias por sus respuestas
 
Voya checar y mañana les digo que ondas sales?
ufff le debo mucho a este foro XD muchas gracias por tener gente como ustedes saludos.

mrnovice 13-08-2010 15:39:26

Resuelto
 
probe los dos, la diferencia es que el primer caso solamente te lo guarda en un variable y el segundo pues en el tree, utilize el segundo caso que es el de ContraVeneno jejeejeje bueno, y con eso se solucion{o


La franja horaria es GMT +2. Ahora son las 04:07:53.

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