Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-07-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Con un poco de código lo verás más claro.

Normalmente querás crear los objetos y añadir los items a mostrar en el combo:
Código Delphi [-]
type TProvincia = class (TObject)
  public
     property Provincia:String read GetProvincia write SetProvincia;
end;


procedure TForm1.AddItems;
var p :TProvincia;
begin
 query1.sql.text := ' select distinct nombreProvincia from Provincias;';
 query1.Open;
 while not query1.eof do // para cada registro
 begin
   p := Tprovincia.Create; // creo en memoria mi objeto
   p.Provincia := query1.Fields[0].AsString;
   Combo1.AddObject(p.Provincia, p); // Añado el Nombre de la Provincia
//                                                 al combo y lo asocio con su objeto
   query1.next;
 end;
end; // AddItems

Si te fijas, no libero los objetos, ya que, como bien has dicho, solo se guarda un puntero, por tanto, el objeto debe existir en memoria mientras queramos acceder a él.

Tambien verás que siempre uso la misma variable "p" para crear los objetos; esto no es problema, ya que al decir "p := Tprovincia.Create" siempre se reserva memoria nueva para la variable "p" en cada iteración del bucle, así que no machacamos objetos en memoria. Cada Objeto creado estará en RAM, y la única forma de acceder a él, es mediante el ComboBox.
Código Delphi [-]
Function TForm1.ConseguirObjetoAsociado:TProvincia;
begin
  Result := nil; // en caso de error devolvemos un puntero nulo.
  if Combobox.ItemIndex = -1 then Exit; 
// No hay seleccionado ningún elemento en el combo,
// se devuelve el puntero nulo y salimos de la función

  Result := TProvincia(Combobox1.Objects[Combobox1.Itemindex]);
end;

Como norma general, si una funcion devuelve un objeto (que en realidad devuelve un puntero a ese objeto), se debe asignar un puntero nulo en caso de fallos. Obviamente cuando se use esta función, siempre se deberá tener en cuenta:
Código Delphi [-]
var x:Tprovincia;
x := ConseguirObjetoAsociado;
if  x <> nil then
  ShowMessage(x.Provincia)
else
  ShowMessage('no se ha encontrado el objeto. No puedo usar la variable X  porque daría un Access Violation');

Despues de este paréntesis, sigo explicando la funcioncita.
Cada Item del Combobox tiene asociado su propio objeto, por tanto, podemos usar el ItemIndex del Combo para acceder a ese objeto.

Se debe hacer un moldeo de Tipos "TProvincia (.....)" porque el combo acepta un TObject o una clase que derive de TObject. Nosotros, que lo hemos programado, sabemos que hemos introducido con AddObject un tipo de datos TProvincia, pues debemos decir al compilador que lo trate como tal, para que podamos acceder a todas las propiedades que tiene dicha Clase.

Por último nos queda un detalle: Liberar los objetos.
Código Delphi [-]
procedure Tform1.VaciarComboYObjetos;
var i:integer;
begin
  for i:=0 to Combobox.Items.count-1 do
     TProvincia(combobox.Objects[i]).Free; // libero cada Objeto de la RAM

  Combobox.Items.Clear;
end;
Despues de vaciar el combo, cualquier intento de acceder a los objetos nos dará un Access Violation. Normalmente se llama antes de liberar el Form de memoria.

Podría parecer que con solo hacer un "comboBox.Items.Clear" se debería destruir los objetos, pero lamentablemente delphi no sabe como tratar el objeto concreto que nosotros hemos añadido.

Saludos y espero se entienda.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #2  
Antiguo 11-07-2006
patorecalde patorecalde is offline
Miembro
 
Registrado: jul 2006
Posts: 35
Poder: 0
patorecalde Va por buen camino
Wink Probado y testeado .... Todo muy bien

Pero como no voy a entender, es una explicacion maravillosa y acompañada de codigo me fue de mucha utilidad y esta vez entiendo el por que de cada cosa, que es mi idea.
Ahora yo digo de usar esto cuando se trate de poca cantidad de objetos no es asi? es decir 100 o 150 objetos y depende de el tamaño de los objetos? por que si de repente quiero hacer esto con clientes y mi base tiene 50000 clientes voy a necesitar 1gb de memoria y no es ese el caso verdad?, ahora si tendre que consultar la base cuando quiera los datos de determinado objeto(supongamos un cliente) o existe alguna otra tecnica o forma de encarar los proyectos cuando existe una cantidad de datos muy grande?

Gracias y un fuerte abrazo a toda la gente de este club, que la verdad esto es grandioso.
Responder Con Cita
  #3  
Antiguo 11-07-2006
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.669
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Cita:
Empezado por patorecalde
Pero como no voy a entender, es una explicacion maravillosa y acompañada de codigo me fue de mucha utilidad y esta vez entiendo el por que de cada cosa, que es mi idea.
Ahora yo digo de usar esto cuando se trate de poca cantidad de objetos no es asi? es decir 100 o 150 objetos y depende de el tamaño de los objetos? por que si de repente quiero hacer esto con clientes y mi base tiene 50000 clientes voy a necesitar 1gb de memoria y no es ese el caso verdad?, ahora si tendre que consultar la base cuando quiera los datos de determinado objeto(supongamos un cliente) o existe alguna otra tecnica o forma de encarar los proyectos cuando existe una cantidad de datos muy grande?

Gracias y un fuerte abrazo a toda la gente de este club, que la verdad esto es grandioso.
Las personas que hay aquí son las que lo hace grandioso.

Responder Con Cita
  #4  
Antiguo 19-07-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
No es que me haya olvidado de este hilo, es que mis programas son para pymes y jamás he tenido 50.000 clientes con movimientos.

Lamento no poder ofrecer más ayuda, sólamente la que hay en los foros:
Datawares o no datawares
ECO o Bold for delphi
Ayuda de ECO

Realmente no sé si es lo que necesitas, pero algunas pistas no vienen mal.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cual es el mejor acceso a FireBird/InterBase?; cuanto mejor?? Combat-F2D Firebird e Interbase 9 22-06-2006 18:32:36
La mejor manera de hacer reportes con Qreport Coco_jac Impresión 6 29-04-2006 11:49:09
Cual es la manera mas rapida para copiar registros ilichhernandez Conexión con bases de datos 2 02-11-2005 02:00:57
La mejor manera de Trabajar con Form manuelpr Varios 8 07-03-2005 17:08:14
Cual es la mejor manera para darle formato a un numero ctronx Varios 4 21-07-2004 19:27:33


La franja horaria es GMT +2. Ahora son las 23:01:33.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi