B
BBDragon
В программе создается стандартная диалоговая панель для выбора файлов (CFileDialog). После выбора одного
или нескольких файлов необходимо в списке (CListBox) вывести имя каталога и имена выбранных файлов. Файлы
можно выбирать только из одного каталога, в противном случае необходимо вывести предупреждение об ошибке.
Если же файл или каталог открывается повторно - то не печатаем. Пока сделал только выбор файлов, вывод названия
директории и неповторяющихся файлов. Необходимо теперь запретить выбор файлов из другого каталога. Если я правильно понял необходимо использовать функции FindString() и SelectString() класса CListBox.
Не получается правильно организовать это..
Пишу на Visual C++ 2003, вот фрагмент программы:
[codebox]void CBrowserDlg::OnBrowse()
{
CFileDialog mFileOpen(TRUE,NULL,NULL,
OFN_HIDEREADONLY,(LPCSTR)" Все(*.*)|*.*|ПРЛИ (*.bt8)|*.bt8||");
mFileOpen.m_ofn.Flags |= OFN_ALLOWMULTISELECT; //для выбора нескольких файлов
POSITION pos;
CString strFileName;
CString strDirName;
CString strLeftPart;
int result = mFileOpen.DoModal();
// Проверяем как была закрыта диалоговая панель Open -
// по нажатию кнопки OK или Cancel
if(result == IDCANCEL)
{
// Если файлы не выбраны, т.е. нажата кнопка Canсel
AfxMessageBox("File not selected");
}
else if(result == IDOK)
{
//файлы выбраны, так как нажата кнопка ОК
pos = mFileOpen.GetStartPosition();
while (pos != NULL ) //просматриваем строки с полными именами файлов по очереди
{
strFileName = mFileOpen.GetNextPathName(pos);//исходная строка
strDirName="";
while ((nLastSlash = strFileName.Find('\\')) > 0) // если слэш найден
{
strLeftPart=strFileName.Left(nLastSlash);
strDirName=strDirName + strLeftPart + "\\";
//обрезаем строку с именем файла слева после найденного слэша
nStrLength=strFileName.Delete(0, nLastSlash+1);
};
//strDirName - имя пути открытого файла
int nIndex = 0;
//если путь отсутствует в списке - добавляем его!
if (((nIndex=m_lboxFileList.FindString(nIndex, strDirName)) == LB_ERR)
m_lboxFileList.AddString(strDirName);
nIndex = 0; //если имя файла отсутствует в списке - добавляем его!
if ((nIndex=m_lboxFileList.FindString(nIndex, strFileName)) == LB_ERR)
m_lboxFileList.AddString(strFileName);
}
}
}[/codebox]
Думаю просматривать все элементы списка по очереди. Если строка содержит слэш "\", то очевидно, что имеем дело с названием директории. Далее сравниваем ее с ранее полученным названием директории (strDirName). Если совпадают - ничего не пишем, если разнятся - выдаем сообщение об ошибке. Если же в списке нет ни одной директории, то значит файлы открыты первый раз и имя каталога пишем сразу.
Аналогично с именами файлов. Если имя файла есть в списке - ничего не делаем. Если же нет, то печатаем (естественно файлы должны быть из одного каталога).
Заранее всем спасибо!
или нескольких файлов необходимо в списке (CListBox) вывести имя каталога и имена выбранных файлов. Файлы
можно выбирать только из одного каталога, в противном случае необходимо вывести предупреждение об ошибке.
Если же файл или каталог открывается повторно - то не печатаем. Пока сделал только выбор файлов, вывод названия
директории и неповторяющихся файлов. Необходимо теперь запретить выбор файлов из другого каталога. Если я правильно понял необходимо использовать функции FindString() и SelectString() класса CListBox.
Не получается правильно организовать это..
Пишу на Visual C++ 2003, вот фрагмент программы:
[codebox]void CBrowserDlg::OnBrowse()
{
CFileDialog mFileOpen(TRUE,NULL,NULL,
OFN_HIDEREADONLY,(LPCSTR)" Все(*.*)|*.*|ПРЛИ (*.bt8)|*.bt8||");
mFileOpen.m_ofn.Flags |= OFN_ALLOWMULTISELECT; //для выбора нескольких файлов
POSITION pos;
CString strFileName;
CString strDirName;
CString strLeftPart;
int result = mFileOpen.DoModal();
// Проверяем как была закрыта диалоговая панель Open -
// по нажатию кнопки OK или Cancel
if(result == IDCANCEL)
{
// Если файлы не выбраны, т.е. нажата кнопка Canсel
AfxMessageBox("File not selected");
}
else if(result == IDOK)
{
//файлы выбраны, так как нажата кнопка ОК
pos = mFileOpen.GetStartPosition();
while (pos != NULL ) //просматриваем строки с полными именами файлов по очереди
{
strFileName = mFileOpen.GetNextPathName(pos);//исходная строка
strDirName="";
while ((nLastSlash = strFileName.Find('\\')) > 0) // если слэш найден
{
strLeftPart=strFileName.Left(nLastSlash);
strDirName=strDirName + strLeftPart + "\\";
//обрезаем строку с именем файла слева после найденного слэша
nStrLength=strFileName.Delete(0, nLastSlash+1);
};
//strDirName - имя пути открытого файла
int nIndex = 0;
//если путь отсутствует в списке - добавляем его!
if (((nIndex=m_lboxFileList.FindString(nIndex, strDirName)) == LB_ERR)
m_lboxFileList.AddString(strDirName);
nIndex = 0; //если имя файла отсутствует в списке - добавляем его!
if ((nIndex=m_lboxFileList.FindString(nIndex, strFileName)) == LB_ERR)
m_lboxFileList.AddString(strFileName);
}
}
}[/codebox]
Думаю просматривать все элементы списка по очереди. Если строка содержит слэш "\", то очевидно, что имеем дело с названием директории. Далее сравниваем ее с ранее полученным названием директории (strDirName). Если совпадают - ничего не пишем, если разнятся - выдаем сообщение об ошибке. Если же в списке нет ни одной директории, то значит файлы открыты первый раз и имя каталога пишем сразу.
Аналогично с именами файлов. Если имя файла есть в списке - ничего не делаем. Если же нет, то печатаем (естественно файлы должны быть из одного каталога).
Заранее всем спасибо!