PDA

Ver la Versión Completa : grid con trecord o clase asociada


JXJ
24-07-2011, 23:30:39
hola

una duda ando necesitando
hacer que una celda de un grid.

pueda yo asosicarle un trecord
o una clase

con una clase se me hace facil asi



type
TNodeData = class
sText : string;
iIDpro: integer;
iIdalmacen:intger
snombrealmacen:string;
end;

y en cada celda solo se debe de mostrar el sText y al dar clic
en esa celda poder acceder a el iID: integer; stexto2:string;
por que necesito acceder a su id para hacer un query que me de
los datos asociados a esa clase o trecord

algo asi. el grid

========================================
pepsi | coca | fanta | agua | manzanita|
=================================
papas|cacahuates|chicharroes|fritos |frituras |
=======================================
papel|servilletas| seviletas 100| rollo pa|klenex |
========================================

asi al seleccionar coca. puedo obtener el id de ese producto
y el iIdalmacen:intger y el snombrealmacen:string;
eso es algo que no se como asociar el contenido de cada celda
con una clase o un trecord

el treeview si se puede. also asi con su propiedad .Data
me parece que el virtual treeview tambien se puede.
solo que no se como usarlo. no he aprendido.
y que en delphi 2010 no me sirve
todos los demos me dan error de memoria . se come mucha memoria

muchas gracias.

Caral
24-07-2011, 23:36:42
Hola
Es un StringGrid ?.
Saludos

ecfisa
25-07-2011, 18:56:04
Hola.

Proba si te sirve de este modo:

...
implementation

type
TNodeData = class
sText : string;
iIDpro: Integer;
iIdAlmacen:Integer;
SNombreAlmacen:string;
end;

(* Cargar datos de prueba *)
procedure TForm1.FormShow(Sender: TObject);
var
c,f,x: Integer;
ND: TNodeData;
begin
x:= 1;
for f:= StrGrd.FixedRows to StrGrd.RowCount-1 do
for c:= StrGrd.FixedCols to StrGrd.ColCount-1 do
begin
ND:= TNodeData.Create;
ND.sText:= IntToStr(f)+':'+IntToStr(c);
ND.iIDpro:= x;
ND.iIdAlmacen:= x;
ND.SNombreAlmacen:= 'Almacen:'+IntToStr(f)+':'+IntToStr(c);
StrGrd.Cells[c,f]:= ND.SNombreAlmacen;
StrGrd.Objects[c,f]:= ND;
Inc(x);
end;
end;

(* mostrar datos de objeto asociado a celda *)
procedure TForm1.StrGrdClick(Sender: TObject);
begin
with TNodeData(StrGrd.Objects[StrGrd.Col,StrGrd.Row]) do
ShowMessage(sText+#10#13+
IntToStr(iIDpro)+#10#13+
IntToStr(iIdAlmacen)+#10#13+
SNombreAlmacen)
end;

...

(* liberar memoria *)
procedure TForm1.FormDestroy(Sender: TObject);
var
f,c: Integer;
begin
for f:= StrGrd.FixedRows to StrGrd.RowCount-1 do
for c:= StrGrd.FixedCols to StrGrd.ColCount-1 do
StrGrd.Objects[c,f].Free;
end;


Saludos.

JXJ
26-07-2011, 21:53:45
Hola.

Proba si te sirve de este modo:

Código Delphi [-] (http://clubdelphi.com/foros/#)
...
implementation

type
TNodeData = class
sText : string;
iIDpro: Integer;
iIdAlmacen:Integer;
SNombreAlmacen:string;
end;

(* Cargar datos de prueba *)
procedure TForm1.FormShow(Sender: TObject);
var
c,f,x: Integer;
ND: TNodeData;
begin
x:= 1;
for f:= StrGrd.FixedRows to StrGrd.RowCount-1 do
for c:= StrGrd.FixedCols to StrGrd.ColCount-1 do
begin
ND:= TNodeData.Create;
ND.sText:= IntToStr(f)+':'+IntToStr(c);
ND.iIDpro:= x;
ND.iIdAlmacen:= x;
ND.SNombreAlmacen:= 'Almacen:'+IntToStr(f)+':'+IntToStr(c);
StrGrd.Cells[c,f]:= ND.SNombreAlmacen;
StrGrd.Objects[c,f]:= ND;
Inc(x);
end;
end;

(* mostrar datos de objeto asociado a celda *)
procedure TForm1.StrGrdClick(Sender: TObject);
begin
with TNodeData(StrGrd.Objects[StrGrd.Col,StrGrd.Row]) do
ShowMessage(sText+#10#13+
IntToStr(iIDpro)+#10#13+
IntToStr(iIdAlmacen)+#10#13+
SNombreAlmacen)
end;

...

(* liberar memoria *)
procedure TForm1.FormDestroy(Sender: TObject);
var
f,c: Integer;
begin
for f:= StrGrd.FixedRows to StrGrd.RowCount-1 do
for c:= StrGrd.FixedCols to StrGrd.ColCount-1 do
StrGrd.Objects[c,f].Free;
end;





Saludos.


hola.
muchas gracias ecfisa
esto es lo que necesito.

estoy revisandolo

unas preguntas mas.
¿el stringgrid tambien soporta records en vez de clases?

¿que otros componentes soportan objects, clases y records de forma
semejante a este ejemplo?

muchas gracias ecfisa

ecfisa
26-07-2011, 22:34:32
Hola JXJ.
¿el stringgrid tambien soporta records en vez de clases?
Es válido hacer:

var
s: string;
begin
s:= 'Hola';
StringGrid1.Objects[StrGrd.Col,StrGrd.Row]:= TObject(s);
ShowMessage(string(StringGrid1.Objects[StrGrd.Col,StrGrd.Row]))
end;

Pero hasta donde yo sé, no se permite un cast a una estructura compuesta tipo registro.



¿que otros componentes soportan objects, clases y records de forma semejante a este ejemplo?

Que puedan almacenar objetos son varios, algunos que recuerdo:

TObjecList
TStringList
TComboBox1
TListBox
TMemo
TRadioGroup
TRichEdit
TTreeView


Un saludo.