Я использую C++ Builder XE8. Поскольку TOpenDialog
не работает на Android, я сам пытаюсь это сделать. Моя логика очень проста. Он начнет проверять файлы и папки из «/ storage» и покажет все элементы на TListView
. Если я коснусь папки (имя), она откроет эту папку, и если я коснусь файла, она должна показать имя на ярлыке. Поэтому я назначил функцию TListView
OnItemClick
.Создание TOpenDialog вручную в C++ Builder XE 8 (firemonkey)
Вот код. fpath - String, 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()
, он просто добавит больше строк с уже существующими линиями. Я начинаю, поэтому я не знаю, где я ошибаюсь.
Я использовал его тоже .. @Nompa но имеющий ту же проблему. – Jit9