Database 单击TListBox中的任何项目时,索引超出范围(-1)
名为Database 单击TListBox中的任何项目时,索引超出范围(-1),database,sqlite,delphi,delphi-xe8,Database,Sqlite,Delphi,Delphi Xe8,名为lboMtrlList的TListBox由数据库中的记录填充。运行应用程序时,数据正确显示。单击列表中的任何项目时,显示错误: 索引超出范围(-1) 尽管列表不是空的 下面是填充lboMtrlList的代码: procedure TfrmMakeQuote.FormCreate(Sender: TObject); begin con := TFDConnection.Create(nil); query := TFDQuery.Create(con); con.LoginPro
lboMtrlList
的TListBox
由数据库中的记录填充。运行应用程序时,数据正确显示。单击列表中的任何项目时,显示错误:
索引超出范围(-1)
尽管列表不是空的
下面是填充lboMtrlList
的代码:
procedure TfrmMakeQuote.FormCreate(Sender: TObject);
begin
con := TFDConnection.Create(nil);
query := TFDQuery.Create(con);
con.LoginPrompt := false;
con.Open('DriverID=SQLite;Database=C:\Users\katiee\Documents\Embarcadero\Studio\Projects\ProgramDatabase;');
query.Connection := con;
performQuery;
query.SQL.Text :=
'SELECT [Material Description] FROM MtrlDatabase ORDER BY MtrlID';
try
query.Open;
lboMtrlList.Items.Clear;
while not query.EOF do
begin
lboMtrlList.Items.Add(query.Fields[0].AsString);
query.Next;
end;
finally
query.Close;
end;
//ledtDesc.Height := 81;
//ledtNotes.Height := 51;
end;
我希望能够双击lboomtrlist
中的一个项目,并将其移动到另一个名为lboSelectedMtrl
的TListBox
中。代码如下:
procedure TfrmMakeQuote.lboMtrlListDblClick(Sender: TObject);
begin
lboMtrlList.Items.Add(lboSelectedMtrl.Items.Strings[lboSelectedMtrl.ItemIndex]);
end;
我希望能够双击lboomtrlist
中的一个项目,并将其移动到另一个名为lboSelectedMtrl
的TListBox
中
你的代码做的恰恰相反。它正在尝试将项目从lboSelectedMtrl
移动到lboMtrlList
。由于在lboSelectedMtrl
中未选择任何项(lboSelectedMtrl.ItemIndex
为-1),因此您将获得边界错误
交换ListBox变量,并添加一些错误检查:
procedure TfrmMakeQuote.lboMtrlListDblClick(Sender: TObject);
var
Idx: Integer;
begin
Idx := lboMtrlList.ItemIndex;
if Idx <> -1 then
lboSelectedMtrl.Items.Add(lboMtrlList.Items.Strings[Idx]);
end;
过程TfrmMakeQuote.lboMtrlListDblClick(发送方:TObject);
变量
Idx:整数;
开始
Idx:=lboMtrlList.ItemIndex;
如果Idx-1那么
lboSelectedMtrl.Items.Add(lboMtrlList.Items.Strings[Idx]);
结束;
我希望能够双击lboomtrlist
中的一个项目,并将其移动到另一个名为lboSelectedMtrl
的TListBox
中
你的代码做的恰恰相反。它正在尝试将项目从lboSelectedMtrl
移动到lboMtrlList
。由于在lboSelectedMtrl
中未选择任何项(lboSelectedMtrl.ItemIndex
为-1),因此您将获得边界错误
交换ListBox变量,并添加一些错误检查:
procedure TfrmMakeQuote.lboMtrlListDblClick(Sender: TObject);
var
Idx: Integer;
begin
Idx := lboMtrlList.ItemIndex;
if Idx <> -1 then
lboSelectedMtrl.Items.Add(lboMtrlList.Items.Strings[Idx]);
end;
过程TfrmMakeQuote.lboMtrlListDblClick(发送方:TObject);
变量
Idx:整数;
开始
Idx:=lboMtrlList.ItemIndex;
如果Idx-1那么
lboSelectedMtrl.Items.Add(lboMtrlList.Items.Strings[Idx]);
结束;
您确定列表框上没有任何其他事件吗?尝试使用:lboMtrlList.Items.Add(lboSelectedMtrl.Items[lboSelectedMtrl.itemlindex])代码>1)您不需要字符串
,因为它是项
的默认属性。只需使用lboSelectedMtrl.Items[lboSelectedMtrl.ItemIndex]
。2) 永远不要假设ItemIndex
是有效的。始终先测试:如果lboSelectedMtrl.ItemIndex-1,则为
。如果列表框中没有项目并且双击了它,会发生什么情况?3) 您能否在不使用查询填充列表框的简单测试应用程序中重现此结果?如果是这样的话,你的帖子应该使用该代码。如果没有,那么进行更仔细的检查,看看您的查询是否返回任何行;如果没有,则列表框中没有项目。4)OnDoubleClick事件仅在双击控件时触发(顾名思义),因此如果单击项目时出现异常(如一次而非双击),则问题不在您发布的代码中;它将出现在OnClick
事件中,或者出现在OnChange
事件中。您确定列表框中没有其他事件吗?尝试使用:lboMtrlList.Items.Add(lboSelectedMtrl.Items[lboSelectedMtrl.itemlindex])代码>1)您不需要字符串
,因为它是项
的默认属性。只需使用lboSelectedMtrl.Items[lboSelectedMtrl.ItemIndex]
。2) 永远不要假设ItemIndex
是有效的。始终先测试:如果lboSelectedMtrl.ItemIndex-1,则为
。如果列表框中没有项目并且双击了它,会发生什么情况?3) 您能否在不使用查询填充列表框的简单测试应用程序中重现此结果?如果是这样的话,你的帖子应该使用该代码。如果没有,那么进行更仔细的检查,看看您的查询是否返回任何行;如果没有,则列表框中没有项目。4)OnDoubleClick事件仅在双击控件时触发(顾名思义),因此如果单击项目时出现异常(如一次而非双击),则问题不在您发布的代码中;它将出现在OnClick
事件中,或者出现在OnChange
事件中。你完全正确,我已经交换了它们,并且它完全按照我想要的方式工作。很尴尬,我甚至没有注意到这是一个错误的方法。谢谢。你说得完全对,我换了它们,它完全按照我想要的那样工作。很尴尬,我甚至没有注意到这是一个错误的方法。谢谢