FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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 |
#2
|
||||
|
||||
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 |
#3
|
|||
|
|||
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.
|
#4
|
||||
|
||||
Cita:
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; 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); 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 |
#5
|
||||
|
||||
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; 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 |
#6
|
||||
|
||||
Cita:
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 |
#7
|
||||
|
||||
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; 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; // Saludos |
#8
|
||||
|
||||
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 |
#9
|
||||
|
||||
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; Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
|
|
|