我正在使用 C++ Builder XE8。由于TOpenDialog
不适用于Android,我正在尝试自己制作这样的东西。我的逻辑很简单。它将开始检查“/storage”中的文件和文件夹,并在TListView
. 如果我触摸一个文件夹(名称),它将打开该文件夹,如果我触摸一个文件,它应该在标签上显示名称。TListView
所以我为's OnItemClick
事件分配了一个函数。
这是代码。fpath 是字符串,Label1 显示当前文件夹,Label2 显示选定文件。
void __fastcall TForm1::lviewitemclck(TObject * const Sender, TListViewItem * const AItem)
{
if (AItem->Text == "<< BACK") {
if (!fpath.LastDelimiter("/") == 0) {
fpath = fpath.SubString(0, fpath.LastDelimiter("/"));
Label1->Text = fpath;
Form1->showfiles(fpath);
}
}
else if ( DirectoryExists(fpath+ AItem->Text)) {
fpath = fpath+ AItem->Text;
Label1->Text = fpath;
Form1->showfiles(fpath);
}
else if (FileExists(fpath+ AItem->Text)) {
Label2->Text ="File: "+ fpath+ AItem->Text;
}
}
以下是扫描文件和文件夹并显示它们的函数代码。字符串列表是 TStringList。
void __fastcall TForm1::showfiles (String path)
{
TSearchRec sr; // for scaning files and folders
TSearchRec fr; // to check whether the folder is accessible or not.
if (FindFirst(path+"/*", faAnyFile, sr) == 0)
{
stringlist->Clear();
stringlist->Add("<< BACK"); // being used to replace the ".."
do{
if(sr.Name != "." && sr.Name != ".."){
if (DirectoryExists(path+"/"+sr.Name)) {
if (FindFirst(path+"/"+sr.Name+"/*", faAnyFile, fr) == 0) { // to check if the folder is accessible
stringlist->Add("/"+ sr.Name);
}
FindClose(fr);
}
else{
stringlist->Add("/"+ sr.Name);
}
}
} while (FindNext(sr) == 0);
}
FindClose(sr);
stringlist->Sort();
Form1->Item->Free();
Form1->ListView1->BeginUpdate();
Form1->ListView1->ClearItems();
for( int i =0;i< stringlist->Count; i++){
Form1->Item = Form1->ListView1->Items->Add();
Form1->Item->Text = stringlist->Strings[i];
}
Form1->ListView1->EndUpdate();
}
这里的问题是,如果我ListView1->ClearItems()
在 TForm1::showfiles 中使用它会显示一条错误消息“地址访问冲突(随机否),访问地址 00000009”。如果我不使用ClearItems()
它,只需添加更多已存在行的行。我是初学者,所以我不知道我做错了什么。