在ListView中建幾個Column
item := lstTest.items.add;
item.caption := str1;
item.subitems.add(str2);
item.subitems.add(str3);
執行到item.caption := str1;時報錯:list index out of bounds(2)
我建了5個Column,不至于溢位呀
請高人指點
uj5u.com熱心網友回復:
我測驗了,沒有問題啊。。uj5u.com熱心網友回復:
我一直都用得好好的,突然就不行了.
我看了一下,我一共5個Column,添加的時候居然是從第4個Column開始寫,所以會out of bounds(2)
可為什么item.caption會從第4個開始呢,怎么都查不出原因
uj5u.com熱心網友回復:
貼個圖吧。。uj5u.com熱心網友回復:
沒辦法貼圖呢,就是報這個錯,抱錯的同時能看到把第一個caption的值寫到了第4個Column
uj5u.com熱心網友回復:
你認真檢查下代碼 應該是其他地方呼叫 導致錯誤。。uj5u.com熱心網友回復:
無代碼無真相
uj5u.com熱心網友回復:
仔細看了一下,我這段代碼是寫在IdServer.Excute里面,測驗的時候客戶端只發送了一條資訊就報錯了,所以應該不存在同步的問題,而且我后來加了M_Lock.Enter和M_Lock.Leave保護ListView,還是報同樣的錯uj5u.com熱心網友回復:
TThread.synchronize 同步函式uj5u.com熱心網友回復:
這句寫在哪兒呢?應該不是同步的問題吧,我跟蹤過,確實只執行了一次,不存在資源共享問題呀
uj5u.com熱心網友回復:
那就沒事。。還有你貼一下代碼會死啊!uj5u.com熱心網友回復:
我也想啊,真貼不了,你懂的,改天我在家里重寫一次uj5u.com熱心網友回復:
我不懂。。怎么了?
uj5u.com熱心網友回復:
靠, 前后碼才幾十行,有什么不可貼的??你這樣子還不如不問問題。
到了第7樓才出現IdServer。。。誰知道你怎么添加怎么洗掉?
listview你不用執行緒操作本來就有錯。
uj5u.com熱心網友回復:
商業保密?不用吧。。uj5u.com熱心網友回復:
單純看這幾行代碼沒問題,你不把背景關系代碼貼出來,誰知道哪里的問題?uj5u.com熱心網友回復:
procedure TServer.IdServerExecute(AThread: TIdPeerThread);
var
msg: String;
begin
msg := AThread.Connection.ReadLn;
if msg = '' then exit;
ReadMsg(msg);
end;
procedure TServer.ReadMsg(msg: String);
var
item: TListItem;
begin
M_Lock.Enter; //M_Lock是全域變數TCriticalSection
item := ListView1.Items.Add;
item.Caption := '0'; //單步執行到這里報錯
item.subItems.Add('1');
item.subItems.Add('2');
item.subItems.Add('3');
item.subItems.Add(msg);
M_Lock.Leave;
end;
重新開個行程同樣報錯
uj5u.com熱心網友回復:
寫錯了,是重開個執行緒來執行ReadMsg,同樣會報錯呢。uj5u.com熱心網友回復:
用Synchronize解決問題,原來VCL的可顯示控制元件只能用主執行緒來控制。我在Execute里面另外初始化一個用來處理訊息的執行緒類,再把ListView添加的程序函式放在Synchronize里面,問題就解決了。
uj5u.com熱心網友回復:
恭喜哇。。。。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/146406.html
標籤:VCL組件開發及應用
下一篇:Oracle Access(ODAC)組件,大家用的什么版本,SmartQuery組件中是否有UpdataModen屬性
