Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-10-2003
[mateamargo] mateamargo is offline
Miembro Premium
 
Registrado: jul 2003
Posts: 82
Poder: 21
mateamargo Va por buen camino
Post 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
Responder Con Cita
  #2  
Antiguo 20-10-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #3  
Antiguo 20-10-2003
[mateamargo] mateamargo is offline
Miembro Premium
 
Registrado: jul 2003
Posts: 82
Poder: 21
mateamargo Va por buen camino
Thumbs up

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.
Responder Con Cita
  #4  
Antiguo 20-10-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #5  
Antiguo 21-10-2003
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 21-10-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #7  
Antiguo 21-10-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #8  
Antiguo 21-10-2003
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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
Responder Con Cita
  #9  
Antiguo 21-10-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 12:40:43.


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
Copyright 1996-2007 Club Delphi