Воспроизвел ошибку на тестовом проекте, вынес в класс:
Код:
TError = class
private
function Add(FromV, ToV: Integer): Integer;
function Check(Row: Integer; Val: Byte): Boolean;
function Operation(Index: Integer; Func: TFunc<Integer,Integer>): Integer;
public
function Run(Count: Integer): Integer;
end;
function TError.Add(FromV, ToV: Integer): Integer;
var
i: Integer;
res: Integer;
func: TFunc<Integer,Integer>;
begin
res := 0;
func :=
function(data: Integer): Integer
begin
if Check(i, MAXBYTE div 2) then
Result := data;
end;
for i := FromV to ToV do
res := Operation(i, func);
Result := res;
end;
function TError.Check(Row: Integer; Val: Byte): Boolean;
begin
Result := True;
end;
function TError.Operation(Index: Integer; Func: TFunc<Integer, Integer>): Integer;
begin
if Assigned(Func) then
Result := Func(Index);
end;
function TError.Run(Count: Integer): Integer;
begin
Result := Add(0, Count);
end;
В результате получаем, если:
- Count < 32767, то Run < 32767
- Count = 32767, то программа зависает (видимо цикл бесконечный получается)
- Count > 32767, то Run = 0 (цикл внутри не выполняется ни разу)
Если реализацию анонимного метода вынести в отдельный метод, тогда всё работает как надо. Если условие
Check сделать без параметров, тогда будет всё работать и с анонимным методом.
Либо я что-то делаю не так, либо это баг в Delphi XE, если это так, то стоит ли отправлять это на сайт Эмбаркадеро?