procedure TForm1.Button1Click(Sender: TObject);
var
  strColor: string;
  i, R, G, B, p: integer;
  strlist: TStringList;
begin
  strColor := medt.Text + '-';
  strlist := TStringList.Create;
  try
    for R := 0 to 2 do       //把变量R改为i正常
    begin
      //showmessage(inttostr(r));   加上这句就正常了
      p := pos('-', strColor);
      strlist.Add(copy(strColor, 0, p-1));
      delete(strColor, 1, p);
    end;    R := strToint(strlist[0]);
    G := strToint(strlist[1]);
    B := strToint(strlist[2]);
  finally
    strlist.Free;
  end;  Self.Color := TColor (RGB (R, G, B));  edtColor.Text := '$' + IntToHex (TColor (RGB (R, G, B)), 8);  edtColor.SetFocus;
end;跟踪调试时, R的值在循环头为4, 到循环体内变为3了。 成了一个死循环。  用i做循环变量则正常。 用G时情况一样。 是delphi在那个位置用R,G做了全局变量? 那也有作用域限定阿

解决方案 »

  1.   

    不懂~我用R就是OK的http://lysoft.7u7.net
      

  2.   

    ???
    不明白,我用R也是正常的。你的代码,不会死循环的呀。
    好象在循环体中,如果不使用R变量,那么R的值不定,循环是靠寄存器完成的,和R无关。
      

  3.   

    注释到这三行代码运行正常:
    Self.Color := TColor (RGB (R, G, B));
    edtColor.Text := '$' + IntToHex (TColor (RGB (R, G, B)), 8);
    edtColor.SetFocus;新建一个工程贴上去也是死循环
    procedure TForm1.Button1Click(Sender: TObject);
    var
      strColor: string;
      i, R, G, B, p: integer;
      strlist: TStringList;
    begin
      //strColor := medt.Text + '-';
      strColor := '340-250-210-';
      strlist := TStringList.Create;
     // R := 999;
      try
        for R := 0 to 2 do
        begin
          p := pos('-', strColor);
          strlist.Add(copy(strColor, 0, p-1));
          delete(strColor, 1, p);
        end;
        showmessage('ok');
        R := strToint(strlist[0]);
        G := strToint(strlist[1]);
        B := strToint(strlist[2]);
      finally
        strlist.Free;
      end;  Self.Color := TColor (RGB (R, G, B));  Edit1.Text := '$' + IntToHex (TColor (RGB (R, G, B)), 8);
    end;真搞不懂
      

  4.   

    注释掉try,except也正常了。
    是优化的结果,因为后面对R进行了赋值,循环内部没有使用该变量。
    但是,不应该对循环造成死循环。不知道是什么问题。
      

  5.   

    project->options->Optimization去掉就好了。