Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-06-2012
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 20
cesarsoftware Va por buen camino
Gracias ecfisa

Si que detecta el metodo, sin hacer referencia al formulario, lo que falta es que la asignacion tambien sea anonima

Código Delphi [-]
     if MethodAssigned(Components[i], 'OnExit') = False then
        TFormProveedorFactura(Components[i]).OnExit := ControlExit;

Todavia hay que hacer referencia a "TFormProveedorFactura" para asignarle el nuevo evento, ¿como podriamos hacerlo con Self o como parametro?

Thanks
Responder Con Cita
  #2  
Antiguo 14-06-2012
Avatar de ozsWizzard
ozsWizzard ozsWizzard is offline
Miembro
 
Registrado: may 2004
Ubicación: Murcia
Posts: 190
Poder: 23
ozsWizzard Va por buen camino
Cita:
Empezado por cesarsoftware Ver Mensaje
Gracias ecfisa

Si que detecta el metodo, sin hacer referencia al formulario, lo que falta es que la asignacion tambien sea anonima

Código Delphi [-]
     if MethodAssigned(Components[i], 'OnExit') = False then
        TFormProveedorFactura(Components[i]).OnExit := ControlExit;

Todavia hay que hacer referencia a "TFormProveedorFactura" para asignarle el nuevo evento, ¿como podriamos hacerlo con Self o como parametro?

Thanks

Si lo que quieres es asignar ControlExit al componente, creo que te sobraría con


Código Delphi [-]
...
var
   Obj: TWinControl;
begin
     if MethodAssigned(Components[i], 'OnExit') = False then
     begin
         Obj := (Components[i] as TWinControl)
         Obj.OnExit := ControlExit;
     end;
...

Si el problema es que es el bucle el que hace:

Código Delphi [-]
     for i := 0 to TFormProveedorFactura.ComponentCount -1 do
     begin
     ...
     end;

Siempre puedes ponerle al procedimiento un "AOwner: TComopnent" y recorrer ese. Es decir:

Código Delphi [-]
unit Unit2;

interface

  function MethodAssigned(aObject: TObject; const MethodName: string): Boolean;
  
  procedure ControlEnter(Sender: TObject);
  procedure ControlExit(Sender: TObject);
  procedure ControlesResaltados(AOwner: TComponent);
  

implementation

uses  TypInfo;

function MethodAssigned(aObject: TObject; const MethodName: string): Boolean;
var
  Method: TMethod;
begin
  Method:= GetMethodProp(aObject, MethodName);
  Result:= (Method.Code <> nil)and(Method.Data <> nil);
end;

procedure ControlEnter(Sender: TObject);
begin
  TWinControl(Sender).Brush.Color := clYellow;
end;
 
procedure ControlExit(Sender: TObject);
begin
  TWinControl(Sender).Brush.Color := clWindow;
end;

procedure ControlesResaltados(AOwner: TComponent);
var
  i: word;
  Obj: TWinControl; 
begin
  for i := 0 to AOwner.ComponentCount - 1 do
  begin
    if AOwner.Components[i] is TWinControl then
    begin
      Obj := (AOwner.Components[i] as TWinControl);
      if not MethodAssigned(Obj, 'OnEnter') then       
        Obj.OnEnter := ControlEnter;
      if not MethodAssigned(Obj, 'OnExit') then
        Obj.OnExit := ControlExit;
    end;
  end;
end;
__________________
La Madurez se llama...
~~~Gaia~~~

Última edición por ozsWizzard fecha: 14-06-2012 a las 13:32:41.
Responder Con Cita
  #3  
Antiguo 15-06-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por cesarsoftware Ver Mensaje
Gracias ecfisa
Si que detecta el metodo, sin hacer referencia al formulario, lo que falta es que la asignacion tambien sea anonima
Código Delphi [-]
     if MethodAssigned(Components[i], 'OnExit') = False then
        TFormProveedorFactura(Components[i]).OnExit := ControlExit;
Todavia hay que hacer referencia a "TFormProveedorFactura" para asignarle el nuevo evento, ¿como podriamos hacerlo con Self o como parametro?

Thanks
Hola Cesar.

Fijate si te sirve de este modo:
Código Delphi [-]
unit Unit2;

interface

uses
  SysUtils, Classes;

procedure AssignMethod(aComponent: TComponent; const MethodName: string; aEvent: TNotifyEvent);

implementation

uses  TypInfo;

procedure AssignMethod(aComponent: TComponent; const MethodName: string; aEvent: TNotifyEvent);
var
  PInfo: PPropInfo;
  Method: TMethod;
  PEvent: ^TNotifyEvent;
begin
  PInfo:= GetPropInfo(aComponent.ClassInfo, MethodName);
  if (PInfo <> nil)and(PInfo^.PropType^.Kind = tkMethod) then
  begin
    Method:= GetMethodProp(aComponent, MethodName);
    if not Assigned(Method.Code) then
    begin
      PEvent:= @Method.Code;
      PEvent^:= aEvent;
      Method.Data:= aComponent.GetParentComponent;
      SetMethodProp(aComponent, PInfo, Method);
    end;
  end;
end;
end.

Ejemplo de uso:
Código Delphi [-]
procedure TForm1.ControlClick(Sender: TObject);
begin
  ShowMessage('Click sobre '+TComponent(Sender).Name);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  for i:= 0 to ComponentCount-1 do
    if Components[i].Name <> 'Button1' then //  para no asignarlo a Button1...
      AssignMethod(Components[i], 'OnClick', ControlClick);
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 15-06-2012
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 20
cesarsoftware Va por buen camino
Gracias, gracias

Al final es una combinacion de los metodos de ecfisa y y ozswizzard.

En esta procedure se produce el error
[DCC Error] UnitProveedorFactura.pas(1099): E2362 Cannot access protected symbol TWinControl.OnEnter
[DCC Error] UnitProveedorFactura.pas(1099): E2035 Not enough actual parameters

en las lineas
Obj.OnEnter := ControlEnter;
Obj.OnExit := ControlExit;
Código Delphi [-]
procedure TFormProveedorFactura.ControlesResaltados(AOwner: TComponent);
var
  i: word;
  Obj: TWinControl;
begin
  for i := 0 to AOwner.ComponentCount - 1 do
  begin
    if AOwner.Components[i] is TWinControl then
    begin
      Obj := (AOwner.Components[i] as TWinControl);
      if not MethodAssigned(Obj, 'OnEnter') then
        Obj.OnEnter := ControlEnter;
      if not MethodAssigned(Obj, 'OnExit') then
        Obj.OnExit := ControlExit;
    end;
  end;
end;

asi que de momento el mejor resultado es
Código Delphi [-]
type TFormProveedorFactura = class(TForm)
    procedure ControlesResaltados(AOwner: TComponent);
    procedure ControlEnter(Sender: TObject);
    procedure ControlExit(Sender: TObject);
end;

procedure TFormProveedorFactura.FormActivate(Sender: TObject);
begin
  if activate = True then
    Exit;
  activate := True;
  ControlesResaltados(Self);
  IniciaGrillas;
  VaciaCampos;
end;

procedure TFormProveedorFactura.ControlesResaltados(AOwner: TComponent);
var
  i: word;
  Obj: TWinControl;
begin
  for i := 0 to AOwner.ComponentCount - 1 do
  begin
    if AOwner.Components[i] is TWinControl then
    begin
      Obj := (AOwner.Components[i] as TWinControl);
      if not MethodAssigned(Obj, 'OnEnter') then
        AssignMethod(AOwner.Components[i], 'OnEnter', ControlEnter);
      if not MethodAssigned(Obj, 'OnExit') then
        AssignMethod(AOwner.Components[i], 'OnExit', ControlExit);
    end;
  end;
end;

procedure TFormProveedorFactura.ControlEnter(Sender: TObject);
begin
  TWinControl(Sender).Brush.Color := clSkyBlue;
end;

procedure TFormProveedorFactura.ControlExit(Sender: TObject);
begin
  TWinControl(Sender).Brush.Color := clWindow;
end;

Asi que este pequeño codigo se puede trasportar al resto de formularios y con solo cambiar el formulario propietario ya esta y no se toca mas código.
Las rutinas para comprobar metodos y asignarlos ya estan en la bliblioteca general de funciones (Gracias de nuevo).
Digo esto por que si lo saco de type TForm, se queja de la siguiente linea

[DCC Error] UnitProveedorFactura.pas(1099): E2009 Incompatible types: 'method pointer and regular procedure'
en
AssignMethod(AOwner.Components[i], 'OnEnter', ControlEnter);

osea, la buena seria esta para que no hubiera que tocar nada de codigo, pero no se resolver el problema 'method pointer and regular procedure'
Código Delphi [-]
procedure ControlesResaltados(AOwner: TComponent);
var
  i: word;
  Obj: TWinControl;
begin
  for i := 0 to AOwner.ComponentCount - 1 do
  begin
    if AOwner.Components[i] is TWinControl then
    begin
      Obj := (AOwner.Components[i] as TWinControl);
      if not MethodAssigned(Obj, 'OnEnter') then
        AssignMethod(AOwner.Components[i], 'OnEnter', ControlEnter);
      if not MethodAssigned(Obj, 'OnExit') then
        AssignMethod(AOwner.Components[i], 'OnExit', ControlExit);
    end;
  end;
end;

procedure ControlEnter(Sender: TObject);
begin
  TWinControl(Sender).Brush.Color := clSkyBlue;
end;

procedure ControlExit(Sender: TObject);
begin
  TWinControl(Sender).Brush.Color := clWindow;
end;

Saludos

Última edición por cesarsoftware fecha: 15-06-2012 a las 11:06:35.
Responder Con Cita
  #5  
Antiguo 15-06-2012
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 20
cesarsoftware Va por buen camino
Perdona que siga, pero me he dado cuenta que se puede hacer mas sencillo si pertenecen a la clase del formulario

Código Delphi [-]
procedure TFormProveedorFactura.ControlesResaltados();
var
  i: word;
begin
  for i := 0 to Self.ComponentCount - 1 do
  begin
    if Self.Components[i] is TWinControl then
    begin
      if MethodAssigned(Self.Components[i],'OnEnter') = False then
        AssignMethod(Self.Components[i], 'OnEnter', Self.ControlEnter);
      if MethodAssigned(Self.Components[i],'OnExit') = False then
        AssignMethod(Self.Components[i], 'OnExit', Self.ControlExit);
    end;
  end;
end;

procedure TFormProveedorFactura.ControlEnter(Sender: TObject);
begin
  TWinControl(Sender).Brush.Color := clSkyBlue;
end;

procedure TFormProveedorFactura.ControlExit(Sender: TObject);
begin
  TWinControl(Sender).Brush.Color := clWindow;
end;

Ya solo falta sacarlo del formulario y que este (Self) sea un parametro

Sigo, a ver si lo consigo
Responder Con Cita
  #6  
Antiguo 15-06-2012
Avatar de ozsWizzard
ozsWizzard ozsWizzard is offline
Miembro
 
Registrado: may 2004
Ubicación: Murcia
Posts: 190
Poder: 23
ozsWizzard Va por buen camino
Es que yo lo hice para que lo pusieras en una unidad externa al formulario, así sólo tienes que poner en el uses de cada formulario (o hacer un formulario padre del cual hereden todos) y ya está.

Pensé, además, que era lógico que para llamar a "ControlesResaltados" había que pasarle el formulario,

Bueno, me alegro de que te haya funcionado.
__________________
La Madurez se llama...
~~~Gaia~~~
Responder Con Cita
  #7  
Antiguo 15-06-2012
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 20
cesarsoftware Va por buen camino
Hola ozaWizzard.

pero no te da error
Obj.OnEnter := ControlEnter;

[DCC Error] Metodos.pas(47): E2362 Cannot access protected symbol TWinControl.OnEnter

Uso Delphi 10,si no la verdad que lo ideal es que sea una unidad y la llamemos en el uses.

¿Que version usas?
Responder Con Cita
  #8  
Antiguo 15-06-2012
Avatar de ozsWizzard
ozsWizzard ozsWizzard is offline
Miembro
 
Registrado: may 2004
Ubicación: Murcia
Posts: 190
Poder: 23
ozsWizzard Va por buen camino
La verdad es que ni lo probé, lo puse aquí directamente
__________________
La Madurez se llama...
~~~Gaia~~~
Responder Con Cita
  #9  
Antiguo 15-06-2012
Avatar de ozsWizzard
ozsWizzard ozsWizzard is offline
Miembro
 
Registrado: may 2004
Ubicación: Murcia
Posts: 190
Poder: 23
ozsWizzard Va por buen camino
Pero vamos, que lo del "as Tipo" lo puedes hacer a un nivel que te permita modificarle el OnEnter o el OnExit, aunque si así funciona, pues mejor

Yo es que asigno el método OnExit a unos TEdit y unos TMemo, por lo tanto, en lugar de TWinControl usaba TCustomEdit y si funciona.
__________________
La Madurez se llama...
~~~Gaia~~~
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Saber si un método tiene implementación gushynet OOP 24 06-03-2009 20:52:57
Saber si un parametro de un Query ha sido asignado sinalocarlos Varios 1 26-03-2008 02:44:38
Saber qué procedimento tiene asignado un evento Ohcan OOP 2 21-06-2005 13:56:38
Como saber los dias que tiene un mes?? alfredosg19 Varios 3 06-03-2005 12:56:12
Saber si la Variable tiene letras cmgenny Varios 1 11-05-2004 08:00:59


La franja horaria es GMT +2. Ahora son las 14:22:27.


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