gpt4 book ai didi

delphi - 从 TListbox 移动到 TStringGrid 的数据错误

转载 作者:行者123 更新时间:2023-12-03 15:54:56 25 4
gpt4 key购买 nike

我正在开发 Delphi 7。我有一个 TListBox 和一个 TStringGrid,有两列(没有固定的行或列)。我在 TListBox 中有数据如下:

可用元素 - a123 (a123)可用元件 - a1234 (a1234)可用元素 - a12345 (a12345)

TStringGrid 具有以下数据:

第 1 列第 2 列

a1 可用元素 - a1a2 可用元素 - a12

如果我选择 TListbox 中的第一项,即 a123 并执行以下按钮单击事件过程,则最后一项数据即 a12345 将移入网格中。

有人可以把重点放在我在下面的代码中做错的地方吗?以下代码将 TListbox 中的选定项移动到 TStringgird 的两列:

procedure TForm1.btnMoveLeftClick(Sender: TObject);
var
sString : String;
i : Integer;
begin
for i := 0 to ListBox1.Items.Count - 1 do
begin
{-- Is this status selected? --}
if ListBox1.Selected[i] then
begin
sString := Trim(ListBox1.Items[i]);

{-- Delete selected status. --}
ListBox1.Items.Delete (i);

if ((grdVFormDetails.RowCount >= 1) And (Trim(grdVFormDetails.Cells[0, 0]) <> EmptyStr)) then
grdVFormDetails.RowCount := grdVFormDetails.RowCount+1;

grdVFormDetails.Cols[1].Add(Copy(sString, 1, Pos('(', sString) - 1));

sString := Copy(sString, Pos('(', sString) + 1, Length(sString));
sString := Copy(sString, Pos('(', sString) + 1, Length(sString) - 1);

grdVFormDetails.Cols[0].Add(sString);


break;
end;
end;
end;

最佳答案

切勿在 FOR 循环中删除 TList 的项目。

这一行的问题:

  ListBox1.Items.Delete (i);

循环从 i:=0 到 2。项目 - 0 被选择并删除它。下一次重复我们得到了什么? i=1,但这里只剩下 2 个项目,而不是 3 个(所有后续项目都已移动),并且 i 指向最后一个项目而不是第二个。下一次重复时,当 i=3 时,我们将收到“索引超出范围”错误。您应该仅在 FOR 循环之后删除 Item 以避免此问题。

procedure TForm1.btnMoveLeftClick(Sender: TObject);
var
sString : String;
i : Integer;
k: integer;
begin
k:=-1;
for i := 0 to ListBox1.Items.Count - 1 do
begin
{-- Is this status selected? --}
if ListBox1.Selected[i] then
begin
sString := Trim(ListBox1.Items[i]);

{-- Delete selected status. --}
k:=i;

if ((grdVFormDetails.RowCount >= 1) And (Trim(grdVFormDetails.Cells[0, 0]) <> EmptyStr)) then
grdVFormDetails.RowCount := grdVFormDetails.RowCount+1;

grdVFormDetails.Cols[1].Add(Copy(sString, 1, Pos('(', sString) - 1));

sString := Copy(sString, Pos('(', sString) + 1, Length(sString));
sString := Copy(sString, Pos('(', sString) + 1, Length(sString) - 1);

grdVFormDetails.Cols[0].Add(sString);


break;
end;
end;
if k>=0 then ListBox1.Items.Delete (k);

end;

关于delphi - 从 TListbox 移动到 TStringGrid 的数据错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13833739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com