折腾了一白天了,就是出错。在FORM上有LABEL是运行时动态建立的,即动态TLABEL的数组,现要让用删除
其中若干个,TRANSPARENT=FALSE的就是用户选中的,我的原则是
从头一个元素开始判断,如果是选中的就将下一个的值比如CAPTION等覆盖过来
以此类推,可是就是删除时出错!!! 怎么回事,有没有别的好方法?if MessageDlg('确实要删除当前选中的打印点么',mtConfirmation, [mbYes, mbNo], 0) <> mrYes then exit;
  Up:=High(myLabels)+1;
  i:=0;
  j:=0;
  for i:=0 to Up do
    if myLabels[i].Transparent=false then inc(j);
  i:=0;
  while myLabels[i].Transparent=false do          //按向前紧凑原则删除元素
  begin
    k:=i;
    while k<=Up do                      // 从当前第一个被删除元素起后面元素向前移
    begin
      if k=Up then  break;
      myLabels[k].Caption:=myLabels[k+1].Caption;
      myLabels[k].Left:=myLabels[k+1].Left;
      myLabels[k].Top:=myLabels[k+1].Top;
      myLabels[k].Tag:=myLabels[k+1].Tag;
      myLabels[k].Transparent:=myLabels[k+1].Transparent;
      if myLabels[i].Transparent=false then             //如果连继有被删除的就次while k<OldLength do
      begin
        k:=i;
        continue;
      end;
      inc(k);
    end;
    inc(i);
  end;  setlength(myLabels,Up+1-j);

解决方案 »

  1.   

    上面程序粘的有问题,再粘一回。
    begin
      if MessageDlg('确实要删除当前选中的打印点么',mtConfirmation, [mbYes, mbNo], 0) <> mrYes then exit;
      Up:=High(myLabels)+1;
      i:=0;
      j:=0;
      for i:=0 to Up do
        if myLabels[i].Transparent=false then inc(j);
      i:=0;
      while myLabels[i].Transparent=false do          //按向前紧凑原则删除元素
      begin
        k:=i;
        while k<=Up do                      // 从当前第一个被删除元素起后面元素向前移
        begin
          if k=Up then  break;
          myLabels[k].Caption:=myLabels[k+1].Caption;
          myLabels[k].Left:=myLabels[k+1].Left;
          myLabels[k].Top:=myLabels[k+1].Top;
          myLabels[k].Tag:=myLabels[k+1].Tag;
          myLabels[k].Transparent:=myLabels[k+1].Transparent;
          if myLabels[i].Transparent=false then             //如果连继有被删除的就再循环
          begin
            k:=i;
            continue;
          end;
          inc(k);
        end;
        inc(i);
      end;  setlength(myLabels,Up+1-j);
      

  2.   

    setlength本身应该不会释放label
      

  3.   

    1<-2<-3<-4<-5
    上面如果要删除3程序完了就成了
    1<-2<-4<-5<-5
    这里数字代表内容不代表元素号。
    于是SETLENGTH(数组名,4)
    就是这种方法。
      

  4.   

    Up:=High(myLabels)+1; ?为什么加一?