Показать сообщение отдельно
  #3  
Старый 11.10.2011, 12:27
DARKShadow DARKShadow вне форума
Прохожий
 
Регистрация: 10.10.2011
Сообщения: 4
Репутация: 10
По умолчанию

Воспроизвел ошибку на тестовом проекте, вынес в класс:

Код:
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, если это так, то стоит ли отправлять это на сайт Эмбаркадеро?
Ответить с цитированием