Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Encontrar objeto por su nombre, encontrar metodo, ejecutar metodo

Estas son varias funciones para encontrar un objeto con su nombre completo (ej; Form3.DBGrid1.Columns). De la misma manera, para encontrar metodos en clases o bien dentro de propiedades TNotifyEvent. Sirve como ejemplo de uso de GetObjectProp y GetMethodProp, en la unidad typinfo.

Código Delphi [-]
unit gets;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Test1;
    procedure Test2;
    procedure Button1Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses typinfo;

type THKPersistent=class(TPersistent);

function GetObject(c : TObject; s : string): TObject;
var
     n : integer;
begin
     s := trim(s);
     n := Pos('.',s);
     result := nil;

     if s = '' then result := c;
     if c = nil then c := THKPersistent(c).GetOwner;

     if n <> 0 then
     result := GetObject(GetObject(c,Copy(s,0,n-1)),Copy(s,n+1,Length(s)-n));

     if result = nil then
     try
          result := typinfo.GetObjectProp(c,s);
     except
          result := nil;
     end;

     if result = nil then
     try
          result := (c as TComponent).FindComponent(s);
     except
          result := nil;
     end;
end;

function GetMethod(c : TObject; s : string) : TMethod;
var
     o : TObject;
     ael,lst : string;
begin
     s := trim(s);
     result.code := nil;
     result.data := nil;
     if pos('.',s) = 0 then
     begin
          lst := s;
          o := c;
     end
     else
     begin
          lst := strRscan(PChar(s),'.')+1;
          ael := Copy(s,0,Length(s)-length(lst));
          o := GetObject(c,ael);
     end;

     try
     result := GetMethodProp(o,lst);
     except
     result.code := nil;
     result.data := nil;
     end;

     if result.code = nil then
     try
     result.data := Pointer(o);
     result.code := o.MethodAddress(lst);
     except
     result.code := nil;
     result.data := nil;
     end;
end;

procedure ExecMethod(c : TObject; s : string);
type
   TExec = procedure of object;
var
     m : TMethod;
     Exec : TExec;
begin
      m := GetMethod(c,s);

      if assigned(m.code) then
      begin
        Exec := TExec(m);
        Exec;
      end;
end;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
     o : TObject;
begin
     o := GetObject(Application,'Form1');
     (o as TForm).Color := $BB0000;
     ShowMessage((o as TPersistent).GetNamePath + ' (' + o.classname + ')');

     o := GetObject(Application,'Form1.Edit1.Font');
     ShowMessage((o as TPersistent).GetNamePath + ' (' + o.classname + ')');
     (o as TFont).Size := 18;

     ExecMethod(Application,'Form1.Test1');
     ExecMethod(Application,'Form1.Test2');
     ExecMethod(Application,'Form1.Edit1.OnChange');
end;

procedure TForm1.Test1;
begin
     ShowMessage('procedure Test1');
end;

procedure TForm1.Test2;
begin
     ShowMessage('procedure Test2');
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
     ShowMessage('procedure en propiedad Edit1.OnChange (edit1Change)');
end;

end.
Responder Con Cita
  #2  
Antiguo 21-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Tambien se puede probar con objetos mas complejos.Ej; Form1.DBGrid1.DataSource.DataSet o Form1.DBGrid1.Columns.Items.Field.OnGetText, por ejemplo. Esta solo limitado a que el nombre que se le pasa sea el de un objeto o un metodo.
Responder Con Cita
  #3  
Antiguo 21-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Tambien se puede probar con objetos mas complejos.Ej; Form1.DBGrid1.DataSource.DataSet o Form1.DBGrid1.Columns.Items.Field.OnGetText, por ejemplo. Esta solo limitado a que el nombre que se le pasa sea el de un objeto o un metodo.
Responder Con Cita
  #4  
Antiguo 21-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
vaya, se me han vuelto a doblar los mensajes...si alguien puede borrarlo :D
Responder Con Cita
  #5  
Antiguo 26-10-2008
Avatar de xEsk
[xEsk] xEsk is offline
Miembro Premium
 
Registrado: feb 2006
Posts: 454
Poder: 19
xEsk Va por buen camino
Hay que aclarar que los metodos que se pueden ejecutar, son sólo los "published".

Saludos.
Responder Con Cita
  #6  
Antiguo 26-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
si, es mas, si alguien sabe como acceder a los public/protected/private en runtime, estaria bien que lo comentase. Saludos.
Responder Con Cita
  #7  
Antiguo 26-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
si, es mas, si alguien sabe como acceder a los public/protected/private en runtime, estaria bien que lo comentase. Saludos.
Responder Con Cita
  #8  
Antiguo 02-09-2011
Avatar de pablonill
pablonill pablonill is offline
Miembro
 
Registrado: dic 2006
Posts: 92
Poder: 18
pablonill Va por buen camino
fantastico coso, muchas gracias por el aporte!
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


La franja horaria es GMT +2. Ahora son las 18:41:29.


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