Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   crear componentes a partir de la una función (https://www.clubdelphi.com/foros/showthread.php?t=66556)

GerTorresM 25-02-2010 22:54:54

crear componentes a partir de la una función
 
Hola a todos la situaciones del día de hoy es la siguiente:

en la actualidad tengo una función que me permite crear una consulta, esta función queda de la siguiente forma

Código Delphi [-]

function CrearConsulta() : TQuery;
Var TempConsultaLocal : TQuery;
begin
  TempConsultaLocal:= TQuery.Create(nil);
  with TempConsultaLocal do
    begin
      DatabaseName:= DMDatosServicios.DBServicios.DatabaseName;
      close;
    end;
  Result:= TempConsultaLocal;
end;

ahora en orden de ideas funciona de la mejor de la formas, pero me pregunto si puedo crear de forma igual componentes para colocar en mi formulario, para lo cual planteo el inicio de la siguiente función

Código Delphi [-]
function CrearComponente(pTop, pLeft, pWidth, pHeigth: Integer; pParent: TWinControl; pTipoComponente : TComponent) : TWinControl;
Var componente_temporal : TWinControl;
begin
  componente_temporal:= pTipoComponente.Create(nil);
  try
    componente_temporal.Parent:= pParent;
    componente_temporal.top:= pTop;
    componente_temporal.left:= pLeft;
    componente_temporal.width:= pWidth;
    componente_temporal.Height := pHeigth;
  except
  end;
  Result:= componente_temporal;
end;

Al intentar ejecutar el codigode la funcion
Código Delphi [-]
begin
  SGTarifa_local:= CrearComponente(0,0,100,50,self,TStringGrid);
end

obtengo este mensaje de error

incompatible types: 'TComponent' and 'Class Reference'

para lo efectos SGTarifa es un StringGrid

roman 26-02-2010 04:33:29

Tendría que ser:

Código Delphi [-]
SGTarifa_local:= CrearComponente(0,0,100,50,self,TStringGrid) as TStringGrid;

Por otro lado, ¿estás consciente de que debes destruir los objetos creados de esta manera?

// Saludos

BrunoBsso 26-02-2010 06:26:45

Cita:

Empezado por roman (Mensaje 355152)
Tendría que ser:

Código Delphi [-]SGTarifa_local:= CrearComponente(0,0,100,50,self,TStringGrid) as TStringGrid;


Por otro lado, ¿estás consciente de que debes destruir los objetos creados de esta manera?

// Saludos

Como te explico el sabio roman, vos no estabas creando un StringGrid, porque le estabas pasando la clase. Al ponerle as TStringGrid creas el objeto diciéndole que tipo va a ser.

Y por si no se entendió lo que dijo roman, lo digo porque a mi me costaba entender ese concepto, al crearlo a través de una función tuya no estás permitiéndole a delphi generar el destructor. Tendrías que generarlo por código y me parece que no es muy funcional hacerlo así.

roman 26-02-2010 16:02:50

Cita:

Empezado por BrunoBsso (Mensaje 355156)
Al ponerle as TStringGrid creas el objeto diciéndole que tipo va a ser.

Bueno, no exactamente. El objeto se crea como TStringGrid desde un principio, sin necesidad del as. Pero de esta forma le indicamos al compilador que confíe en nosotros, que realmente el objeto es un TStringGrid.

Pero, en realidad no me había fijado bien; el problema viene desde antes. El error que marca el compilador se refiere al paso del último parámetro. Ese argumento es de tipo TComponent y se le quiere pasar un referencia de clase. Tendría que definirse dicho parámetro como TComponentClass, o mejor aún, como TWinControlClass ya que es lo que queremos devolver.

// Saludos

BrunoBsso 26-02-2010 19:30:26

Es que él quizo hacer un CrearComponente genérico, y con TStringGrid es necesario el as. Yo me fijaba concretamente en eso.
Parece que cada vez que respondo estás vos ahí para negarme/desestimar lo que digo.
Mejor dejo de querer ayudar, es molesto decir A y que atrás vengas vos con "no, porque si le cambias un package y le editas el source del application vas a usar B.J.P". Ya me cansé de eso.
Saludos y que anden bien.

roman 26-02-2010 19:44:16

Hombre, disculpa si te he parecido pesado, pero realmente no es mi intención "andar detras de ti". Si intervengo, es porque considero que no es bueno dejar una idea errónea a otros foristas y porque pienso que de esa manera ayudo no sólo al otro forista sino también a ti.

En todo caso, aunque mi intención no es la de molestarte, te pido disculpas si es la impresión que te he causado y cuidaré más la forma en que comento tus mensajes.

// Saludos

movorack 26-02-2010 20:00:46

que delicados estamos...


La franja horaria es GMT +2. Ahora son las 19:26:55.

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