TListView加入Item會少一個 |
尚未結案
|
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
各位板上先進好,在這有一個關於TListView的問題要請教。
就是當我把資料加入TListView的時候,最後一筆資料會顯示不出來。
我的做法是這樣: 0.TListView設成vsReport 1.把文字檔讀入TStringList 2.每一行依序讀出,切割欄位之後,加入到TListView 以下是我的片段程式碼 // sl是TStringList, data是TListItem, lvUser是TListView for( i = 0; i < sl->Count; i ) { data = lvUser->Items->Add() ; data->Caption = sl->Strings[i].SubString(1,10); data->SubItems->Add(sl->Strings[i].SubString(10, 20)); }我有在加完之後用ShowMessage秀出sl跟lvUser的Count,兩者是相同的。 完全想不透是為什麼阿~~ 我也找了別的測資了,還是都會少掉最後一個。
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
|
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
那小弟就獻醜了,這段程式碼的功用是按下按鈕之後,
會讓使用者去選取RaidenFTPD的使用者設定檔(xxx.user)
並檢查是否有鎖ip表(xxx.allow),有的話一同載入。
(都是先載入TStringList之後再一行行處理)
處理xxx.user檔的方式是用很笨的方式切出各欄位並存入TListView的欄位中。 處理xxx.allow檔則是依 void __fastcall TForm1::btnSelectFileClick(TObject *Sender) { if( OpenDialog1->Execute() ) { char buff[512]; TStringList *sl = new TStringList; TStringList *gp = new TStringList; TStringList *ip = new TStringList; sl->Sorted = true; gp->Sorted = true; gp->Duplicates = dupIgnore; TListItem *data; edtOpenFile->Text = OpenDialog1->FileName ; sl->LoadFromFile(OpenDialog1->FileName); String s = edtOpenFile->Text.SubString(0, edtOpenFile->Text.Length() - 5 ) ".allow"; UserData.clear(); if( FileExists(s) ) { ip->LoadFromFile(s); for( i = 0; i < ip->Count; i ) { strcpy(buff, ip->Strings[i].c_str()); AnsiString Name = AnsiString(strtok(buff, "@")); AnsiString Data = AnsiString(strtok(NULL, "")); UserData.insert(UserDataType(Name, Data)); } } cbGroup->Clear(); lvUser->Items->Clear() ; lvUser->Tag = 0; isDesc = 1; int k=0, p[22]; // p 是記錄 : 位置的 array for( i = 0; i < sl->Count; i ) { strcpy(buff, sl->Strings[i].c_str()); for( j = 0; j < sl->Strings[i].Length(); j ) if( buff[j] == ':' ) p[k ] = j; // 記錄每個 : 的位置 data = lvUser->Items->Add() ; data->Caption = sl->Strings[i].SubString(1, p[0]); for( k = 1; k < 22; k ) { if( k == 2 || k == 18 ) continue; data->SubItems->Add(sl->Strings[i].SubString(p[k-1] 2, p[k]-p[k-1]-1)); } gp->Add(data->SubItems->Strings[1]); k = 0; } cbGroup->Items->AddStrings(gp); btnModify->Enabled = true; delete data; delete ip; delete gp; delete sl; } }
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
chtai你好:
我改了一下你紅色部分的Code,看看能不能正確的作用。另外要注意p array夠不夠大。
for( i = 0; i < sl->Count; i ) { strcpy(buff, sl->Strings[i].c_str()); for( j = 0; j < sl->Strings[i].Length(); j ) if( buff[j] == ':' ) p[k ] = j; // 記錄每個 : 的位置 p[k ] = sl->Strings[i].Length()-1;//加上這行 data = lvUser->Items->Add() ; data->Caption = sl->Strings[i].SubString(1, p[0]); for( k = 1; k < 22; k ) { if( k == 2 || k == 18 ) continue; data->SubItems->Add(sl->Strings[i].SubString(p[k-1] 2, p[k]-p[k-1]-1)); } gp->Add(data->SubItems->Strings[1]); k = 0; } |
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
引言: chtai你好: 我改了一下你紅色部分的Code,看看能不能正確的作用。另外要注意p array夠不夠大。沒用哩~~我加上pwipwi兄的這一行之後 同樣的問題還是會發生。 (而且說真的,我不懂這一行的道理在哪^^a)for( i = 0; i < sl->Count; i ) { strcpy(buff, sl->Strings[i].c_str()); for( j = 0; j < sl->Strings[i].Length(); j ) if( buff[j] == ':' ) p[k ] = j; // 記錄每個 : 的位置 p[k ] = sl->Strings[i].Length()-1;//加上這行 data = lvUser->Items->Add() ; data->Caption = sl->Strings[i].SubString(1, p[0]); for( k = 1; k < 22; k ) { if( k == 2 || k == 18 ) continue; data->SubItems->Add(sl->Strings[i].SubString(p[k-1] 2, p[k]-p[k-1]-1)); } gp->Add(data->SubItems->Strings[1]); k = 0; } 真的很奇怪,我把資料都加入lvUser之後用這一行來查看 ShowMessage(lvUser->Items->Item[lvUser->Items->Count -1 ]->Caption);的確有最後一筆資料阿,只是不知怎樣就是顯示不出來 發表人 - chtai 於 2004/06/22 11:15:45
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
引言: 這聽起來真是奇怪…, 需要請你post資料檔上來看看是什麼樣子.... 不然只好請版上高手們來解決囉 另外你也可以試試把資料刪到只剩一行,再去trace看看到底發生了什麼事。 發表人 - pwipwi 於 2004/06/22 14:02:29資料檔就是很多行以下的資料格式 chtai:2::ROOT:1:0:0:0:0:0:27959673:1120302::default:65423:0.00:0:0:::1:1: 我試過就只有一行資料,依然不會顯示出來。 完全不知是怎麼個一回事阿。
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
for( i = 0; i < sl->Count; i ) { strcpy(buff, sl->Strings[i].c_str()); for( j = 0; j < sl->Strings[i].Length(); j ) if( buff[j] == ':' ) p[k ] = j; // 記錄每個 : 的位置 data = lvUser->Items->Add() ; data->Caption = sl->Strings[i].SubString(1, p[0]); for( k = 1; k < 22; k ) { if( k == 2 || k == 18 ) continue; data->SubItems->Add(sl->Strings[i].SubString(p[k-1] 2, p[k]-p[k-1]-1)); } gp->Add(data->SubItems->Strings[1]); k = 0; } data = lvUser->Items->Add();我加上這一行之後,最後一筆資料就會顯現出來了~ 好怪喔,有沒有人知道為什麼我原本沒有這一行的寫法跑不出資料呢? 不是應該可以的嗎?
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
引言:引言: 呃阿 看來似乎就是這麼一回事了... 可是>>< face="Verdana, Arial, Helvetica"> 用new配置出來的才需要用到delete喔。原來如此,這樣問題就解決了, 我那大量管理雷電FTPD使用者設定及鎖ip的小程式也可完工了:) 感謝大家的幫忙, 也感謝ENIX007兄一開始就指出問題所在,只可惜小弟不才一直沒發現。
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |