折腾了一白天了,就是出错。在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);
其中若干个,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);
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);
上面如果要删除3程序完了就成了
1<-2<-4<-5<-5
这里数字代表内容不代表元素号。
于是SETLENGTH(数组名,4)
就是这种方法。