Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   La Taberna (https://www.clubdelphi.com/foros/forumdisplay.php?f=40)
-   -   Reto Delphi (https://www.clubdelphi.com/foros/showthread.php?t=83592)

Casimiro Notevi 04-07-2013 11:23:39

Reto Delphi
 
Nuestro amigo Al González ha publicado en su blog un reto para los programadores Delphi, puede participar quien quiera y obtener el premio para el ganador a la mejor solución.

newtron 04-07-2013 13:33:45

Buen reto, a ver los programadores del foro si salen por la puerta grande o por el chiquero, yo miraré desde la barrera. :D

Chris 04-07-2013 19:39:54

Leer el archivo DFM asociado al formulario. Allí puedes encontrar el nombre que tendrá el componente. :cool:

Casimiro Notevi 04-07-2013 19:47:36

Deberías contestar en los comentarios del blog de Al, ya que allí están las respuestas de los participantes :)

Suerte ^\||/

Casimiro Notevi 07-07-2013 01:06:42

¿Ningún valiente se atreve con el reto?, jejeje... :)
Blog de Al González.

Al González 27-04-2014 07:26:31

Muchas gracias, Casimiro, por hacer eco del ejercicio que propuse en mi bitácora hace casi 10 meses.

No creí que fuera a transcurrir tanto tiempo sin que algún compañero de la Comunidad lo resolviera. Algunos pensarán entonces que el reto es muy difícil, pero no es así, es sólo que el truco está un poco escondido en los engranes de la VCL (además de la poca difusión que ha tenido).

Me gustaría ofrecer un monto mayor de premio, y si llega a estar en mis capacidades así lo haré con mucho gusto. Como sea, ojalá más gente se una.

Un saludo y buena semana a todos. :)

nlsgarcia 02-05-2014 05:50:13

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 :confused: , 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 :rolleyes:

Revisa esta información:
Cita:

Empezado por RAD Studio VCL Reference

Espero sea útil :)

Nelson.

Casimiro Notevi 02-05-2014 09:43:11

Pero contesta en el blog de Al González :p

nlsgarcia 02-05-2014 13:46:39

Casimiro,

Cita:

Empezado por Casimiro
...Pero contesta en el blog de Al González... :p

Ya lo conteste :)



Nelson.

Casimiro Notevi 02-05-2014 13:58:30

Estupendo, alguien se va a llevar el premio ^\||/

roman 02-05-2014 18:26:24

Cita:

Empezado por nlsgarcia (Mensaje 475957)
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.

El reto especifica que el nombre ha de obtenerse desde el constructor del componente, no del formulario. El método SetName es llamado por TReader.ReadComponent después de la llamada al constructor del componente.

// Saludos


La franja horaria es GMT +2. Ahora son las 11:35:49.

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