Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cómo hacer que se creen nuevos objetos cada vez? (https://www.clubdelphi.com/foros/showthread.php?t=51826)

gerupc 30-12-2007 23:57:07

Cómo hacer que se creen nuevos objetos cada vez?
 
Hola!!

estoy haciendo unas prácticas para la universidad, y tengo una duda, os cuento.

Tengo dos clases implementadas, una clase garaje, y otra clase coche. La clase garaje es un depósito,lista o clase contenedora, como querais llamarlo XD. Entonces, he implementado determinados métodos que me permiten la entrada de un coche en el garaje, su salida, etc, creo que estan bien:

Código Delphi [-]
procedure Garaje.EntradaGaraje(CocheObjeto: Coche);
var
  i: integer;
  vacia,lleno: boolean;
begin
  vacia := false;
  lleno := true;
  i := 1;
    while (Not(vacia)and(i<=100)) do
     Begin
       if plazasarray[i] = nil then
        Begin
             plazasarray[i] := CocheObjeto;
             NumCoches := GetNumCoches();
             vacia := true //Salimos del Bucle
        end
       else
         Begin
             i := i + 1;
         end;
     end; //Fin While
     //Compruebo si esta lleno
    while (lleno)and(i<=100) do
     Begin
        if plazasarray[i] <> nil then
         Begin
           lleno := true;
           i := i + 1;
         end
        else
           lleno := false;
     end;
    if Lleno then
     writeln('El Parking Esta lleno');
end;

procedure Garaje.SalidaGaraje(matricula: string);
var
  i,hora,minutos: integer;
  tiempo_total,importe: real;
  encontrado: boolean;
begin
  //Busco el coche por la matricula
  encontrado := false;
  i := 1;
      while  (Not(encontrado)and(i<=100)) do
       Begin
         if plazasarray[i].getMatricula() = matricula then
          Begin
               write('Introduce la hora actual, Hora: ');
               readln(hora);
               write('Minutos: ');
               readln(minutos);

               if minutos>plazasarray[i].getMinutos() then
                minutos := minutos-plazasarray[i].getMinutos()
               else
                Begin
                  minutos := plazasarray[i].getMinutos()-minutos;
                end;

               tiempo_total := ((hora-plazasarray[i].getHora())*60) + minutos;
               importe := tiempo_total * 0.05;
               writeln('IMPORTE: ',importe:0:2);
               plazasarray[i] := nil;
               plazasarray[i].Free;
               NumCoches := GetNumCoches();
               encontrado := true;
          end
         else //Si no encuentra la matricula en una plaza
          Begin
            i := i + 1;
            encontrado := false; //Y sigue buscando hasta que sea true
          end;
       end;
      if Not(encontrado) then
       writeln('El coche de matricula ',matricula,' no existe');
end;

procedure Garaje.VisualizarGaraje();
var
  i: integer;
begin
    for i := 1 to length(plazasarray) do
     Begin
       if plazasarray[i] <> nil then
        write(' ',plazasarray[i].getMatricula(),' ')
       else
          write('  V  ');
       if i mod 10 = 0 then
        writeln('');
     end;
end;

Ahora, lo que quiero, es desde un menú principal, en el cual llamo a un procedimiento (EntradaVehiculo), quiero que cada vez que seleccione la opcion de Entrada Vehiculo, se cree un objeto distinto y se coloque en la primera posicion libre del array Plazas, el cual contiene dichos objetos coche.

Lo he intentado creando una funcion que me determine cual es la primera plaza que esta libre, y con esta, hacer lo siguiente:
Código Delphi [-]
parking := Garaje.Create();
      pos := parking.GetPlazaLibre();
      plaza[pos] := Coche.Create();
      plaza[pos].Introducir_Datos();
      parking.EntradaGaraje(plaza[pos]);
      parking.VisualizarGaraje();

Pero el problema es que me sustituye los objetos constantemente, es decir, yo creo uno y se lo asigno a la primera plaza libre del garaje, pero al crear el siguiente (al darle de nuevo en el menu principal a la opcion de Entrada Vehiculo), el nuevo objeto que creo me sustituye al anterior....

Si alguien me echase una mano se lo agradecería ya que llevo un buen rato dandole al coco...y nada.

EDITO: Cómo puedo hacer para no tener que crear cada vez que llame a este procedimiento (Entrada Vehiculo) el objeto parking, de la clase garaje? Creo que éste puede ser el problema...

Muchas gracias de antemano!!

Un saludo,

Geru.

dec 31-12-2007 00:40:19

Hola,

Respecto de si el problema puede estar en el objeto "parking" no sé decirte, porque no veo por lado alguno la clase del mismo, ni su implementación, ni tampoco el "parking" mismo. Lo que se me ocurre a bote pronto es que podrías usar "TObjectList" en lugar del Array para mantener la lista de "coches". Esta clase cuenta con métodos que te echarán una mano, puede ser la más indicada para guardar listas de objetos, si no estoy equivocado.

gerupc 31-12-2007 00:55:44

Hola Dec!!

Muchas gracias por tu ayuda. Me parece, si no te importa, que será mejor que ponga las clases que he implementado, y el programa principal. Respecto a lo que me comentas, seguro que funciona, y seguro que es mejor solución que la que pueda dar, pero en este caso, me exigen que cree yo todas las clases, funciones...:o

Mira, aqui, el programa principal:

Código Delphi [-]
program Parking;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  ClaseCoche,ClaseGaraje;

procedure Limpiar(lineas: integer);
var
  i: integer;
 Begin
   for i := 1 to lineas do
     writeln('');
 end;

procedure EntradaVehiculo();   //ENTRADA VEHICULO
type
        Tplaza = array[1..100] of Coche;
var
  plaza: Tplaza;
  parking: Garaje;
  i,pos: integer;
  libre: boolean;
 Begin
      //libre := false;
      //i := 1;

      pos := parking.GetPlazaLibre();
      plaza[pos] := Coche.Create();
      plaza[pos].Introducir_Datos();
      parking.EntradaGaraje(plaza[pos]);
      parking.VisualizarGaraje();
 end;
procedure Menu();
var
  opcion: integer;
  parking: Garaje;
 Begin
 repeat
        parking := Garaje.Create();
    Limpiar(5);
    writeln(#9,'1.Entrada de Vehiculo.');
    writeln(#9,'2.Salida de Vehiculo.');
    writeln(#9,'3.Visualizar estado de Garaje.');
    writeln(#9,'4.Estadistica de marca.');
    writeln(#9,'5.Estadistica general.');
    writeln(#9,'6.Salir.');
    Limpiar(1);
    write(#9,'Introduce la opcion: ');
    readln(opcion);

    case opcion of
    1: EntradaVehiculo();


    end;
until opcion>1000;
 end;
begin
    Menu;
end.

Aqui, la clase coche:

Código Delphi [-]
unit ClaseCoche;

interface
type
  Tmarca = (Volvo, Renault, Nissan);
  /////////////////////////////////////////
  ////////////////////////////////////////
  //Clase Coche
  
  Coche = class
    private
       marca: Tmarca;
       matricula: string;
       horaEntrada,minutoEntrada: integer;
    public
       constructor Create;
       Overload; //Porque en otras clases tambien utilizare
                 //el Constructor Create,es decir, una sobrecaraga
       constructor Create(matri: string;marca_coche: Tmarca;horentrada,minentrada: integer);
       Overload;
       function getMatricula():string;
       function getMarca(): Tmarca;
       function getHora(): integer;                                  
       function getMinutos(): integer;
       function getTextoHora(): string; //Para formato Hora:Minutos FORMATEAR

       procedure setMatricula(matri: string);
       procedure setMarca(marca_coche: Tmarca);
       procedure setHora(horaentr: integer);
       procedure setMinuto(minentrada: integer);

       procedure Introducir_Datos();
  end;

Implementation

constructor Coche.Create();
 Begin

 end;

constructor Coche.Create(matri: string; marca_coche: Tmarca; horentrada: Integer; minentrada: Integer);
begin
  matricula := matri;
  marca := marca_coche;
  horaEntrada := horentrada;
  minutoEntrada := minentrada;
end;

procedure Coche.setMatricula(matri: string);
begin
  matricula := matri;
end;

procedure Coche.setMarca(marca_coche: Tmarca);
begin
  marca := marca_coche;
end;

procedure Coche.setHora(horaentr: Integer);
begin
  HoraEntrada := Horaentr;
end;

procedure Coche.setMinuto(minentrada: Integer);
begin
  minutoentrada := minentrada;
end;

function Coche.getMatricula(): string;
 Begin
   result := Matricula;
 end;

function Coche.getMarca(): Tmarca;
begin
      result := Marca;
end;

function Coche.getHora(): integer;
begin
     result := horaentrada;
end;

function Coche.getMinutos(): integer;
begin
  result := minutoentrada;
end;

function Coche.getTextoHora(): string;
var
  hora,minuto,horatexto: string;
begin
    Str(horaentrada,hora);
    Str(minutoentrada,minuto);
    horatexto := hora+':'+minuto;
    result := horatexto;
end;

procedure Coche.Introducir_Datos();
var
  matricula: string;
  hora,minuto,seleccion: integer;
  marca: Tmarca;
begin
    write('Introduce la matricula del coche: ');
    readln(matricula);
    setMatricula(matricula);
repeat
    write('Introduce la marca del coche (0=Volvo//1=Renault//2=Nissan: ');
    readln(seleccion);

      case seleccion of
        0: marca := Volvo;
        1: marca := Renault;
        2: marca := Nissan
        else
          writeln('Error!! Debe introducir una de estas marcas.');
      end;
    until (marca = volvo)or(marca=Renault)or(marca=Nissan);
    setMarca(marca);
 repeat
    write('Hora Entrada: ');
    readln(hora);
    write('Minuto Entrada: ');
    readln(minuto);

    if ((hora<=0)or(hora>24))and((minuto>60)or(minuto<=0)) then
     writeln('Error! Por favor, Introduce una hora correcta.');

 until ((hora>=0)and(hora<=24))and((minuto<=60)and(minuto>=0));
    setHora(horaentrada);
    setMinuto(minuto);
end;
//Fin de Implementacion de los metodos correspondientes a la clase Coche
end.

Y por último ;), la clase garaje (parking era el objeto de la clase garaje que yo he creado):

Código Delphi [-]
unit ClaseGaraje;

interface

Uses ClaseCoche;

type
  TarrayMarcas = array[Tmarca] of integer; //Porque estan enumeradas [1] = Volvo...
  TarrayGaraje = array[1..100] of Coche; //Posibilidad de crear 100 objetos de clase 'COCHE'
  //Array Coche tendra funcion de lista de objetos,en cada pos, un objeto de clase coche

  //Defino la clase garaje

  Garaje = class
    private
      plazasarray: TarrayGaraje; //El array con los objetos coche
      NumCoches: integer; // Numero de objetos del array coches

    public
      constructor Create;
      Overload;
      function GetNumCoches(): integer;
      function GetPosicionCoche(matricula: string): integer; //Devuelve la Pos del Coche o -1 si no esta
      Overload;
      function GetPlazaLibre(): integer;
      function GetCoche(Posicion: integer): Coche; //Clase como Tipo de Dato, si no hay coche, devuelve Nil
      Overload;
      procedure EntradaGaraje(CocheObjeto: Coche);
      procedure SalidaGaraje(matricula: string);
      procedure VisualizarGaraje();
      procedure EstadisticaMarcas();
      function ContarMarca(marc: Tmarca): integer; //Devuelve el numer de coches que hay por cada Marca
  end;

Implementation

Constructor Garaje.Create();
begin
   NumCoches := 0;
end;

function Garaje.GetNumCoches(): integer;
var
  i: integer;
begin
     NumCoches := 0;
     for i := 1 to length(plazasarray) do
       Begin
         if plazasarray[i] <> nil then
           Begin
             NumCoches := NumCoches + 1;
           end;
       end;
     result := NumCoches;
end;

function Garaje.GetPlazaLibre(): integer;
var
        i,pos: integer;
        libre: boolean;
 Begin
        libre := false;
        i := 1;

        while Not(libre)and(i<=100) do
         Begin
                if plazasarray[i] = nil then
                 Begin
                        pos := i;
                        libre := true;
                 end
                else
                        i := i + 1;
         end;

        result := pos;
 end;
function Garaje.GetPosicionCoche(matricula: string): integer;
var
  i,posicion: integer;
  encontrado: boolean;
begin
      encontrado := false;
      i := 1;

      while (Not(Encontrado))and(i<=100) do
       Begin
         if plazasarray[i].getMatricula() = Matricula then
          Begin
            result := i;
            encontrado := true; //Salimos del Bucle While
          end
          else
           Begin
            result := -1;
            i := i + 1;
           end;
       end;

end;

function Garaje.GetCoche(Posicion: Integer): Coche;
begin
     if plazasarray[posicion] = nil then
        result := nil   //Esta vacia
     else
        result := plazasarray[posicion];
end;

procedure Garaje.EntradaGaraje(CocheObjeto: Coche);
var
  i: integer;
  vacia,lleno: boolean;
begin
  vacia := false;
  lleno := true;
  i := 1;
    while (Not(vacia)and(i<=100)) do
     Begin
       if plazasarray[i] = nil then
        Begin
             plazasarray[i] := CocheObjeto;
             NumCoches := GetNumCoches();
             vacia := true //Salimos del Bucle
        end
       else
         Begin
             i := i + 1;
         end;
     end; //Fin While
     //Compruebo si esta lleno
    while (lleno)and(i<=100) do
     Begin
        if plazasarray[i] <> nil then
         Begin
           lleno := true;
           i := i + 1;
         end
        else
           lleno := false;
     end;
    if Lleno then
     writeln('El Parking Esta lleno');
end;

procedure Garaje.SalidaGaraje(matricula: string);
var
  i,hora,minutos: integer;
  tiempo_total,importe: real;
  encontrado: boolean;
begin
  //Busco el coche por la matricula
  encontrado := false;
  i := 1;
      while  (Not(encontrado)and(i<=100)) do
       Begin
         if plazasarray[i].getMatricula() = matricula then
          Begin
               write('Introduce la hora actual, Hora: ');
               readln(hora);
               write('Minutos: ');
               readln(minutos);

               if minutos>plazasarray[i].getMinutos() then
                minutos := minutos-plazasarray[i].getMinutos()
               else
                Begin
                  minutos := plazasarray[i].getMinutos()-minutos;
                end;

               tiempo_total := ((hora-plazasarray[i].getHora())*60) + minutos;
               importe := tiempo_total * 0.05;
               writeln('IMPORTE: ',importe:0:2);
               plazasarray[i] := nil;
               plazasarray[i].Free;
               NumCoches := GetNumCoches();
               encontrado := true;
          end
         else //Si no encuentra la matricula en una plaza
          Begin
            i := i + 1;
            encontrado := false; //Y sigue buscando hasta que sea true
          end;
       end;
      if Not(encontrado) then
       writeln('El coche de matricula ',matricula,' no existe');
end;

procedure Garaje.VisualizarGaraje();
var
  i: integer;
begin
    for i := 1 to length(plazasarray) do
     Begin
       if plazasarray[i] <> nil then
        write(' ',plazasarray[i].getMatricula(),' ')
       else
          write('  V  ');
       if i mod 10 = 0 then
        writeln('');
     end;
end;

procedure Garaje.EstadisticaMarcas();
var
  i,contvolvo,contrenault,contnissan,contnil: integer;
  arraymarcas: Tarraymarcas;
begin
  contvolvo := 0;
  contrenault := 0;
  contnissan :=0;
  contnil := contnil + 1;
    for i := 1 to 100 do
     Begin
      if plazasarray[i] = nil then
        contnil := contnil + 1     //Cuenta las plazas vacias, ya de paso, porque si no
      else                         //al ser nil,produce una excepcion al no poder acceder a las
                                   //funcion y datos miembro
       Begin
          if plazasarray[i].getMarca() = Volvo then
             contvolvo := contvolvo + 1
             else if plazasarray[i].getMarca() = Renault then
                contrenault := contrenault + 1
                   else if plazasarray[i].getMarca() = Nissan then
                      contnissan := contnissan + 1;
       end;
     end;
    writeln('');
    writeln('');
    writeln('------- ESTADISTICA DE MARCAS -------');
    writeln('');
    writeln('');
    write('Volvo:    |');
    for i := 1 to contvolvo do
     Begin
      write('*');
     end;
    writeln('');
    write('Renault:  |');
    for i := 1 to contrenault do
     Begin
      write('*');
     end;
    writeln('');
    write('Nissan:   |');
    for i := 1 to contnissan do
     Begin
      write('*');
     end;
    readln;
end;

function Garaje.ContarMarca(marc: Tmarca): integer;
var
  i,contvolvo,contrenault,contnissan,contnil: integer;
  arraymarcas: Tarraymarcas;
  es_nil: boolean;
begin
  contvolvo := 0;
  contrenault := 0;
  contnissan :=0;
  contnil := contnil + 1;
    for i := 1 to 100 do
     Begin
      if plazasarray[i] = nil then
        contnil := contnil + 1
      else
       Begin
          if plazasarray[i].getMarca() = Volvo then
             contvolvo := contvolvo + 1
             else if plazasarray[i].getMarca() = Renault then
                contrenault := contrenault + 1
                   else if plazasarray[i].getMarca() = Nissan then
                      contnissan := contnissan + 1;
       end;
     end;

  //HACEMOS QUE DEVUELVA EL NUMERO DE COCHES DE LA MARCA QUE SE HA PASADO COMO PARAM.

    if marc = volvo then
      result := contvolvo
      else if marc = renault then
           result := contrenault
           else if marc = nissan then
                result := contnissan;

end;
//FIN IMPLEMENTACION CLASE GARAJE.
end.


La franja horaria es GMT +2. Ahora son las 09:35:05.

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