PDA

Ver la Versión Completa : ¿Como se declara correctamente un constructor?


flystar
20-04-2010, 19:55:30
Hola Amigos, solicito ayuda a alguna alma caritativa que me puedas orientar en lo siguiente, hice una unidad nueva para contener unas funciones de trabajo para mis proyectos, tengo un procedimiento que puede recibir unos parametros, sin embargo estoy viendo que en ocaciones es necesario que reciba menos parametros de lo que normalmente recibiria, y para tal caso tengo pensado declarar varias veces ese mismo procedimiento pero con diferentes cantidad de parametros, supongo que para eso son los constructores entre otras cosas o no?

Total para eso tengo entendido que debes cambiar la palabra "procedure" por "constructor" pero si lo hago me sale error de sintaxis:

[Error] UFunciones.pas(12): Undeclared identifier: 'ControlBarraDeBotonesAltasCambiasEdicion'
[Fatal Error] AdminCountier1.dpr(8): Could not compile used unit 'UFunciones.pas'


vamos a suponer que quiero declarar 2 veces el procedimiento
ControlBarraDeBotonesAltasCambiasEdicion pero aceptando diferente cantidad de parametros...como lo debo hacer?

Mi codigo es este:

////////////////////////////////////////////////////////////////////////////////
unit UFunciones;

interface
uses
UformaAcceso, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
fcOutlookList, fcButton, fcImgBtn, fcShapeBtn, ExtCtrls, fcClearPanel,
fcButtonGroup, fcOutlookBar, ImgList, fcImager, ComCtrls, StdCtrls, Db,
Mask, DBCtrls, ProfDateTimePicker, dxCntner, dxEditor, dxEdLib, dxDBELib,
Spin, wwdbedit, Wwdbspin, fcLabel, ToolWin, Buttons, Wwkeycb, dxDBTLCl,
dxGrClms, dxTL, dxDBCtrl, dxDBGrid, Menus, DBTables;

procedure ControlBarraDeBotonesAltasCambiasEdicion(BotonAlta, BotonEdicion, BotonBorrar, BotonAceptar,BotonCancelar:TSpeedbutton; AccionPasada:string; Tabla: Tdataset; Grupo:Tgroupbox);


implementation

procedure ControlBarraDeBotonesAltasCambiasEdicion(BotonAlta, BotonEdicion, BotonBorrar, BotonAceptar,BotonCancelar:TSpeedbutton; AccionPasada:string; Tabla: Tdataset; Grupo:Tgroupbox);
begin
if (AccionPasada='Insertar') then
begin
Tabla.Insert;
BotonEdicion.Enabled:=false;
BotonAceptar.Enabled:=true;
BotonCancelar.Enabled:=true;
BotonAlta.Enabled:=false;
BotonBorrar.Enabled:=false;
grupo.Enabled:=true;
end;
if (AccionPasada='Editar') then
begin
Tabla.Edit;
BotonEdicion.Enabled:=false;
BotonAceptar.Enabled:=true;
BotonCancelar.Enabled:=true;
BotonAlta.Enabled:=false;
BotonBorrar.Enabled:=false;
grupo.Enabled:=true;
end;
if (AccionPasada='Aceptar') then
begin
Tabla.Post;
BotonEdicion.Enabled:=true;
BotonAceptar.Enabled:=false;
BotonCancelar.Enabled:=false;
BotonAlta.Enabled:=true;
BotonBorrar.Enabled:=true;
grupo.Enabled:=false;
end;
if (AccionPasada='Cancelar') then
begin
Tabla.Cancel;
BotonAlta.Enabled:=true;
BotonEdicion.Enabled:=true;
BotonAceptar.Enabled:=false;
BotonCancelar.Enabled:=false;
BotonBorrar.Enabled:=true;
grupo.Enabled:=false;
end;
end;
//////////////////////////////////////////////////////////////////////

flystar
20-04-2010, 19:56:29
No hagan caso a este mensaje..no supe como borrarlo

Lord Delfos
20-04-2010, 20:01:33
La palabra reservada "constructor" se usa para declarar un constructor en una clase. Vos no estás usando clases, así que lógicamente no andaría.

Para declarar uno o más procedimientos/funciones que se llamen igual pero tengan diferentes parámetros, usá la palabra reservada "overload". Es lo que se llama sobrecarga de operadores.



procedure HacerAlgo(Par1, Par2: Integer; var Par3: string); overload;
procedure HacerAlgo(Par1, Par2: Integer); overload;

[...]

procedure HacerAlgo(Par1, Par2: Integer; var Par3: string); overload;
begin
end;

procedure HacerAlgo(Par1, Par2: Integer); overload;
begin
end;



Y listo. Así de fácil es.

Saludongos.

flystar
20-04-2010, 20:02:16
Saludos amigos

parece que lo que hay que hacer es ponerle la palabra overload en la seccion de interface a los encabezados de cada procedimiento...

No se trata del asunto de los constructores.. osea que sería así:

procedure ControlBarraDeBotonesAltasCambiasEdicion(BotonAlta, BotonEdicion, BotonBorrar, BotonAceptar,BotonCancelar:TSpeedbutton; AccionPasada:string; Tabla: Tdataset; Grupo:Tgroupbox); overload

procedure ControlBarraDeBotonesAltasCambiasEdicion(BotonEdicion, BotonBorrar, BotonAceptar,BotonCancelar:TSpeedbutton; AccionPasada:string; Tabla: Tdataset; Grupo:Tgroupbox); overload

Si alguien tiene una idea mejor, agradesco sugerencias

Lord Delfos
20-04-2010, 20:12:37
Correcto, así sería.

Realmente no hay mucho que se pueda hacer en estos casos. Yo creo que tenés dos posibilidades:

[1] Cambiarles el nombre para que reflejen los cambios de comportamiento. Por ejemplo: ControlBarraDeBotonesAltasCambiasEdicion y ControlBarraDeBotonesAltasCambiasEdicion_ConX. Lo que pasa es que tu nombre ya es bien largo como para andar agregando sufijos... :)
[2] Usar sobrecarga.

Lo de sobrecargar tiene la desventaja de que si el día de mañana tenés comportamiento distinto, pero con los mismos parámetros, no podés sobrecargar. Tenés que cambiarles el nombre y te quedan funciones con sobrecarga y funciones con sufijo. Es decir, dos paradigmas distintos.