在使用 C++Builder 的 TStringGrid 控件時,經常需要清空所有單元格的內容以便重新填充數據。若直接將 RowCount 設為 1 再增加行數,舊資料往往會殘留,導致顯示錯誤。本文介紹一個經實測可靠的清空並重填資料的標準流程。
grdFileList->RowCount = 1; // 僅保留標題列
for (int irow = 0; irow < OpenDialog1->Files->Count; irow++) {
grdFileList->RowCount++; // 增加一行
grdFileList->Rows[irow+1]->Clear(); // 清空該行所有儲存格
grdFileList->Cells[0][irow+1] = ""; // 第 0 欄通常作為選取標記
grdFileList->Cells[1][irow+1] = ExtractFileName(OpenDialog1->Files->Strings[irow]); // 檔名
grdFileList->Cells[2][irow+1] = OpenDialog1->Files->Strings[irow]; // 含路徑完整檔名
// ... 其他欄位填充
}
if (grdFileList->RowCount > 1)
grdFileList->FixedRows = 1; // 將第一行固定為灰色標題列
RowCount 設為 1 會強制釋放除固定行外的所有列,確保記憶體乾淨。Rows[i]->Clear(),避免舊資料殘留。若僅執行 grdFileList->RowCount = 1; 而不在後續迴圈中 Clear(),當行數再次增長時,StringGrid 會重用先前配置的記憶體,導致舊字串「幽靈顯示」。
經測試於 C++Builder 6 及 C++Builder 2009 正常運作,較新版本同樣適用。