Ошибка в filefind.cpp

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Ka4_0k
Сообщения: 5
Зарегистрирован: 06 дек 2009, 19:36

Здравствуйте. Есть задание написать простенький файл менеджер на С++. Создал проект 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());
}
 
Компилится без ошибок, но на стадии отладки выскакивает:
Изображение
Вот участок кода, указанный в ошибке:
Изображение
Кто может подсказать в чём здесь ошибка? Заранее благодарен.
IceFlame
Сообщения: 62
Зарегистрирован: 29 ноя 2009, 03:54

Ну как минимум слэши надо развернуть.
Ka4_0k
Сообщения: 5
Зарегистрирован: 06 дек 2009, 19:36

Спасибо большое за быстрый ответ, но не помогло... Ошибка осталась неизменной.
P.S. Вообще работаю на php, и там это не принципиально =)
IceFlame
Сообщения: 62
Зарегистрирован: 29 ноя 2009, 03:54

Еще надо читать мануалы по MFC :)
"You must call FindNextFile at least once before calling any of the following attribute member functions:
GetFileName"..
То бишь, в цикле должен быть FindNextFile, а не FindFile.
Ka4_0k
Сообщения: 5
Зарегистрирован: 06 дек 2009, 19:36

Спасибо, проморгал :)
Теперь возникла новая...
Тот же текст, но теперь 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.
Дык у меня и так всего-то одно окно...
IceFlame
Сообщения: 62
Зарегистрирован: 29 ноя 2009, 03:54

Дело в том, что переменная m_list у тебя не инициализирована никаким значением. Вообще по-хорошему надо вытащить хэндл листбокса с помощью функции WINAPI GetDlgItem, и затем добавлять строки через SendMessage. А в случае с MFC я даже и не знаю, как это реализовывать. По идее listbox должен быть связан с уже готовой переменной.
Дык у меня и так всего-то одно окно...
Дело в том, что каждый контрол, каждая кнопка, и тот же листбокс - это окно. И оно имеет свой хэндл. А в программе ты создаешь пустой объект listbox, не связанный ни с чем, и пытаешься что-то с ним делать.
Ka4_0k
Сообщения: 5
Зарегистрирован: 06 дек 2009, 19:36

Да, я тоже это много где читал. Но если я не буду объявлять m_list, то она будет undeclared identifier... В resource.h стоит

Код: Выделить всё

#define IDC_LIST1                       1001 
Пробовал в onInitDialog() прописать добавление первого элемента в list_box, не помогло :(
IceFlame
Сообщения: 62
Зарегистрирован: 29 ноя 2009, 03:54

Код: Выделить всё

CListBox m_list;
m_list.Attach(GetDlgItem(IDC_LIST1));
И далее делай как обычно.
Ka4_0k
Сообщения: 5
Зарегистрирован: 06 дек 2009, 19:36

Если прописать

Код: Выделить всё

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 и так по кругу....
IceFlame
Сообщения: 62
Зарегистрирован: 29 ноя 2009, 03:54

Во-первых, надо перенести всю эту функцию в OnInitDialog, потому что в конструкторе еще никаких контролов нет.
Во-вторых, используй GetDlgItem(IDC_LIST1) с одним аргументом, а не двумя.
В-третьих, почитай, например здесь:
http://forum.developing.ru/showthread.php?t=7289
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
В общем, пока сам не попробуешь, ничего не выйдет.

Код: Выделить всё

CListBox *list=(CListBox*)GetDlgItem(IDC_LIST1);
list->AddString(TEXT("Проверка"));
Только делать OnInitDialog.
Ответить