Delphi 2010 - 如何根据列表框的已删除项目删除备忘录中的行?

时间:2013-05-24 16:05:37

标签: delphi

我在表单中有两个对象: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开始。但是我无法解决这个问题。任何人都可以帮我删除这两个对象,只删除我在对象列表框中选择的行吗?

2 个答案:

答案 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项目。添加TListBoxTMemo控件。在IDE中为它们添加相同的行(例如alphabetagammadeltaepsilon)。

然后添加以下事件处理程序:

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;