0

前の質問に加えて、これをコンパイルしようとすると、次の行に互換性のないタイプのエラーが表示されます。

    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.
4

1 に答える 1

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;
于 2012-05-26T13:16:20.747 に答える