0

我使用定义为的类型 Tlist 创建了一个表示二维字符串数组的类

type
  T2DimensionalStringlist =  Tlist<Tstringlist>;

  TwoDstringlistClass = class
  private
     TwoDimStringlist : T2DimensionalStringlist;

 etc.

但是,当我调用构造函数时出现访问冲突。构造函数所做的只是使用创建列表

 TwoDimStringlist:= T2DimensionalStringlist.Create;

我还没有制作很多课程,但是这个课程的完整代码在这篇文章的底部。

请有人能告诉我我做错了什么会导致类构造函数中的访问冲突吗?

我试过的

我看过这个 SO 线程,但它并没有真正回答我的问题。

我还尝试将整个事情变成一个简单的单元而不是一个类,并将列表类型和变量定义为全局变量,例如

type
  T2DimensionalStringlist =  Tlist<Tstringlist>;
var
   TwoDimStringlist: T2DimensionalStringlist ;

然后,如果我在初始化中创建列表

TwoDimStringlist:= T2DimensionalStringlist.Create;

并在最终确定中释放它

for i := 0 to TwoDimStringlist.Count - 1 do
       TwoDimStringlist[i].free;
TwoDimStringlist.free;

然后它工作正常,我可以将它用作具有各种其他过程和函数的二维字符串数组,例如类单元中的那些。

我也试过移动

type
  T2DimensionalStringlist =  Tlist<Tstringlist>;

到课堂内部而不是外部,但仍然出现错误。

这是该课程的完整代码

unit U_TwoDstringlist;

interface

uses
 classes,   //for Tstringlist
 Generics.Collections;  //for Tlist
type
  T2DimensionalStringlist =  Tlist<Tstringlist>;

  TwoDstringlistClass = class
  private
     TwoDimStringlist : T2DimensionalStringlist;
   public
       function AddStringlist : integer;                                 //returns index of newnly created stringlist
       function AddString(ListIndex : integer; S : string) : boolean;    //adds a string to the list at index ListIndex
       function GetStringlist(ListIndex : integer): Tstringlist;         //retuns the stringlist from index ListIndex
       function ListCount : integer ;                                    //returns number of used elements
       function StringlistCount(ListIndex : integer) : integer ;         //returns number of used elements in a particular stringlist
       function GetString(ListIndex,StringlistIndex : integer) : string; //returns string at 2D index ListIndex,StringlistIndex
   constructor Create; overload;
   destructor Destroy; override;
   end;  //class

implementation

constructor TwoDstringlistClass.Create;
begin
  TwoDimStringlist := T2DimensionalStringlist.Create;
end;

destructor TwoDstringlistClass.Destroy;
var
  i : integer;
begin
for i := 0 to TwoDimStringlist.Count - 1 do
  TwoDimStringlist[i].free;
TwoDimStringlist.free;
inherited;
end;

function TwoDstringlistClass.AddString(ListIndex: integer; S: string): boolean;
begin
    try
     TwoDimStringlist[ListIndex].add(s) ;
     result := true;
   except
      result := false;
   end;
end;

function TwoDstringlistClass.AddStringlist: integer;
begin
   TwoDimStringlist.add(Tstringlist.create);
   result :=  TwoDimStringlist.count -1;
end;

function TwoDstringlistClass.GetString(ListIndex, StringlistIndex: integer): string;
begin
try
  result := TwoDimStringlist[ListIndex][StringlistIndex];
except
  result := '';
end;
end;

function TwoDstringlistClass.GetStringlist(ListIndex: integer): Tstringlist;
begin
try
  result := TwoDimStringlist[ListIndex] ;
except
  result := nil;
end;
end;

function TwoDstringlistClass.ListCount: integer;
begin
 result := TwoDimStringlist.count;
end;

function TwoDstringlistClass.StringlistCount(ListIndex: integer): integer;
begin
try
   result :=  TwoDimStringlist[ListIndex].count
except
  result := -1
end;
end;


end.

主窗体像这样使用这个类

implementation
var
My2dList :  TwoDstringlistClass;

begin

procedure TForm1.btnCreateClick(Sender: TObject);
begin
 My2dList.create;
end;

etc.
4

0 回答 0