Страница 1 из 1
Ошибка в filefind.cpp
Добавлено: 06 дек 2009, 20:14
Ka4_0k
Здравствуйте. Есть задание написать простенький файл менеджер на С++. Создал проект dialog based.
Кинул на форму list_box, в коде прописал:
Код: Выделить всё
CFile_managerApp::CFile_managerApp()
{
CListBox m_list;
CFileFind ff;
ff.FindFile("C://*.*");
while(ff.FindFile()) {
m_list.AddString(ff.GetFileName());
}
m_list.AddString(ff.GetFileName());
}
Компилится без ошибок, но на стадии отладки выскакивает:

Вот участок кода, указанный в ошибке:

Кто может подсказать в чём здесь ошибка? Заранее благодарен.
Re: Ошибка в filefind.cpp
Добавлено: 06 дек 2009, 21:16
IceFlame
Ну как минимум слэши надо развернуть.
Re: Ошибка в filefind.cpp
Добавлено: 06 дек 2009, 21:22
Ka4_0k
Спасибо большое за быстрый ответ, но не помогло... Ошибка осталась неизменной.
P.S. Вообще работаю на php, и там это не принципиально =)
Re: Ошибка в filefind.cpp
Добавлено: 06 дек 2009, 21:28
IceFlame
Еще надо читать мануалы по MFC

"You must call FindNextFile at least once before calling any of the following attribute member functions:
GetFileName"..
То бишь, в цикле должен быть FindNextFile, а не FindFile.
Re: Ошибка в filefind.cpp
Добавлено: 06 дек 2009, 21:45
Ka4_0k
Спасибо, проморгал

Теперь возникла новая...
Тот же текст, но теперь axfwin2.inl на строке 669
Вот её содержимое:
{ ASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, LB_ADDSTRING, 0, (LPARAM)lpszItem); }
Смотрел и хедеры, всё вроде нормально...
Еще надо читать мануалы по MFC
А есть ли нормальные рускоязычные? На английском читать не очень удобно

---------------
Нашёл вот что:
Here you can quite quickly spot that to are trying to access a window that does not exist yet. The list window will not be created until your second dialog has been initialised.
Дык у меня и так всего-то одно окно...
Re: Ошибка в filefind.cpp
Добавлено: 06 дек 2009, 21:58
IceFlame
Дело в том, что переменная m_list у тебя не инициализирована никаким значением. Вообще по-хорошему надо вытащить хэндл листбокса с помощью функции WINAPI GetDlgItem, и затем добавлять строки через SendMessage. А в случае с MFC я даже и не знаю, как это реализовывать. По идее listbox должен быть связан с уже готовой переменной.
Дык у меня и так всего-то одно окно...
Дело в том, что каждый контрол, каждая кнопка, и тот же листбокс - это окно. И оно имеет свой хэндл. А в программе ты создаешь пустой объект listbox, не связанный ни с чем, и пытаешься что-то с ним делать.
Re: Ошибка в filefind.cpp
Добавлено: 06 дек 2009, 22:19
Ka4_0k
Да, я тоже это много где читал. Но если я не буду объявлять m_list, то она будет undeclared identifier... В resource.h стоит
Пробовал в onInitDialog() прописать добавление первого элемента в list_box, не помогло

Re: Ошибка в filefind.cpp
Добавлено: 06 дек 2009, 22:27
IceFlame
Код: Выделить всё
CListBox m_list;
m_list.Attach(GetDlgItem(IDC_LIST1));
И далее делай как обычно.
Re: Ошибка в filefind.cpp
Добавлено: 06 дек 2009, 22:54
Ka4_0k
Если прописать
Код: Выделить всё
CListBox m_list;
m_list.Attach(GetDlgItem(IDC_LIST1,*m_list));
прямо перед
Код: Выделить всё
CFileFind ff;
ff.FindFile("C://*.*");
while(ff.FindFile()) {
m_list.AddString(ff.GetFileName());
}
m_list.AddString(ff.GetFileName());
Ошибка всё равно остаётся. (без указателя выкидывает ошибку)
Если прописать в onInitDialog()
Код: Выделить всё
CListBox m_list;
m_list.Attach(GetDlgItem(IDC_LIST1,&*m_list));
, то постоянно ругается что не может преобразовать то из CListBox* в HWND__**, а когда привожу к этому типу, то что не может преобразовать в const int и так по кругу....
Re: Ошибка в filefind.cpp
Добавлено: 06 дек 2009, 23:07
IceFlame
Во-первых, надо перенести всю эту функцию в OnInitDialog, потому что в конструкторе еще никаких контролов нет.
Во-вторых, используй GetDlgItem(IDC_LIST1) с одним аргументом, а не двумя.
В-третьих, почитай, например здесь:
http://forum.developing.ru/showthread.php?t=7289
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
В общем, пока сам не попробуешь, ничего не выйдет.
Код: Выделить всё
CListBox *list=(CListBox*)GetDlgItem(IDC_LIST1);
list->AddString(TEXT("Проверка"));
Только делать OnInitDialog.