E2008 Delphi中索引属性声明的不兼容类型

时间:2012-05-26 13:03:38

标签: delphi class

previous question之后,当我尝试编译时,我在这一行上得到错误不兼容的类型:

    Property player[i : integer] : TStringList read p;

我不确定为什么?这是全班:

unit Battle;

interface

uses
  SysUtils,Dialogs,Classes,inifiles, StdCtrls;
type

  TPlayers = class
  Private
    p : array[1..20] of TStringList;
    FPlaceUnit: Boolean;
    FTeamCount: Integer;
  Public
    Property player[i : integer] : TStringList read p;
    property PlaceUnit : Boolean read FPlaceUnit write FPlaceUnit;
    procedure AddPlayer (PlayerNo : integer; player : String);
    property TeamCount : Integer read FTeamCount write FTeamCount;

    constructor Create;   virtual;
  End;


{Host class}
  THostPlayers = Class(TPlayers)
  Private
    FIsHost: string;
  Public
    constructor Create; override;
    property IsHost : string read FIsHost write FIsHost;
 End;


{Guest Class}
  TGuestPlayers = Class(TPlayers)
  Private
    FIsGuest: string;
  Public
    constructor Create; override;
    property IsGuest : string read FIsGuest write FIsGuest;
  End;

implementation

uses
main;
{constructor}
constructor TPlayers.Create;
begin
  p := TStringList.Create;
end;
constructor THostPlayers.Create;
begin
  inherited;  // Calls TPlayers.Create
  IsHost := 'No';
  PlaceUnit := true;
  TeamCount :=0;
end;
constructor TGuestPlayers.Create;
begin
  inherited;  // Calls TPlayers.Create
  IsGuest := 'No';
  PlaceUnit := true;
  TeamCount := 0;
end;

{ADD Player}
procedure TPlayers.AddPlayer(PlayerNo : integer; player : String);
  var
      CharINI : TIniFile;
  begin
      CharINI := Tinifile.Create(thisdir+'\char\charstats.ini');
      CharINI.ReadSectionValues(player,player[PlayerNo]);
      CharINI.Free;
  end;
end.

1 个答案:

答案 0 :(得分:2)

首先,属性'返回'一个TStringList,而字段p是一个TStringlist数组,这就是你得到不兼容类型错误的原因。

你会期望:

// This is not working
Property player[i : integer] : TStringList read p[i];  // Not supported...

解决了这个问题。但是你不能直接访问数组元素,所以你需要一个getter函数:

TPlayers = class
private
  function GetPlayer(i: integer): TStringList;

public
  Property player[i : integer] : TStringList read GetPlayer 
end;



function TPlayers.GetPlayer(i: integer): TStringList;
begin
  Result := p[i];
end;