【问题标题】:{DCC Warning} W1036 Variable '$frame' might not have been initialized?{DCC 警告} W1036 变量“$frame”可能尚未初始化?
【发布时间】:2012-01-02 03:11:06
【问题描述】:

我在 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 以外的名称。

【问题讨论】:

  • 这可能在Anonymous_Methods_in_Delphi 的“变量绑定机制”部分中进行了解释。但是当我试图理解其中的含义时,我头晕目眩。

标签: multithreading delphi warnings delphi-xe anonymous


【解决方案1】:

在 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 编译器对 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.

【讨论】:

  • 尝试了这个建议。我的 XE 不喜欢它:[DCC 致命错误] program1.dpr(409): F2084 Internal Error: O780
  • @GadDLord,我用我的测试更新了答案。使用我的 XE Update 1 编译良好。
  • 已接受答案。内部错误与建议的解决方案无关。
猜你喜欢
  • 1970-01-01
  • 2016-07-07
  • 2015-03-22
  • 1970-01-01
  • 2012-03-25
  • 2015-07-04
相关资源
最近更新 更多