Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Funciones y Polimorfismo: Como pasar parámetros (https://www.clubdelphi.com/foros/showthread.php?t=45739)

gaps2k 12-07-2007 22:36:57

Funciones y Polimorfismo: Como pasar parámetros
 
Hola Listeros,

Estoy desarrollando una apliación en donde tengo varias estructuras similares, que difrieren más que todo en cantidad de atributos que en comportamiento.

Tengo Detalles de Factura, de Ordenes de Compra y De Ordenes Productivas.

Declaro una Clase TDetalle que tiene los valores y comportamiento común a todos. Y declaro las otras clases Heredando de esta,

Ej: TDetalleFactura que hereda de TDetalle
TDetalleFactura = Class(TDetalle)

El problema que tengo es que declaro una función que recibe como parámetro un Objeto de tipo TDetalle y cuando trato de pasarle un TDetalleFactura o TDetalleOrden, me dice que los tipos de datos son incompatibles.

La función no pertenece a ninguna de las Clases, solo las recibe como parámetro. Trabajo Delphi 7.

Espero que puedan ayudarme (o guiarme!!).

dec 12-07-2007 22:53:33

Hola,

Podrías poner algo del código fuente implicado en el asunto. Lo cierto es que deberías poder pasar como parámetro un "TDetalleFactura", por ejemplo, en un procedimiento que requisiera un "TDetalle", o sea, lo que necesitas puede hacerse, habría que ver, entonces, cómo estás tratando de hacerlo. :)

gaps2k 12-07-2007 23:28:15

Código
 
Código Delphi [-]
//Esta es la clase madre
 
Type
TDetalle = class(TObject)
-
-
end;
 
//Clase Derivada
 
Type
TDetalleFactura = class(TDetalle)
-
-
end;
 
//funcion Problematica
function trabajar_fila(fila, columna : integer; mueve : boolean; encabezado:TEncabezado; 
  lineas:array of TDetalle; sql:TQuery; grid_prod:TStringGrid) : boolean;

Según la teroría debería funcionar!!

dec 12-07-2007 23:32:19

Hola,

Alto ahí forastero, no te llevarás nuestro oro... huy, perdón, que me lío. :) Que digo que la "función problemática" requiere, precisamente, un "array de TDetalles", o sea, no un "TDetalle" cualquiera. Ojo, ¿seguro que estás intentando pasar un Array? Hagamos una cosa, transcribe aquí, literalmente, el error que te da el compilador.

dec 12-07-2007 23:37:00

Hola,

Vale... a lo mejor me estoy pasando de listo o me estoy perdiendo algo. Haciendo algunas pruebas, aunque la "función problemática" requiera un "Array de TDetalle", lo cierto es que acepta también que se le pase un simple "TDetalle".

Pero, ojo, en mis pruebas puedo pasar también a la función un "TDetalleFactura" sin problemas...

Y ahora la duda la tengo yo... ¿Cómo es que acepta la función un simple "TDetalle" si lo que requiere es un Array? Yo estoy no lo había visto antes. Y además puede llamarse a la función tanto así:

Código Delphi [-]
Func(Detalle)

Como así:

Código Delphi [-]
Func([Detalle])

Que sería lo que se entendería mejor... ¿Alguien puede decir algo a este respecto? Gracias. :)

gaps2k 12-07-2007 23:40:36

Necesito Tener 6 Documentos simultaneamente
 
trabajar_fila(i, 0, false,
encabezados_orden[i], //este es un TencabezadoOrden array [0..5]
grid[i], //arreglo de Detalles
sql_aux, //tquery
grid_prod) //TStringGrid

El grid[i], es un: grid : array[0..5, 1..8] of TLineaOrdenProduccion;

(TLineaOrdenProduccion, hereda de TDetalle)

El errior dice:

(1069): incompatible types

dec 12-07-2007 23:44:45

Hola,

¿No deberías especificar "el grid" mediante dos índices? Es decir:

Código Delphi [-]

grid[i][j]

Lo digo porque:

Código Delphi [-]
grid: array[0..5, 1..8] of TLineaOrdenProduccion;

gaps2k 12-07-2007 23:47:09

Recibe TDetalle y Array of TDetalle
 
Cita:

Empezado por dec
Hola,
Y ahora la duda la tengo yo... ¿Cómo es que acepta la función un simple "TDetalle" si lo que requiere es un Array? Yo estoy no lo había visto antes. Y además puede llamarse a la función tanto así:
...
Que sería lo que se entendería mejor... ¿Alguien puede decir algo a este respecto? Gracias. :)

Lo que entiendo (y que alguien me corrija si estoy mal), es que al pasar el array, lo que la función recibe es una referencia al Primer elemento, por eso sin importar si el arreglo se declaro [1..5], ó [2..6], siempre se va a tomar el primer elemento como: elemento [0]

gaps2k 12-07-2007 23:50:18

Grid en dos dimensiones
 
Cita:

Empezado por dec
Hola,

¿No deberías especificar "el grid" mediante dos índices? Es decir:


Código Delphi [-]

grid[i][j]

Lo digo porque:

Código Delphi [-]
grid: array[0..5, 1..8] of TLineaOrdenProduccion;

lo que pasa es que al ser un arreglo de dos dimensiones, se puede ver como que cada elemento "x", tiene asociado un arreglo que se ubica en "y", entonces al pasar grid[i], estoy pasando el Array of Tdetalle que requiere la función.

dec 12-07-2007 23:51:29

Hola,

Sí; creo que llevas razón. Pues chico, el error "Incompatible types" me deja KO, puesto que esperaba algo más de concreción. No sé. La verdad es que ahora mismo no sé qué decirte... a ver si algún compañero que nos esté leyendo... :)

gaps2k 13-07-2007 00:00:49

Idea
 
Gracias por el interés!!

Agradezco que si alguien entiende porque ocurre este error me lo explique, ya que si me es necesario poder realizar tareas como esta!!

Por el momento, graciaspor esta charla, se me ocurrio un cambio en la función, ya que en este caso especifico puedo resivir unicamente un elemento del tipo TDetalle, voy a ver si esto funciona!

ariefez 15-07-2007 21:15:51

Espero no sea tarde, pero si el problema es de parametros seria cuestion de redefinir el procedimiento, cambiando el tipo del parametro que causa el error.

Por ejemplo
Código Delphi [-]
type
  DettaleArray = array of TDetalle;

function trabajar_fila(fila, columna : integer; mueve : boolean; encabezado:TEncabezado;
  lineas: DettaleArray; sql:TQuery; grid_prod:TStringGrid) : boolean;

....

var
  grid: array of array of TLineaOrdenProduccion;
begin
  // Inicializo grid
  ...
  trabajar_fila(..., DettaleArray(grid[0]), ....); // Realizo un cast para q los tipos sean compatibles


Haciendo esto el error desaparece :D, ya nos contaras como lo solucionaste.

gaps2k 16-07-2007 16:48:18

Definir el Tipo
 
Muy buena idea, la voy a probar!!

Les comento que para el caso específico, lo que hice fue pasar solo un elemento en lugar del Array, con lo cual pude solucionar el problema, sin embargo tengo varias funciones que requieren el array (por ejemplo todas las lineas de una factura), las cuales me estaban preocupando, pero ahora tengo una foma más para tratar de solucionarlo!!

De nuevo muchas gracias!!


La franja horaria es GMT +2. Ahora son las 18:27:53.

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