Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #41  
Antiguo 22-01-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: May 2003
Ubicación: Ciudad de México
Posts: 20.172
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Je, je, ¿asumo que ya lo has resuelto?



// Saludos
Responder Con Cita
  #42  
Antiguo 22-01-2009
poyo poyo is offline
Miembro
 
Registrado: Jan 2009
Posts: 51
Poder: 10
poyo Va por buen camino
Exclamation

Claro que sí! sino no creo que hubiese podido dormir tranquilo!
Y, como una cosa lleva a otra... me desperté con una incógnita:

y si tubiese más de un parámetro, se podriá saber (programáticamente hablado) hasta cuántos? y acceder a ellos?

La dejo picando.
Responder Con Cita
  #43  
Antiguo 22-01-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: May 2003
Ubicación: Ciudad de México
Posts: 20.172
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Cita:
Empezado por poyo Ver Mensaje
y si tubiese más de un parámetro, se podriá saber (programáticamente hablado) hasta cuántos? y acceder a ellos?
Pues supongo que hasta tres parámetros es sencillo, aunque en realidad ya tenemos tres Los demás me imagino que también es posible pero habrá que entender bien el frame, cosa que no hago yo

// Saludos
Responder Con Cita
  #44  
Antiguo 23-01-2009
poyo poyo is offline
Miembro
 
Registrado: Jan 2009
Posts: 51
Poder: 10
poyo Va por buen camino
Lightbulb No aclaremos que oscurece ;)

Cita:
Pues supongo que hasta tres parámetros es sencillo, aunque en realidad ya tenemos tres Los demás me imagino que también es posible pero habrá que entender bien el frame, cosa que no hago yo
mmmmmm.... me temo que no es así.
si se sabe cuántos parámetros tiene el constructor (0, 1 o más), no hay problema.
Aunque hay que tener en cuenta que todo esto no son funciones comúnes y corrientes sino que son parte de la Magia Negra del Compilador (Compiler Magic).
Estos funciones no suelen seguir las reglas generales y este caso no es excepción.
En este caso no siguen la regla ADC. Sólo pasar el primero por C y el resto, en caso de haber más, como siempre.

El problema es que, si no se sabe cuántos parametros tiene el constructor, ¿cómo darse cuenta?

De hecho, saber si tiene parámetros o no, ya es otro desafío. (hay que ver qué valor viene por defecto en C y compararlo... no pude descubrir de dónde sale).
¿y si tiene más de uno? otro tema aparte ya que, en este caso, los parámetros no se encuentran en el stack frame actual. Yo paso.

Es que de momento no le encuentro utilidad práctica. Al González tal vez conozca alguna utilidad. Cuentanos Al!

Última edición por poyo fecha: 23-01-2009 a las 23:06:06. Razón: errores
Responder Con Cita
  #45  
Antiguo 24-01-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: May 2003
Ubicación: Ciudad de México
Posts: 20.172
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
¡Ah! Claro amigo. Yo estaba presuponiendo que se sabría de antemano el número de parámetros; de ahí que comentara lo de los tres parámetros, o ADC como tú les llamas

En cuanto a lo de la magia del compilador, a eso me refería cuando dije:

Cita:
Empezado por roman
aunque en realidad ya tenemos tres
es decir, A y D los pasa el compilador y C lo pasa el constructor (y aquí ya prácticamente se dijo todo, ¿eh! Delphius )?

Lo de la utilidad práctica, ya Al mencionó un ejemplo desde el principio, aunque, desde luego, este hilo es un mero ejercicio, más por gusto que por utilidad

// Saludos
Responder Con Cita
  #46  
Antiguo 24-01-2009
poyo poyo is offline
Miembro
 
Registrado: Jan 2009
Posts: 51
Poder: 10
poyo Va por buen camino
Antes que nada, algo para aportar al tema:
http://vassbotn.googlepages.com/TheR...lOfTObject.pdf

Estamos hablando en voz baja creo. jejejejejeje.

Hasta cuando seguiremos en voz baja? o abrimos otro hilo para hablar sobre los detalles?
Responder Con Cita
  #47  
Antiguo 24-01-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: May 2003
Ubicación: Ciudad de México
Posts: 20.172
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
¡Qué bien!

Necesitaba algo que leer en lo que espero a alguien. Se ve muy interesante.

// Saludos
Responder Con Cita
  #48  
Antiguo 24-01-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: May 2003
Posts: 5.504
Poder: 23
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

En mi caso, a mí es al que esperan cerca de aquí.

Debo irme, pero antes externar mi gusto por que alguien más, en este caso Poyo, haya encontrado la solución.

Román tiene razón respecto a que sí hay tres parámetros en juego. Y también sobre que en el primer mensaje puse un enlace a este caso, en el cual resultaría bastante útil el mecanismo (para prescindir de la función CreateSuperGlobalObject y la variable ObjectName auxiliares).

Recientemente lo implementé en otro caso donde también necesitaba que NewInstance obtuviera información a través del constructor. Y pues básicamente ese es el asunto: "parametrizar" el comportamiento de NewInstance elegantemente, sin necesidad de usar elementos externos adicionales, simplemente aprovechando el propio manejo que el compilador hace de los parámetros.

Propongo que al menos esperemos a que Marcelo lo resuelva para dar mayores detalles. ¡Anda Delphius! Un poco de ensamblador no le hace daño a nadie, y menos si son veinte miserables caracteres visibles.

Un abrazo semanal.

Al González.
__________________
Twitter
Código
Blog
WhatsApp para consultas rápidas y asesorías profesionales: +52 1 2711260117
Responder Con Cita
  #49  
Antiguo 24-01-2009
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: Jul 2004
Ubicación: Salta, Argentina
Posts: 5.598
Poder: 20
Delphius Va camino a la fama
Hola,
Les agradezco que me hayan dado tiempo para que yo mismo hallara el problema. Lo intenté, de veras lo intenté, pero mi cabeza me dice que hasta aquí llego.

Comprendo la regla ADC que mencionan, pero de lo que he leído no siempre se sigue. Llego a entender, superficialmente, que se sigue la regla de Pascal por defecto register: los parámetros se apilan en el orden en que se declaran: el primero en EAX, el segundo en EDX, el tercero en ECX. De allí en más no puedo profundizar.

Por más Debugger que haga, entre MOV, POP, PUSH y demás me pierdo. Intenté ver que sucede en un escenario normal, sin alterar código y luego intentando alterar el código, pero esto me gana.

No se si he logrado entenderlo del todo: ¿tenemos dos parámetros en realidad? Por lo que siempre e tenido casi como biblia es que de forma automática el compilador pasa una referencia de la clase: self. Luego, vienen los restantes parámetros que disponga el método en cuestión. En este caso el método Create y el parámetro AOwner. Ahora, si se aplica la regla: en EAX queda "Self" y en EDX AOwner.

Más no puedo, y la verdad es que prefiero no seguir gastandome. Tal vez como ejercicio de aprendizaje y para solidificar algunos conceptos sea muy bueno seguir, pero reconozco que más hallá de InitInstance y CleanupInstance es un mundo desconocido para mi. Y aqui me detengo a hacer caso a la frase mejor viejo conocido que nuevo por conocer.

No se que tanto me pueda servir, esto, yo desde hace meses que vengo estudiando la magia de la VCL, todavía no he llegado a un buen porcentaje (ni sabría decir que tan poco he estudiado, no llevo estadísticas de esto). A medida en que considero oportuno me sumerjo, leo, estudio la ayuda y analizo el código. Este ejercicio me viene ayudando a complementar mis conocimientos superficiales y generales de lo que es la rama "más visual" de la VCL, además que me ayuda a reordenar los conceptos de POO.
Pienso que más de lo que hago ya es demasiado para mí. Por empezar nunca me he considerado programador, como ya lo he dicho en otras ocasiones. Me gusta programar y meterme en conceptos POO y buscarle enfoques prácticos, pero de allí a hacer un programador 100% no creo llegar. Me considero más como un arquitecto o analista, en donde une piezas buscando que encajen y lleguen a una solución.

Si ustedes, luego desean hablar al respecto sobre el tema, yo creo que muchos, tal vez incluído yo, verán a Delphi desde otra perspectiva y podrán complementar sus conocimientos.

Disculpen que tire la toalla, para adentrarme más adentro necesitaría un traje de buzo ultra reforzado, del metal más resistente (o tal vez echo de nanotubos de carbonos), aprender a bucear, a usar el equipo, y tener un buen equipo de rescatistas. El último elemento se que está aquí, el resto no se.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #50  
Antiguo 24-01-2009
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 28.333
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Me resultan fantásticos los conocimientos que tienen Al González y Roman
Responder Con Cita
  #51  
Antiguo 25-01-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: May 2003
Ubicación: Ciudad de México
Posts: 20.172
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Hombre Delphius, yo creo que prácticamente ya tienes la respuesta. Considero que para ver más clara la situación, conviene trabajar no con TComponent sino con una clase primitiva:

Código Delphi [-]
type
  TMiObjeto = class
  protected
    class function NewInstance: TObject; override;

  public
    constructor Create(Dummy: Integer);
  end;

{ TMiObjeto }

constructor TMiObjeto.Create(Dummy: Integer);
begin
  //
end;

class function TMiObjeto.NewInstance: TObject;
begin
  Result := inherited NewInstance;
end;

Luego, creen una instancia de TMiObjeto así:

Código Delphi [-]
O := TMiObjeto.Create($abcdef10); // así, pasando el parámetro como hexadecimal

Pongan un punto de ruptura en la última línea y ejecuten. Cuando el IDE se detenga ahí, opriman Ctrl+Alt+C para ver la ventana del CPU, y el lugar donde se guarda el parámetro se distinguirá nítidamente.

// Saludos
Responder Con Cita
  #52  
Antiguo 25-01-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: May 2003
Ubicación: Ciudad de México
Posts: 20.172
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Me resultan fantásticos los conocimientos que tienen Al González y Roman
No te olvides de poyo. Pero en mi caso, yo sólo tengo una vaga idea del paso de parámetros y aún menor del stack. Cuando vi dónde se guardaba el parámetro, intenté la única instrucción que se me ocurrió, esperando que funcionara de esa manera y tuve la suerte de que así fuera

// Saludos
Responder Con Cita
  #53  
Antiguo 25-01-2009
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: Jul 2004
Ubicación: Salta, Argentina
Posts: 5.598
Poder: 20
Delphius Va camino a la fama
Gracias roman por la patadita en el traste, que bien merecida la tengo. ¿Porqué no lo vi antes?

Si seré de bestia, que yo me ponía a ver que iba sucediendo desde la otra orilla. ¡Con razón me hacía lío y nunca llegaba!

La q** l* t*** había resultado ser una pequeñez. Sip, 20 caracteres (si no contamos los espacios).

Bueno, al menos recibo el cartelito, así que algo bueno debo haber hecho porque los anteriores intento me llevaban a errores de memoria.

¿Esperamos a otros? ¿O se publica la solución?

Saludos,
PD: Al, para el próximo reto avisame antes asi voy por las aspirinas
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #54  
Antiguo 30-01-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: May 2003
Posts: 5.504
Poder: 23
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Felicidades Marcelo!

Bueno, hoy es viernes y hasta el momento tres compañeros del club han logrado resolver el reto: Román, Poyo y Delphius. Con lo que ya se ha escrito tenemos un buen número de pistas para que otros colegas se animen a resolver el problema también.

¿Quién más quiere encontrar la solución picando un poco de código?
__________________
Twitter
Código
Blog
WhatsApp para consultas rápidas y asesorías profesionales: +52 1 2711260117
Responder Con Cita
  #55  
Antiguo 30-01-2009
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: Jul 2004
Ubicación: Salta, Argentina
Posts: 5.598
Poder: 20
Delphius Va camino a la fama
Al, recuerda que yo lo saqué a puras pataditas. Porque si no fuera por las pistas, yo no lo sacaba.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #56  
Antiguo 13-01-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: Jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.647
Poder: 12
rgstuamigo Va por buen camino
Arrow

Ya que en cierta forma no se ha dado a conocer la respuesta a este reto, y como hace ya mas de un año de iniciacion del Hilo, pues me tomo la molestia de publicar la respuesta y pego a continuacion un codigo explicativo:
Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 type
  TMiObjeto = class
  protected
    class function NewInstance: TObject; override;

  public
    constructor Create(Dummy: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMiObjeto }

constructor TMiObjeto.Create(Dummy: Integer);
begin
 ShowMessage('Se ejecuto el create');
end;

class function TMiObjeto.NewInstance: TObject;
var aux:Integer;
begin
  asm
    MOV aux,ECX // el parametro del constructor de guardo en el registro ECX
  end;
 ShowMessage('Je,je,je...ya sé que el parametro del constructor es : '+IntToHex(aux,0));
 Result := inherited NewInstance;
end;

procedure TForm1.Button1Click(Sender: TObject);
var   O:TMiObjeto;
begin
  O:=TMiObjeto.Create($abcdef);{<--el parametro del create se guarda en el
              registro ECX antes de ser ejecutado el create y el NewInstance
              }
end;

end.
Cabe mencionar que en realidad el metodo create llama al NewInstance antes de ejecutar el codigo que contenga internamente;es decir en el momento de iniciar el create(Primer Begin) es donde se ejecuta el NewInstance, de ahi que el amigo Al dijera que primero se ejecuta el NewInstance y luego el Create..Desde Luego de que antes que se ejecute el create, lo que hace el compilador es guardar el parametro introducido en el Create en el registro ECX, para luego(en el primer Begin del Create)Guardarlo en la pila.
Bueno para hacerlo mas comprensivo lo explico asi:
Primero-> Se guarda el parametro del create al registro ECX antes de ejecutarse el create.
Segundo-> Se ejecuta el Create pero no el codigo interno sino el primer Begin (ustedes pueden poner un Punto de rutura en el primer begin del create y luego al detenerse la ejecucion en ese punto pueden presionar Ctrl+Alt+C para mirar lo que ocurre en la CPU)
Tercero->Dentro del primer Begin del Create se guarda el contenido del registro ECX ala pila y luego se ejecuta el metodo NewIntance.
De ahi que cuando se ejecuta el NewIntance ya se sabe de donde obtener el parametro del create.

Si estoy confundiendo las cosas pido que me lo aclaren.
Pero eso es lo que yo he observado experimentalmente..
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 13-01-2010 a las 14:32:51.
Responder Con Cita
  #57  
Antiguo 14-01-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: May 2003
Posts: 5.504
Poder: 23
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Muy buena explicación, rgstuamigo.

Sólo comentar que en tu ejemplo puedes prescindir del uso de números hexadecimales, a no ser que lo del 11259375 haya sido para despistar.

Un abrazo de año nuevo.

Al González.
__________________
Twitter
Código
Blog
WhatsApp para consultas rápidas y asesorías profesionales: +52 1 2711260117
Responder Con Cita
  #58  
Antiguo 14-01-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: Jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.647
Poder: 12
rgstuamigo Va por buen camino
Arrow

Cita:
Empezado por Al González Ver Mensaje
Sólo comentar que en tu ejemplo puedes prescindir del uso de números hexadecimales, a no ser que lo del 11259375 haya sido para despistar.
Lo puse asi para ver claramente lo que ocurre en la CPU.
Igualmente te mando un saludo de año nuevo. ahhhh y que raro que este año no nos haya salido con otro reto..
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿Qué les parece un reto? D-MO PHP 20 24-07-2007 18:45:11
Un reto con Qreport MRSAM Conexión con bases de datos 8 13-07-2007 19:10:58
Esto si es un reto perrogrun OOP 10 09-07-2004 22:49:25
Un reto a todos Rendertaker Internet 3 14-04-2004 22:51:29
Reto de Impresora (VB vs Delphi) torito Varios 12 21-11-2003 19:54:59


La franja horaria es GMT +2. Ahora son las 07:02:34.


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