2012-12-19 81 views
1

有一个代码SerAndDeser.pas(298):W1036变量 'TForm的' 可能尚未初始化

for j := 0 to mForm.ComponentCount - 1 do 
    if mForm.Components[j] is TableFormInfo then 
     //try 
     //table := nil; 
     //tempFmtable := nil; 
     //tForm := nil; 

     tForm := mForm.Components[j] as TableFormInfo; 

     table := TTableSpec(DBSchema.Tables.FindComponent(tForm.Table)); 
     tempFmtable := TfmTableData.Create(MainWindow); 
     tempFmtable.Name := tForm.Name; 
     tempFmtable.tname := tForm.Table; 
     //tempFmtable.Caption := Utf8ToAnsi(table.Description); 
     tempFmtable.Left := tForm.LeftValue; 
     tempFmtable.Top := tForm.TopValue; 
     tempFmtable.Height := tForm.HeightValue; 
     tempFmtable.Width := tForm.WidthValue; 

     tempFmTable.IBQuery1.SQL.Clear; 
     tempFmtable.IBQuery1.SQL.Add('select * from ' + table.Name); 
     tempFmtable.IBQuery1.Open; 
     tempFmtable.DragKind:=dkDock; 
     tempFmtable.DragMode:=dmAutomatic; 

     i := 0; 
     querystr:='select '; 
     while i <= tForm.ComponentCount - 1 do 
      begin 
      if tForm.Components[i] is TableFieldInfo then 
      begin 
      //querystr:='select '; 
      //field := nil; 
      //tempFmtable.Show; 
      field := tForm.Components[i] as TableFieldInfo; 
      tempFmtable.Caption:=tForm.Caption; 
      tempFmtable.DBGrid1.Columns[i].FieldName := field.FieldNameValue; 
      tempFmtable.DBGrid1.Columns[i].Title.Caption := field.DescriptionValue; 
      tempFmtable.DBGrid1.Columns[i].Index := field.IndexValue; 
      tempFmtable.DBGrid1.Columns[i].Visible := field.VisibleValue; 
      tempFmtable.DBGrid1.Columns[i].Width:=field.WidthValue; 
      //tempFmtable.CheckListBox1.Items.Add(field.Description); 
      //tempFmtable.CheckListBox1.Checked[i] := field.Visible; 
      //tempFmtable.Show; 
      if field.VisibleValue then querystr:=querystr+ConvertNameField(field.FieldNameValue)+', '; 
      end; 
      //inc(i); 
      if tForm.Components[i] is SettingsFormInfo then 
      begin 
       //sForm:=nil; 
       sForm:=tForm.Components[i] as SettingsFormInfo; 
       tempsettings := TfmSettings.Create(tempFmtable); 
       tempsettings.Caption:=sForm.Caption; 
       //tempsettings := TfmSettings.Create(tempFmtable); 
       tempsettings.Name := sForm.Name; 
       tempsettings.Left := sForm.LeftValue; 
       tempsettings.Top := sForm.TopValue; 
       tempsettings.Height := sForm.HeightValue; 
       tempsettings.Width := sForm.WidthValue; 
       tempSettings.CheckListBox1.Clear; 
       //for k:=0 to sForm.ComponentCount-1 do 
       k:=0; 
       while k<=sForm.ComponentCount-1 do 
       begin 
        if sForm.Components[k] is ItemCheckListBoxInfo then 
        begin 
         //item:=nil; 
         item:=sForm.Components[k] as ItemCheckListBoxInfo; 
         tempsettings.CheckListBox1.Items.Add(item.TextValue); 
         tempsettings.CheckListBox1.Checked[item.IndexValue]:=item.CheckedValue 
        end; 
        if sForm.Components[k] is LabelInfo then 
        begin 
         //labelobj:=nil; 
         labelobj:=sForm.Components[k] as LabelInfo; 
         tempsettings.Label1.Caption:=labelobj.CaptionValue; 
        end; 
        if sForm.Components[k] is EditInfo then 
        begin 
         //edit:=nil; 
         edit:=sForm.Components[k] as EditInfo; 
         TEdit(tempsettings.FindComponent(edit.Name)).Text:=edit.TextValue; 
        end; 
        inc(k); 
       end; 
      if ((tForm.Components[i] is SettingsFormInfo) and (i=tForm.ComponentCount-1) and (k=sForm.ComponentCount)) then tempsettings.Show; 
      end; 
      //inc(i); 
      //if ((tForm.Components[i] is SettingsFormInfo) and (i=tForm.ComponentCount-1) and (k=sForm.ComponentCount)) then tempsettings.Show; 
      inc(i); 
      end; 

     {for i := 0 to table.Fields.ComponentCount - 1 do 
     begin 
      descr := Utf8ToAnsi(((table.Fields.Components[i]) as TFieldSpec).Description); 
      tempFmtable.CheckListBox1.Items.Add(descr); 
      tempFmtable.DBGrid1.Columns[i].Title.Caption := descr; 
      tempFmtable.CheckListBox1.Checked[i] := true; 
     end; } 

     Delete(querystr, Length(querystr)-1, 1); 
     querystr:=querystr+'from '+table.Name; 
     tempFmTable.IBQuery1.SQL.Clear; 
     tempFmtable.IBQuery1.SQL.Add(querystr); 
     tempFmtable.IBQuery1.Open; 
     for s := 0 to tForm.ComponentCount-1 do 
      begin 
      if tForm.Components[s] is TableFieldInfo then 
       begin 
       //field := nil; 
       //tempFmtable.Show; 
       field := tForm.Components[s] as TableFieldInfo; 
       if field.VisibleValue then 
        begin 
        for t := 0 to tempFmtable.DBGrid1.Columns.Count-1 do 
         begin 
         if ((tempFmTable.DBGrid1.Columns[t].Title.Caption=field.DescriptionValue) and (tempFmtable.DBGrid1.Columns[t].FieldName=field.FieldNameValue)) then 
          tempFmTable.DBGrid1.Columns[t].Width:=field.WidthValue; 
         end; 
        end; 
       end; 
      end; 
     tempFmtable.Show; 

进入状态通过反序列化的手段。我想,以纪念行前TForm的变量使用

table := TTableSpec(DBSchema.Tables.FindComponent(tForm.Table)); 

它在上一行

tForm := mForm.Components[j] as TableFormInfo; 

但尽管这样的警告初始化组装

[dcc32 Warning] SerAndDeser.pas(298): W1036 Variable 'tForm' might not have been initialized 

为什么过程中发生?如何摆脱警告,而不会丢失应用程序的功能?

回答

6

您的缩进都是错误的。我认为这是令你困惑的事情。如果你正确地缩进代码,它看起来像这样:

for j := 0 to mForm.ComponentCount - 1 do 
    if mForm.Components[j] is TableFormInfo then 
    // try 
    // table := nil; 
    // tempFmtable := nil; 
    // tForm := nil; 

    tForm := mForm.Components[j] as TableFormInfo; 

table := TTableSpec(DBSchema.Tables.FindComponent(tForm.table)); 

我想很明显,现在已被指派下面的for循环可以执行的代码,而无需tForm看到的。

从问题中的缩进中可以清楚地看到,您希望代码后面的一长串代码位于if语句中。但编译器服从代码而不是缩进。

您将需要添加一些begin/end对您的代码。我个人从不使用单语句语法 - 我所有的块都是用begin/end对包裹的复合块。在我看来,单一语句的语法是Pascal的重大错误之一。而且确实如此。我使用内置的代码格式化程序来整理缩进。这可能是一个有用的工具,可以帮助你修复代码。它可以让你掌握如何正确地布置缩进。

最后,至少我以前曾经对你说过一次,不要用tForm作为变量名。这隐藏了名为TForm的类型。 T前缀是为类型保留的。你应该调用你的表单变量Form,或者LFormL表明它是一个局部变量。

+0

IOW如果mForm.ComponentCount为零,则表格赋值中不会分配tForm。 – jachguate

+1

@jachguate或者如果'if'语句不符合。但问题比这更严重。编码员显然希望不止一个声明在“if”里面! –

+0

也许你是对的,看到评论尝试和缩进。不幸的是,代码是这样的,我们不知道它是否工作,因为它看起来像一个新的开发人员只是试图摆脱警告。 – jachguate