我在一个窗体里用timer画线,然后创建了多个这个窗体的实例,我在另外一个窗体里循环
的判断有几 个窗体实例存在,如果存在就让它画线。
但是现在的问题是我打开画线窗体的多实例后,不能关任何一个,一关就提示not enough timers available
这是因为什么?画线的
procedure Tchartview.Timer1Timer(Sender: TObject);
var
  j,i: integer;
begin
   tmp := selectchan(StrToInt(combobox1.Text));
  if (strtoint(combobox1.Text)>0) and (strtoint(combobox1.Text)<=16) then
  for j := 0 to 49 do
  begin
    valcom1[1, j] := ((recv401[j * 96 + 497 + (tmp.a - 1) * 6] * 256 +
      recv401[j * 96 + 496 + (tmp.a - 1) * 6])-32767)/32767*Tfull1[tmp.a];
    series1.Add(valcom1[1, j]);
    valload1[1, j] := ((recv401[j * 96 + 499 + (tmp.a - 1) * 6] *
      256 + recv401[j * 96 + 498 + (tmp.a - 1) * 6])-32767)/32767*Tfull1[tmp.a];
    series2.Add(valload1[1, j]);
    valdis1[1, j] := ((recv401[j * 96 + 501 + (tmp.a - 1) * 6] *
      256 + recv401[j * 96 + 500 + (tmp.a - 1) * 6])-32767)/32767*Tfull1[tmp.a];
    series3.Add(valdis1[1, j]);
  end;
  if series1.Count > chart1.BottomAxis.Maximum then
  begin
    series1.Clear;
    series2.Clear;
    series3.Clear;
  end;    
  timer1.Enabled := False;
end;
另外一个timer判断一个窗体的多实例
    if chartview1 <> nil then
      for i := 0 to high(chartview1) do
      begin
        if chartview1[i] <> nil then
          chartview1[i].Timer1.Enabled := True;
      end;chartview1定义
var
  chartview: Tchartview;
  chartview1: array of Tchartview;

解决方案 »

  1.   

    问题好象出在这里,当你关闭一个窗体的时候,该窗体并不是NIL,而你
    if chartview1[i] <> nil then
              chartview1[i].Timer1.Enabled := True;
    的判断就会有问题,因为该窗体上的TIMER已经释放了,导致异常;
      

  2.   

    解决的方法是你需要关闭窗体的时候同时置NIL;
      

  3.   

    你关闭窗口是怎么写的?
    有release吗? 同意outer2000(天外流星)  需要设nil
      

  4.   

    可能是关闭窗体时,没有对char置nil
      

  5.   

    不行啊,我在chartview关闭里
    procedure Tchartview.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      chartview:=nil;
      action := cafree;
    end;
    还是报同样的错误:(
      

  6.   

    你不能这样来判断,你应该设一个数组来标志,窗体的创建和关闭的;然后TIMER判断数组;