注册和删除 ITEM 访问数据库 - Delphi

Register and delete ITEM access database - Delphi

我正在向数据库发送一个 ListView 的项目,发送后必须删除发送的项目。

注册正常执行,但我的问题是删除项目的时间。这会产生以下错误:

access violation at address 0073F82E in module "project1.exe". Read OF address 00000008

我必须做些什么才能不产生这个错误。因为它只在我尝试删除文件时发生(在数据库中注册通常会发生,直到某些项目产生此错误)。

if LstbxDados.Items.Count <= 0 then begin
    exit;
end;

//try
    ADOConnection1.Connected := true;
    try

       with ADOCommand1 do begin
           CommandText  := 'INSERT INTO IP (ti_ip, url_ip, ima_ip, desc_ip,id_ip, data_ip, cat_ip,cad_ip) VALUES ( :a, :b, :c, :d, :e, :f, :g, NOW() )';
           for I := 0 to LstbxDados.Items.Count - 1 do begin
              parameters.parambyname('a').value := Trim(LstbxDados.Items.Item[i].SubItems[0]);
              parameters.parambyname('b').value := Trim(LstbxDados.Items.Item[i].SubItems[1]);
              parameters.parambyname('c').value := Trim(LstbxDados.Items.Item[i].SubItems[2]);
              parameters.parambyname('d').value := Trim(LstbxDados.Items.Item[i].SubItems[3]);
              parameters.parambyname('e').value := Trim(LstbxDados.Items.Item[i].SubItems[4]);
              if Trim(LstbxDados.Items.Item[i].SubItems[5]) <> '' then begin
                  parameters.parambyname('f').value := StrTodate(Trim(LstbxDados.Items.Item[i].SubItems[5]));
              end else begin
                  parameters.parambyname('f').value := null;
              end;
              parameters.parambyname('g').value := Trim(LstbxDados.Items.Item[i].SubItems[6]);
              Execute;
              LstbxDados.Items.Delete(i);
           end;
       end;
    finally
        ADOConnection1.Connected := false;
    end;
//except
//    respostas(9);
//end;

正如评论中所解释的那样,发生这种情况是因为您正在假设循环中删除项目(因为

for I := 0 to LstbxDados.Items.Count - 1 do

) Items.Count 保持不变,而实际上每次删除项目时它都会减少一个。因此,第一次循环时编号为 [Count -1] 的 Item,在轮到它被删除时不再是,因为那时 Items 的数量少于 Count - 1 的初始值。

解决方案:使用

for I := LstbxDados.Items.Count - 1 downto 0 do

顺便说一句,我的第一个想法是使用 while 循环:

while LstbxDados.Items.Count > 0 do begin

但请参阅@TLama 的评论,如果您这样做的话,请注意您的 Items 数组索引。