我在表单中有两个对象:1个列表框和1个备忘录。我尝试使用以下代码删除listbox1中的项目和备忘录中的相同行索引:
procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var i:integer; //seting a variable
begin
if key=vk_delete then //if key = a delete
begin
for i:=0 to listbox1.items.count -1
begin
listbox1.DeleteSelected; //delete the selected line of the listbox
memo2.Lines.Delete(i); //delete the line based on the listbox selected item
end;
end;
end;
但它只有在我向列表框添加一行时才有效。如果我在列表框中添加两行并尝试删除项目2,则memo1将删除第1行;如果我在列表框中添加更多项目并尝试删除,则会在memo1中删除各种行。我认为这是因为备忘录从0开始索引,列表框从1开始。但是我无法解决这个问题。任何人都可以帮我删除这两个对象,只删除我在对象列表框中选择的行吗?
答案 0 :(得分:2)
问题只是您要从备忘录中删除多行。这是因为,出于某种原因,您编写了一个循环,该循环在循环的每次迭代中都被删除。你不想那样做。您只想删除一行。
您需要沿着这些方向使用代码:
var
Index: Integer;
....
Assert(ListBox1.Items.Count=Memo2.Lines.Count);
Index := ListBox1.ItemIndex;
if Index<>-1 then
begin
ListBox1.Items.Delete(Index);
Memo2.Lines.Delete(Index);
end;
我已经替换了循环列表框项目的代码,并从列表框中删除了多个项目,并从备忘录中删除了多行。相反,我获取列表框中所选项目的索引,并从列表框中删除一行,并从备忘录中删除一行。
答案 1 :(得分:2)
你的代码完全没有意义。它甚至没有接近做我认为你想做的事情,这就是:
创建一个新的VCL项目。添加TListBox
和TMemo
控件。在IDE中为它们添加相同的行(例如alpha
,beta
,gamma
,delta
和epsilon
)。
然后添加以下事件处理程序:
procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = VK_DELETE) and (ListBox1.ItemIndex <> -1) then
begin
Memo1.Lines.Delete(ListBox1.ItemIndex);
ListBox1.DeleteSelected;
end;
end;