Tema: Reto Delphi
Ver Mensaje Individual
  #7  
Antiguo 02-05-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Reputación: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Al González,

Cita:
Empezado por Al González
...¿cómo podría el constructor Create de un componente, como el que pusimos dentro de nuestro formulario, saber qué nombre le dio usted en tiempo de diseño?...
Cita:
Empezado por Al González
...Añadiré otra pista: Si bien redefinir un método de TForm es clave para resolver el problema, puede que su constructor no sea el más adecuado...
Cita:
Empezado por Al González
...La solución que tengo en mente propone aprovechar los mecanismos de streaming existentes, colgarnos del tren que va avanzando, por decirlo de una manera, redefiniendo no sólo el constructor del componente de prueba, sino también cierto método virtual del formulario para permitir al componente acceder al furgón de la correspondencia...
Cita:
Empezado por Al González
...Daré otra pista, esta vez una jugosa: Durante la ejecución del constructor del componente, "algo" ya está procesando el DFM, entonces preguntémosle a ese "algo" (como dije anteriormente, "colgarnos del tren y acceder al furgón de la correspondencia")...
Cita:
Empezado por Al González
...Meterse directo al recurso DFM puede servir, pero esto no va por ahí. La solución es más limpia, elegante y orientada a objetos...
Los comentarios anteriores fueron tomados de : Rescatando a Delphi - Reto Delphi

Revisa este código:
Código Delphi [-]
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    type
    
      TButton = class(StdCtrls.TButton)
      private
        FName : String;
      public
        constructor Create(AOwner: TComponent); override;
        procedure SetName(const NewName: TComponentName); override;
        destructor Destroy; override;
      end;
    
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    constructor TButton.Create(AOwner: TComponent);
    begin
       inherited Create(AOwner);
    end;
    
    procedure TButton.SetName(const NewName: TComponentName);
    begin
       inherited SetName(NewName);
       FName := Name;
       ShowMessage(Name);
    end;
    
    destructor TButton.Destroy;
    begin
       inherited;
    end;
    
    end.
El código anterior en Delphi 7 bajo Windows 7 Professional x32, obtiene y muestra el nombre asignado en tiempo de diseño a las instancias del componente TButton inmediatamente después de finalizar el constructor del mismo y antes de que sea visualizado el formulario. Los métodos Create y Destroy no son necesarios para obtener el nombre del componente TButton, fueron colocados solo para seguir la secuencia en Runtime del componente en modo Debug.

Nota: Se utilizo como ejemplo el componente TButton, pero el mismo procedimiento se puede extender a cualquier componente dentro de un formulario, con lo cual se obtiene el nombre asignado al mismo en tiempo de diseño inmediatamente después de finalizar su constructor.

Comentario: Desconozco si esta es la solución que esperabas encontrar , pero creo que resuelve el problema en términos de POO de forma simple y directa por medio de la redefinición del método virtual SetName del componente requerido

Revisa esta información:
Cita:
Empezado por RAD Studio VCL Reference
Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 02-05-2014 a las 05:58:49.
Responder Con Cita