Delphi Pascal XE4编译器错误?

sav*_*sav 4 delphi generics delphi-xe4

我想知道我是否找到了Embarcadero编译器错误...

问题看起来与泛型有关.

这是我的源代码

unit u_DateCount;

interface

uses
  SysUtils,
  u_JavaScriptable
  ;

type
  TDateCount = class (TJavaScriptable)
    strict private
    public
      NoOfSamples : Integer;
      TheDate : TDate;
      function ToString():String; override;
  end;

implementation

function TDateCount.ToString():String;
var
    myYear, myMonth, myDay : Word;
begin
    DecodeDate(TheDate, myYear, myMonth, myDay);
    Result := Format('[new Date(%d, %d ,0), %d]', [myYear, myMonth, NoOfSamples]);
end;

end.
Run Code Online (Sandbox Code Playgroud)
unit u_Javascriptable;

interface

type
  TJavaScriptable = class
    strict private
    public
      function ToString:String; override;
  end;

implementation

function TJavaScriptable.ToString:String;
begin
    Result := '';
end;

end.
Run Code Online (Sandbox Code Playgroud)
unit u_LineChart;

interface

uses
  System.IOUtils,
  SysUtils,
  System.Generics.Collections,
  u_JavaScriptable
  ;

type
  TLineChart<RecordType : TJavaScriptable> = class
    strict private
      Template : String;
      function ConvertRecordsToString():String;
    public
      Records : TList<RecordType>;
      function ToString():String;
      constructor Create(templatePath : String);
      destructor Destroy(); override;
  end;

implementation

function TLineChart<RecordType>.ConvertRecordsToString():String;
var
    I: Integer;
begin
    //Open brackets
    Result := '[ ';

    //The first record
    if Records.Count > 0 then
    begin
        Result := Result + Records[0].ToString();
    end;

    //Loop over records
    for I := 1 to Records.Count - 1 do
    begin
        Result := Result + ', ' + Records[I].ToString();
    end;

    //Close bracket
    Result := Result + ' ]';
end;

function TLineChart<RecordType>.ToString():String;
begin
    Result := Format(Template, [ConvertRecordsToString()]);
end;

constructor TLineChart<RecordType>.Create(templatePath : String);
begin
    inherited Create();
    Template := TFile.ReadAllText(templatePath);
    Records := TList<RecordType>.Create();
end;

destructor TLineChart<RecordType>.Destroy();
var
    I: Integer;
begin
    if Assigned(Records) then
    begin
        for I := 0 to Records.Count - 1 do
        begin
            Records[I].Destroy();
        end;
        Records.Clear();
        Records.Destroy();
        Records := nil;
    end;

    inherited;
end;

end.
Run Code Online (Sandbox Code Playgroud)

最后是主程序

program Project4;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  u_Javascriptable in 'u_Javascriptable.pas',
  u_LineChart in 'u_LineChart.pas',
  u_DateCount in 'u_DateCount.pas';

var
   lineChart : TLineChart<TDateCount>;

begin

  lineChart := TLineChart<TDateCount>.Create('linechart.html');
  try


  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Run Code Online (Sandbox Code Playgroud)

我尝试编译时得到的错误消息是

[dcc32致命错误] Project4.dpr(30):F2084内部错误:AV097530AC-R00000014-0

通常当我看到类似于此的错误消息时,我可以通过关闭embarcadero IDE并重新启动它来修复它.然而,这次似乎没有用.

Ste*_*nke 10

问题在于实施TLineChart<RecordType>.Destroy().

更改Records[I].Destroy();Records[I].Free();和它的作品.或者你只是正确地使用TObjectList<RecordType>.Create;并在构造函数中使用,它在销毁列表时负责销毁其中的所有元素.

切勿Destroy直接打电话.使用Free.虽然它不应该导致编译器错误,但无论如何它都是错误的.