Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   cargar un listbox (https://www.clubdelphi.com/foros/showthread.php?t=4559)

mateamargo 20-10-2003 17:01:26

cargar un listbox
 
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

Cita:

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:

Código:

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

y asignar un objeto de esta clase:

Código:

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:

Código:

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

Cita:

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

Código:

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:

Código:

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:

Código:

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.

;)


La franja horaria es GMT +2. Ahora son las 15:01:40.

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