2011-11-19 66 views
3

任何想法,为什么我得到了德尔福XE这样的警告:

[DCC警告] Form1.pas(250):W1036变量 '$框架' 可能尚未初始化

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的名字以外。

+2

它可能说明如下[Anonymous_Methods_in_Delphi](http://docwiki.embarcadero.com/RADStudio/en/Anonymous_Methods_in_Delphi ),在“变量绑定机制”部分。但是,当我试图掌握其含义时,我的头脑就会旋转。 –

回答

3

在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. 
+0

试过这个建议。我的XE不喜欢它:[DCC致命错误] program1.dpr(409):F2084内部错误:O780 –

+0

@GadDLord,我用我的测试更新了答案。编译我的XE更新1罚款。 –

+0

答案已被接受。内部错误与建议的解决方案无关。 –