Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   acceso a las propiedades de un objeto (https://www.clubdelphi.com/foros/showthread.php?t=60687)

gushynet 10-10-2008 03:32:46

acceso a las propiedades de un objeto
 
Hola a todos, tengo una duda a ver si me podeis orientar un poco:

supongamos que tengo una función que pretende comparar dos objetos pasados por parámetro.

La función tiene además un tercer parámetro que es una cadena que indica el nombre de la propiedad común a los objetos en función de la cual se hará la comparación. Sería algo asi:


Código Delphi [-]
function Comparar(Obj1:TObjeto;Obj2:TObjeto;propiedad:AnsiString);
begin      
   if Obj1.propiedad = Obj2.propiedad then         
       result := true      
   else          
       result := false; 
end;


La duda es simplemente si hay alguna manera en delphi de acceder a los campos de un objeto de esta manera.

Gracias de antemano por la ayuda.
Un saludo

Delphius 10-10-2008 03:38:26

Hola gushynet,
Hay una manera. La solución es que dichas propiedades sea publicadas, es decir que sean declaradas published. De este modo mediante RTTI se puede acceder a dichas propiedades.

Para saber más sobre RTTI sugiero una búsqueda, hay hilos que tratan el tema.

Saludos,

Lepe 10-10-2008 14:06:50

Hay otro método que quizás te sirva:

Lo primero es definir una función de comparación, tal y como hace la VCL de delphi:
Código Delphi [-]
type TObjetoComp = function (obj1:Tobjeto; obj2:Tobjeto):integer;
esto viene a decir que eso será una función que recibe 2 objetos y devuelve un número enteronormalmente:
-1 si obj1 < obj2
0 si obj1 = obj2
1 si obj1 = obj2

Ahora se trataría de crear tantas funciones como posibilidades tengas (este es el rollo y puede que sea demasiado... no lo sé):
Código Delphi [-]
function OrdenaNombreAsc(obj1:Tobjeto; obj2:Tobjeto):integer;
begin
    Result := compareText (obj1.nombre, obj2.nombre);
end;

function OrdenaCliente(obj1:Tobjeto; obj2:Tobjeto):integer;
begin
  if obj1.idcliente < obj2.idcliente then
      Result := -1
 else if obj1.idlciente > obj2.idcliente then
     Result := 1
 else Result := 0;
end;

Estas funciones son muy fáciles de implementar y muy rápido, ahora tu algoritmo de ordenación pregunta al usuario cómo quiere ordenarla y llama a la función concreta:
Código Delphi [-]
procedure Tobjeto.Sort;
var fun: TobjetoComp;
begin
  if OrdenaNombre then
     fun := OrdenaNombreAsc
  else if ordenaPorCliente then
      fun := OrdenaCliente;
  while i < listaObjetos.count-2 do
  begin
     res :=  fun(listaObjetos[i], listaObjetos[i+1]);
     mover_objetos_de_sitio
    inc(i);
  end;
end;

Así es como funciona el método Sort del TObjectList, y si usas un TObjectList para almacenar tus objetos, sólo necesitas implementar las funciones de ordenación y llamar a ObjectList1.Sort.

Espero te sirva.

Al González 17-10-2008 21:36:43

¡Hola!

No sé si aún es tiempo, pero mi sugerencia sería apoyarte en la función GetPropValue, si es que las propiedades a comparar son publicadas.

Código Delphi [-]
Uses
  TypInfo;

procedure TForm1.Button4Click(Sender: TObject);
begin
  If GetPropValue (Button1, 'Caption') =
  GetPropValue (Button2, 'Caption') Then
    ShowMessage ('Button1 y Button2 tienen el mismo texto.');

  If GetPropValue (Button2, 'Caption') <>
  GetPropValue (Button3, 'Caption') Then
    ShowMessage ('Button2 y Button3 tienen textos diferentes.');
end;

Anexé un archivo con el ejemplo completo.

Saludos.

Al González. :)

gushynet 19-10-2008 08:47:46

gracias por la ayuda, es lo que he hecho, como me sugirio Delphius he mirado documentacion sobre rtti, concretamente el fichero TypInfo.

Lo que estoy intentando es realizar una operacion de asignacion generica. Ahora estoy intentandolo con las propiedades que son objetos a su vez, cosa que veo bastante compleja pero todo es ponerse.

Por cierto, en tiempo de ejecucion solo puedo obtener informacion de las propiedades publicadas como he leido en la documentacion que he encontrado? o hay alguna manera de obtener informacion de las variables declaradas en la seccion private de una clase?


Gracias. Un saludo.

Lepe 19-10-2008 09:48:10

solo published.

Saludos


La franja horaria es GMT +2. Ahora son las 07:39:12.

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