PDA

Ver la Versión Completa : cargar un listbox


mateamargo
20-10-2003, 17:01:26
Hola,
Quisiera saber si en un Listbox puedo cargar algo asi:

nro.empleado y apellido + nombre

quisiera que solo se vieran el apellido + nombre y que al hacer click sobre ese item puediera obtener el nro.empleado.
Gracias

roman
20-10-2003, 17:42:58
Dos opciones:

1. Usas el ListBox con Style = lbOwnerDrawFixed y dibujas tú mismo cada ítem en el evento OnDrawItem mostrando sólo el apellido y nombre aunque el ítem contenga toda la información.

2. Usa la propiedad Objects de ListBox.Items:

ListBox.Items.AddObject('amargo mate', Pointer(84));

Para recuperar el número:

Numero := Integer(ListBox.Items.Objects[i])

// Saludos

mateamargo
20-10-2003, 18:21:03
Muchas gracias por tu respuesta, yo había estado mirando la propiedad addobject pero no entendìa como se usaba ahora me ayudaste con dos temas.

roman
20-10-2003, 18:42:12
Posteado originalmente por mateamargo
[...]había estado mirando la propiedad addobject pero no entendìa como se usaba ahora me ayudaste con dos temas.

Sin embargo del uso particular que expuse no queda muy claro:

Objects es una arreglo paralelo a Items que permite asociar a cada item un objeto. Si te fijas, cada elemento del arreglo Objects es de tipo TObject.

Como un TObject es en realidad un puntero y ocupa 4 bytes, lo mismo que un Integer, se puede hacer el "casting" para tratar al puntero como un entero.

Si requirieses guardar más información del empleado además de su número podrías entonces definir una clase:


TEmpleado = class
Numero: Integer;
Nombre: String;
Apellido: String;
Sueldo: Double;
Ingreso: TDateTime;
end;


y asignar un objeto de esta clase:


Empleado := TEmpleado.Create;
Empleado.Numero := 84;
Empleado.Nombre := 'mate';
Empleado.Apellido := 'amargo';
Empleado.Sueldo := XXXXXX;
Empleado.Ingreso := aa//mm/dd;

ListBox.Items.Add('amargo mate', Empleado);


Y accederías al objeto así

Empleado := TEmpleado(ListBox.Items.Objects[i]);

Si llegas a considerar esta posibilidad entonces ten en cuenta que los objetos que insertes en el ListBox tienes que desruirlos en algún momento.

// Saludos

Lepe
21-10-2003, 16:03:00
Esto mismo estoy haciendo yo, pero no entiendo como se crearía y
se destruiría el objeto. Veamos mi ejemplo:


type TIT = class(Tobject)// Tipo Importe Tarifas
private
Fvalor : Double;
FString:string;
function lacadena:string;
public
AsFloat : Double read Fvalor Write Fvalor ;
AsString : string read laCadena;
constructor Create();
destructor Free;
end;

implementation
{ TIT }

constructor TIT.Create;
begin

Fvalor := -1.0;
Fstring:= '-1.0';
end;

destructor TIT.Free;
begin
inherited Free; ¿?¿?¿?¿?
end;

function TIT.lacadena: string;
begin
Result := FormatFloat('%n €',Fvalor);
end;


¿ que tengo que hacer en el Free ? si no pongo nada,
no me da error, pero vaya usted a saber si estoy
haciendo las cosas bien.


De antemano, perdón por mi ignorancia, y gracias por vuestra sabiduría ;)

roman
21-10-2003, 16:53:19
Posteado originalmente por Lepe
Esto mismo estoy haciendo yo, pero no entiendo como se crearía y
se destruiría el objeto[...]
[code]
type TIT = class(Tobject)// Tipo Importe Tarifas
private
Fvalor : Double;
FString:string;
function lacadena:string;
public
AsFloat : Double read Fvalor Write Fvalor ;
AsString : string read laCadena;
constructor Create();
destructor Free;
end;
[...]


¡Cuidado!

Tienes un error importante. Free no es un destructor y no debes declararlo. El destructor es Destroy y debe declararse así:

destructor Destroy; override;

Sin embargo, para liberar el objeto sí tienes que usar Free y no Destroy. Y debes hacerlo para lberar memoria, de lo contrario tu programa poco a poco agota los recursos del sistema.

// Saludos

roman
21-10-2003, 17:10:35
Completando un pco lo anterior:

No es necesario redefinir Destroy a menos que sea necesario.

Destroy es un destructor definido desde la madre de todas las clases-- TObject y todos sus descendientes lo heredan. Cuando una clase se declara como


TMiClase = class;
end;


implícitamente se está heredando de TObject por lo que no es necesario especificarlo en la declaración.

A grandes rasgos, el destructor Destroy sólo se redefine cuando tu misma clase crea otros objetos por sí misma. En tal caso deberá destruirlos y el mejor momento es en el destructor:


type
TMiClase = class
Lista: TStringList;
constructor Create;
destructor Destroy; override;
end;

constructor TMiClase.Create;
begin
// Creamos un objeto
Lista := TStringList.Create;
end;

destructor TMiClase.Destroy;
begin
// Debdemos destruirlo
Lista.Free;
inherited;
end;


Y por cierto, nunca olvidar llamar a inherited (que llama al destructor de la clase ancestra), y llamarlo al final

// Saludos

Lepe
21-10-2003, 17:44:46
Muchas gracias por contestar Roman, ha sido de gran ayuda, aunque eso si, necesitaré buscarme un buen libro de POO ya que es un estilo de programación que me encanta, lástima que el tiempo nunca esté a favor de uno :(.


Saludos

jachguate
21-10-2003, 20:14:41
Todo lo dicho anteriormente está perfecto. Solamente para ampliar el concepto de la propiedad Objects... no solo podes almacenar un puntero a una instancia de un objecto. Podria ser un puntero a cualquier estructura en realidad.

De manera que siempre valdria hacer algo como:


Type
REmpleado = record
Numero : Integer;
Nombres : String[100];
Apellidos : String[100];
etc.
End;

PEmpleado = ^REmpleado;

Var
Empleado : PEmpleado;

Begin
..

Empleado := New(PEmpleado);
Empleado^.Numero := 84;
Empleado^.Nombres := 'mate';
Empleado^.Apellidos := 'amargo';
ListBox.Items.Add('amargo mate', Empleado);
End;


al momento de liberarlo, por supuesto deberás utilizar (Dispose(empleado));

Hasta luego.

;)