【问题标题】:SerAndDeser.pas(298): W1036 Variable 'tForm' might not have been initializedSerAndDeser.pas(298):W1036 变量“tForm”可能尚未初始化
【发布时间】:2012-12-19 14:58:52
【问题描述】:

有代码

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

为什么?如何在不丢失应用程序功能的情况下摆脱警告?

【问题讨论】:

    标签: delphi variables build warnings delphi-xe2


    【解决方案1】:

    你的缩进是错误的。我认为这是让你感到困惑的地方。如果你正确缩进代码,它看起来像这样:

    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 的一大错误。确实是 C。

    我使用内置的代码格式化程序来理顺您的缩进。这可能是一个有用的工具,可以帮助您修复代码。它可以让你掌握如何正确布置缩进。

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

    【讨论】:

    • IOW 如果 mForm.ComponentCount 为零,则表赋值中不会分配 tForm。
    • @jachguate 或者如果不满足if 语句。但问题远比这严重得多。编码人员显然打算在 if! 中包含多个语句!
    • 也许你是对的,看到评论的尝试和缩进。不幸的是,代码就是这样,我们不知道它是否有效,因为看起来新开发人员只是试图摆脱警告。
    • @jachguate 如果您仔细阅读问题,您可以看到编码员的期望正如我所说。我的意思是“它在上一行初始化”。
    • +1。如果可以的话,我会再次投票赞成关于单语句语法的段落。
    猜你喜欢
    • 2012-01-02
    • 2012-03-25
    • 2015-07-04
    • 1970-01-01
    相关资源
    最近更新 更多