Tlistbox控件的使用问题(20)

  • 主题发起人 主题发起人 tungh
  • 开始时间 开始时间
T

tungh

Unregistered / Unconfirmed
GUEST, unregistred user!
在Tlistbox上有数据的时候,当点的位置是该控件内的空的地方的时候会出现---------------------------List index out of bounds (-1)---------------------------这个错误,是怎么回事?还有有没有办法能够让Tlistbox默认显示出列表后第一次读取的是第一个? 我想这样至少就不会出上面的错误了吧? 只要有目标 就不会出错。很奇怪的问题
 
ComboBox1.ItemIndex := ComboBox1.Items.IndexOf( 字符串 )
 
这样拿不安全,lst.strings[E_gmflags.itemindex];要判断E_gmflags.itemindex是否在0,lst.count -1 的范围
 
在Tlistbox上有数据的时候,当点的位置是该控件内的空的地方的时候会出现---------------------------List index out of bounds (-1)---------------------------这个错误,是怎么回事?还有有没有办法能够让Tlistbox默认显示出列表后第一次读取的是第一个? 我想这样至少就不会出上面的错误了吧? 只要有目标 就不会出错。很奇怪的问题
 
这个错明明是你自己代码产生的问题你肯定在鼠标事件里用了ItemAtPosprocedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);var i:integer;begin with TListBox(Sender) do begin i:=ItemAtPos(point(x,y),true); if i=-1 then ItemIndex:=Items.Count-1; end;end;
 
回楼上的 。并没有加这个事件
 
是越界错误,仔细看下代码吧,如果自己实在看不出来,贴出来大家看下就ok的。
 
procedure fullsearch(searchfor:string; searchin:Tcombobox; lblresults:tlabel; outputbox:tlistbox);begin outputbox.Enabled:=true; lblresults.Enabled:=true; //-- Search for accountnamnes if searchin.text=searchin.Items[0] then begin seequery('SELECT `acct`,login`amount` FROM `accounts`',form1.accdb.text); searchinqrtable(searchfor,lblresults,outputbox,2,0); end; //-- Search for account ids (acct) if searchin.text=searchin.Items[1] then begin seequery('SELECT `acct`,login`amount` FROM `accounts`',form1.accdb.text); //seequery('SET NAMES GBK',form1.chardb.text); searchinqrtable(searchfor,lblresults,outputbox,1,0); end; //-- Search for character names if searchin.text=searchin.Items[2] then begin //'SET NAMES ''GBK''' seequery('SELECT `acct`,`name` FROM `characters`;',form1.chardb.text); //seequery('SET NAMES GBK',form1.chardb.text); searchinqrtable(searchfor,lblresults,outputbox,2,1); end; //-- Search for character ids (guid) if searchin.text=searchin.items[3] then begin seequery('SELECT `acct`,`GUID` FROM `characters`;',form1.chardb.text); searchinqrtable(searchfor,lblresults,outputbox,2,1); end;end;procedure TForm2.resultsClick(Sender: TObject);//这个是Tlistboxvar temp:string; i:integer; lst:Tstrings; ex:Boolean;begin seequery('SELECT * FROM `accounts` WHERE`acct`='''+getsaccid(results)+''' ;',form1.accdb.text); E_login.Text:=qrtable.Cells[2,1]; E_password.Text:=qrtable.Cells[3,1]; E_cryptedpw:=qrtable.Cells[4,1]; E_lng.text:=qrtable.Cells[10,1]; seequery('SELECT * FROM `kingsys_points` WHERE `acct`='''+getsaccid(results)+''' ;',form1.accdb.text); edtacctpoints.Text:=qrtable.Cells[6,1]; edtacctviplevel.Text:=qrtable.Cells[7,1]; seequery('SELECT `guid`,`Name` FROM `characters` WHERE`acct`='''+getsaccid(results)+''' ;',form1.chardb.text); E_chars.Items.clear; for i:=1 to qrtable.rowcount-1 do begin E_chars.Items.Add('[guid]'+qrtable.Cells[1,i]+' - '+qrtable.Cells[2,i]); end; groupbox1.visible:=true;end;procedure TForm2.searchbtnClick(Sender: TObject);//这个是个TButtonbegin fullsearch(searchfor.Text,searchin,lblresults,results);end;这个是相关代码。请指教 帮忙看看 谢谢
 
你的getsaccid里面写的是什么?
 
function getsaccid (box:Tlistbox):string;var vorresult:string; Position:integer;begin vorresult := box.Items[box.ItemIndex]; position:=pos(' ',vorresult); vorresult:= Copy(vorresult, 0,position); vorresult:=dwStrClearToInteger(vorresult); result:=vorresult;end;这个是getsaccid的
 
在第一句vorresult := box.Items[box.ItemIndex];的时候,你先做个判断if box.itemindex>-1 then
 
加了判断后 虽然没报错了但是 同样 第一次在没有选择到目标的时候直接点空的地方 返回到的东西是乱七八糟的 怎样才能让第一次点空地方的时候默认的就是被查到的第一个呢?
 
哎.......在resultsClick第一句再加一句话:if results.Items.Count=0 then exit;if results.ItemIndex=-1 then results.ItemIndex:=0;
 
非常感谢您的帮助
 
后退
顶部