Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Implementar el constructor de una clase (https://www.clubdelphi.com/foros/showthread.php?t=32707)

Alcolea 14-06-2006 04:08:14

Implementar el constructor de una clase
 
Hola a todos, más bien se trata de inicializar en el constructor de una clase un atributo que es un arreglo

Por ejemplo:

Código Delphi [-]
Team = class
 private
   Jugadores : array[0..19]of Jugador;
   Index     : Byte;

 public   
   constructor CreaTeam(AIndex : Byte; Jugadores ¿¿¿); 

 implementation

      constructor Team.CreaTeam(AIndex : Byte; Jugadores ¿¿¿); 
      begin
        Index := AIndex;
        ¿¿¿
      end;

 end;

¿En esta clase que les presento como puedo plantear la inicialización del atributo “jugadores” que es un arreglo?:confused: :confused:

Estaré muy agradecido de la ayuda que puedan brindarme

dec 14-06-2006 05:28:27

Hola,

A ver si esto puede servirte de algo. Si tienes alguna duda ya sabes que aquí hay gente dispuesta a echarte una mano. ;)

Código Delphi [-]
unit UTeam;

interface

{ Clase TJugador, que me invento y a la que añado
  una propiedad para que sirva de ejemplo. Creo
  esta clase porque estás solicitando un Array
  de Jugadores... y tiene que haber jugadores...
}
type
  TJugador = class
  private
    FNombre: string;
  public
    property Nombre: string read FNombre write FNombre;
  end;

{ Tipo Array de jugadores
}
type
  TArrayJugadores = array[0..19] of TJugador;

{ Clase TTeam... ¿te fijaste que nombré las clases
  comenzando por "T" de "Type"? Es una convención
  muy utilizada en Delphi, así como comenzar los
  identificadores de variables privadas con "F"
  de "Field". ;-)
}
type
  TTeam = class
  private
    FIndex: Byte;
    FJugadores: TArrayJugadores;
  public
    constructor CreaTeam(AIndex: Byte; Jugadores: TArrayJugadores);
  public
    { Añado también la propiedad de sólo lectura Jugadores
      y lo hago únicamente para que en el ejemplo podamos
      apreciar cómo acceder a la misma, es decir, para
      comprobar cómo las asignaciones se llevan a cabo.
    }
    property Jugadores: TArrayJugadores read FJugadores;
  end;

implementation

{ Constructor de la clase "TTeam". Nota cómo
  llamamos al método "Create" heredado de la
  clase "TObject" por la clase "TTeam".
}
constructor TTeam.CreaTeam(AIndex : Byte; Jugadores: TArrayJugadores);
begin
  inherited Create;
  FIndex := AIndex;
  FJugadores := Jugadores;
end;

Código Delphi [-]
{ --------------------------------------------------------------------- }
{ Ejemplo de uso de la clase TTeam                                      }
{ (Se supone que la clase TTeam se encuentra en la unidad UTeam.pas     }
{ y que nosotros estamos trabajando en un formulario "Form1", como      }
{ puede verse a continuación                                            }
{ --------------------------------------------------------------------- }

uses
  UTeam;

procedure TForm1.Button1Click(Sender: TObject);
var
  team: TTeam;
  jugador1, jugador2: TJugador;
  arrayJugadores: TArrayJugadores;
begin

  jugador1 := TJugador.Create;
  jugador1.Nombre := 'José Luis';

  jugador2 := TJugador.Create;
  jugador2.Nombre := 'Juan Carlos';

  arrayJugadores[0] := jugador1;
  arrayJugadores[1] := jugador2;

  team := TTeam.CreaTeam(2, arrayJugadores);
  try

    ShowMessage(team.Jugadores[0].Nombre);
    ShowMessage(team.Jugadores[1].Nombre);

  finally
    team.Free;
    jugador1.Free;
    jugador2.Free;
  end;
end;

Alcolea 14-06-2006 06:39:05

Entiendo pero...
 
Solo me limité a colocar la parte del código que no comprendía, los jugadores en mi clase original los saco de un registro y no de una clase jugador como explicas. Pienso que no importa de donde surgió el arreglo, la implentación que me propones debe servirme para cualquier arreglo.

Otro asunto es que quiero crear la clase desde cero, o sea, con todos los atributos sin valores, como debe pasar al llamar al contructor por defecto create pero me da un error, "EAccessViolation".

En la práctica el problema es este (lógico, después de tu ayuda dec)

Código Delphi [-]
   
type
 Jugador = record
           Nombre : String;
           VB     : Integer;
           Jr     : Integer;
           Hits   : Integer;
           Avg    : Integer;
          end;

 Juego = array[0..19]of Jugador;

 Team = class
 private
   Jugadores : Juego;

 public
   Index     : Byte;
   constructor CreaTeam(AIndex : Byte; AJugadores : Juego);
   procedure Insert(Nombre : String; VB, Jr, Hits, Avg : Integer);
   {Aquí van otros métodos que no me causan problemas}
 end;

implementation

   constructor Team.CreaTeam(AIndex : Byte; AJugadores : Juego);
   begin
    inherited Create;
    Index     := AIndex;       
    Jugadores := AJugadores;
   end;


Al Aplicar el costructor en la Unit de un formulario

Código Delphi [-]
procedure TForm1.Button4Click(Sender: TObject);
begin
 MiTeam := Team.CreaTeam(0,Miembros);
 {Sucede que el error estaba en la manera de llamar al constructor de
 la clase, que deber ser como está aquí, y lo tenía así  
MiTeam.CreaTeam(0,Miembros) anteriormente}
end;

Gracias dec me ha servido de mucho tu ayuda como en otras ocaciones.


La franja horaria es GMT +2. Ahora son las 15:44:29.

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