{DCC Warning} W1036 Возможно, переменная $ frame не инициализирована? - PullRequest
3 голосов
/ 20 ноября 2011

Любые идеи, почему я получаю это предупреждение в Delphi XE:

[Предупреждение DCC] Form1.pas (250): W1036 Переменная '$ frame', возможно, не была инициализирована

procedure TForm1.Action1Execute(Sender: TObject);
var
  Thread: TThread;
begin
  ...
 Thread := TThread.CreateAnonymousThread(
   procedure{Anonymos}()

     procedure ShowLoading(const Show: Boolean);
     begin  /// <-------------            WARNING IS GIVEN FOR THIS LINE (line number 250)
       Thread.Synchronize(Thread,
          procedure{Anonymous}()
          begin
            ...
            Button1.Enabled := not Show;
            ...
          end
        );
     end;

  var
    i: Integer;
  begin
    ShowLoading(true);
    try
      Thread.Synchronize(Thread,
        procedure{Anonymous}()
        begin
          ... // some UI updates
        end
      Thread.Synchronize(Thread,
        procedure{Anonymous}()
        begin
          ... // some UI updates
        end
      );
    finally
      ShowLoading(false);
    end;
  end
  ).NameThread('Some Thread Name');
  Thread.Start;
end;

В моем коде нет ни фрейма имен переменных, ни $ frame.Я даже не уверен, как $ frame со знаком $ может быть действительным идентификатором.

Пахнет для меня как волшебство компилятора.

PS: Конечно, в реальной жизни xosw отличается от Form1,Имена Button1, Action1.

1 Ответ

3 голосов
/ 20 ноября 2011

В XE2 этого предупреждения компилятора нет.В любом случае, чтобы сделать ваш метод более понятным для компилятора, попробуйте следующее:

procedure TForm1.Action1Execute(Sender : TObject);
var
  Thread: TThread;
begin
  Thread := TThread.CreateAnonymousThread(
    procedure{Anonymos}()


  Type
    TProcRef = reference to procedure (const Show: Boolean);
  var
    i: Integer;
    ShowLoading : TProcRef;
  begin
    ShowLoading:=
      procedure (const Show: Boolean)
      begin
        Thread.Synchronize(Thread,
          procedure{Anonymous}()
          begin
            // Button1.Enabled := not Show;
          end
        );
     end;

     ShowLoading(true);
    ... // and so on.

Обновление : я только что проверил в XE, это действительно исправляет предупреждение компилятора.

Ссылка, которую я дал в комментарии к вопросу, объясняет объекты предупреждения и фрейма.Поэтому я предполагаю, что компилятор XE запутывается в объекте frame, который создает ShowLoading.И создание явной ссылки исправило предупреждение.

Обновление 2 :

Просто показывает мой тест для справки:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Windows,Classes, SysUtils;

procedure Action1Execute;
var
  Thread: TThread;
begin
 Thread := TThread.CreateAnonymousThread(
   procedure{Anonymos}()


  Type
    TProcRef = reference to procedure (const Show: Boolean);
  var
    i: Integer;
    ShowLoading : TProcRef;
  begin
    ShowLoading:=
     procedure (const Show: Boolean)
     begin
       Thread.Synchronize(Thread,
          procedure{Anonymous}()
          begin
            // Button1.Enabled := not Show;
          end
        );
     end;

    ShowLoading(true);
    try
      Thread.Synchronize( Thread,
        procedure{Anonymous}()
        begin
          // some UI updates
        end
      );
      Thread.Synchronize( Thread,
        procedure{Anonymous}()
        begin
          // some UI updates
        end
      );
    finally
      ShowLoading(false);
    end;
  end
  ); //.NameThreadForDebugging('Some Thread Name');

  Thread.Start;
end;

begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
    Action1Execute;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
...