Помогите, плз, с примером
От: grey109 http://music.rekom.ru
Дата: 01.12.04 13:06
Оценка:
Второй день уже бьюсь на такой вроде бы простой задачей: нужно создать приложение на основе single document, в рабочее поле поместить CListView, и заполнить список из базы данных(*.mdb). БД большая – несколько десятков тысяч записей. Я вроде бы все сделал, но работает он уж очень медленно
Я хотел бы вас попросить помочь с примером: никаких наворотив не надо – нужен самый простой проект, в котором идет чтение БД из файла *.mdb, и вносят прочитанные данные в список. Думаю, что для опытных программистов это не составит труда.

Заранее спасибо за помощь.

PS: плз, скиньте исходники примера на grey109@yandex.ru
Re: Помогите, плз, с примером
От: Bingin  
Дата: 01.12.04 13:28
Оценка:
Здравствуйте, grey109, Вы писали:

G>Второй день уже бьюсь на такой вроде бы простой задачей: нужно создать приложение на основе single document, в рабочее поле поместить CListView, и заполнить список из базы данных(*.mdb). БД большая – несколько десятков тысяч записей. Я вроде бы все сделал, но работает он уж очень медленно

G>Я хотел бы вас попросить помочь с примером: никаких наворотив не надо – нужен самый простой проект, в котором идет чтение БД из файла *.mdb, и вносят прочитанные данные в список. Думаю, что для опытных программистов это не составит труда.

G>Заранее спасибо за помощь.


G>PS: плз, скиньте исходники примера на grey109@yandex.ru


А нужен именно CListView?
Re[2]: Помогите, плз, с примером
От: grey109 http://music.rekom.ru
Дата: 01.12.04 13:37
Оценка:
G>>PS: плз, скиньте исходники примера на grey109@yandex.ru

B>А нужен именно CListView?


Желательно, а что с ним что-то не так?
Re[3]: Помогите, плз, с примером
От: Bingin  
Дата: 01.12.04 13:49
Оценка:
Здравствуйте, grey109, Вы писали:

G>>>PS: плз, скиньте исходники примера на grey109@yandex.ru


B>>А нужен именно CListView?


G>Желательно, а что с ним что-то не так?


Просто можно былобы использовато какой-нибудь грид контрол, присоединить к нему базу данных, и отображать записи.
Re[4]: Помогите, плз, с примером
От: Bingin  
Дата: 01.12.04 13:50
Оценка:
Здравствуйте, Bingin, Вы писали:

B>Здравствуйте, grey109, Вы писали:


G>>>>PS: плз, скиньте исходники примера на grey109@yandex.ru


B>>>А нужен именно CListView?


G>>Желательно, а что с ним что-то не так?


B>Просто можно былобы использовато какой-нибудь грид контрол, присоединить к нему базу данных, и отображать записи.


А еще вопрос, каким способом ты берешь данные из базы?
Re[5]: Помогите, плз, с примером
От: grey109 http://music.rekom.ru
Дата: 01.12.04 17:46
Оценка:
B>>Просто можно былобы использовато какой-нибудь грид контрол, присоединить к нему базу данных, и отображать записи.

Хм... надо будет по пробовать.

B>А еще вопрос, каким способом ты берешь данные из базы?


CDaoDatabase database;
CDaoRecordset recordset(&database);
database.Open("d:\\db1.mdb");
CString SqlCmd = "Select * from table1";
recordset.Open(dbOpenDynaset, SqlCmd);

...

recordset.MoveFirst();
Re: Помогите, плз, с примером
От: Calc Россия  
Дата: 01.12.04 18:53
Оценка:
Где то на этом сайте лежала статья про виртуальный грид.
Она как раз помоему про использование CListView для отображения множества записей.
Не поленись, поищи в разделе "Статьи"
Re[6]: Помогите, плз, с примером
От: Bingin  
Дата: 02.12.04 06:55
Оценка:
Здравствуйте, grey109, Вы писали:

B>>>Просто можно былобы использовато какой-нибудь грид контрол, присоединить к нему базу данных, и отображать записи.


G>Хм... надо будет по пробовать.


Я сам пользуюсь Stingray Objective Grid посмотреть можно тут http://www.roguewave.com/products/stingray/objectivegrid/
Конкретного исходника не приведу, там довольно просто все, после всей его установки в VC добавится несколько AppWizard'ов один из нах быдет DAO Grid AppWizard, после создания проека сразу все будет работать

B>>А еще вопрос, каким способом ты берешь данные из базы?


G>CDaoDatabase database;

G>CDaoRecordset recordset(&database);
G>database.Open("d:\\db1.mdb");
G>CString SqlCmd = "Select * from table1";
G>recordset.Open(dbOpenDynaset, SqlCmd);

G>...


G>recordset.MoveFirst();


Здесь вобщемто я и сам бы так делал.
Re[2]: Помогите, плз, с примером
От: grey109 http://music.rekom.ru
Дата: 02.12.04 07:24
Оценка:
C>Где то на этом сайте лежала статья про виртуальный грид.
C>Она как раз помоему про использование CListView для отображения множества записей.
C>Не поленись, поищи в разделе "Статьи"

Ты про это http://www.rsdn.ru/article/controls/virtlist.xml
Автор(ы): Тимофей Чадов
Дата: 10.09.2001
"Использование ListView в режиме виртуального списка"? Если да, то я это уже видел. Похоже у меня проблема в заполнении списка... Может кто подскажет как и в каком месте его правильно заполнить из файла БД?
Re[3]: Помогите, плз, с примером
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 02.12.04 07:30
Оценка:
Здравствуйте, grey109, Вы писали:

G>Похоже у меня проблема в заполнении списка... Может кто подскажет как и в каком месте его правильно заполнить из файла БД?


Не знаю, как насчет "правильно", но я обычно после создания list view control'а пускаю отдельный поток, в функцию которого передается его HWND. А из потока после чтения каждой записи, вызывается PostMessage(), закидывающая данные в список.
[ posted via RSDN@Home 1.1.4 beta 3 r240 ]
- Искренне ваш, Поросенок Пафнутий
Re[4]: Помогите, плз, с примером
От: grey109 http://music.rekom.ru
Дата: 02.12.04 08:07
Оценка:
SDB>Не знаю, как насчет "правильно", но я обычно после создания list view control'а пускаю отдельный поток, в функцию которого передается его HWND. А из потока после чтения каждой записи, вызывается PostMessage(), закидывающая данные в список.

Кусочком кода не поделишься?

Заранее спасибо.
Re[5]: Помогите, плз, с примером
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 02.12.04 08:23
Оценка:
Здравствуйте, grey109, Вы писали:

G>Кусочком кода не поделишься?


"Рафинированного" примера, к сожалению, нет... надергал из рабочего проекта:

// LogsArchiveDialog.h

namespace LOGS_ARCHIVE {

    struct ENTRY_DATA {
        enum {
            LEN_DESCRIPT = 255,
            LEN_PARAMETERS_SYS = 255,
            LEN_ANSWER = 255,
            LEN_COMMENTARY = 255,
            LEN_PARAMETERS_EXS = 255,
            LEN_COMMAND_CODE = 2
        };
        TCHAR szDescript[LEN_DESCRIPT + 1];
        TCHAR szParametersSys[LEN_PARAMETERS_SYS + 1];
        TCHAR szAnswer[LEN_ANSWER + 1];
        COleDateTime odtDateTime;
        COleDateTime odtDateAnswer;
        TCHAR szCommentary[LEN_COMMENTARY + 1];
        TCHAR szParametersExs[LEN_PARAMETERS_EXS + 1];
        TCHAR szCommandCode[LEN_COMMAND_CODE + 1];
    };

}    // namespace LOGS_ARCHIVE

class CLogsArchiveDialog: public ETSLayoutDialog
{
...
    DECLARE_MESSAGE_MAP()
...
    virtual BOOL OnInitDialog(void);
...
    afx_msg LRESULT OnLogEntryFetched(WPARAM wParam, LPARAM lParam);
...
    enum {
        // private messages
        DM_SET_LOG_SIZE = WM_APP + 0,
        DM_LOG_ENTRY_FETCHED = WM_APP + 1
    };
...
    std::vector<LOGS_ARCHIVE::ENTRY_DATA> m_vecData;
    CWinThread* m_pFetchThread;
    CCustomListCtrl m_listLogEntries;
...
    static UINT MxFetchProc(void* pvParam);
...
};

// LogsArchiveDialog.cpp

BEGIN_MESSAGE_MAP(CLogsArchiveDialog, ETSLayoutDialog)
...
    ON_MESSAGE(DM_LOG_ENTRY_FETCHED, OnLogEntryFetched)
...
END_MESSAGE_MAP()

...

BOOL CLogsArchiveDialog::OnInitDialog(void)
{
...
    m_listLogEntries.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
...
    m_pFetchThread = AfxBeginThread(MxFetchProc, GetSafeHwnd());
...
}

...

// DM_LOG_ENTRY_FETCHED handler
// wParam - item index
// lParam - pointer to a ENTRY_DATA structure
LRESULT CLogsArchiveDialog::OnLogEntryFetched(WPARAM wParam, LPARAM lParam)
{
    using LOGS_ARCHIVE::ENTRY_DATA;

    LVITEM lvi;

    ENTRY_DATA* pData = reinterpret_cast<ENTRY_DATA*>(lParam);
    m_vecData.push_back(*pData);
    delete pData;
    memset(&lvi, 0, sizeof(lvi));
    lvi.mask = LVIF_TEXT | LVIF_PARAM;
    lvi.iItem = wParam;
    lvi.pszText = LPSTR_TEXTCALLBACK;
    lvi.lParam = m_vecData.size() - 1;
    return (m_listLogEntries.InsertItem(&lvi) == static_cast<int>(wParam));
}

...

template <class T_RECORDSET>
static void FetchProcHelper(T_RECORDSET& rsSrc, HWND hLogsArchiveDlg)
{
    using LOGS_ARCHIVE::ENTRY_DATA;

    LARGE_INTEGER qwFrequency;
    LARGE_INTEGER qwStart;
    LARGE_INTEGER qwFinish;
    ENTRY_DATA* pData;

    rsSrc.Open(CRecordset::snapshot, NULL, CRecordset::readOnly);
    if (!rsSrc.IsBOF()) {
        BOOL fHasCounter = ::QueryPerformanceFrequency(&qwFrequency);
        ::QueryPerformanceCounter(&qwStart);
        // walk through the records
        for (int iItem = 0; !rsSrc.IsEOF(); ++iItem) {
            // trim trailing spaces
            rsSrc.m_strDescript.TrimRight();
            rsSrc.m_strParametersSys.TrimRight();
            rsSrc.m_strAnswer.TrimRight();
            rsSrc.m_strCommentary.TrimRight();
            rsSrc.m_strParametersExs.TrimRight();
            rsSrc.m_strCommandCode.TrimRight();
            // remember record fields
            pData = new ENTRY_DATA;
            ::lstrcpy(pData->szDescript, rsSrc.m_strDescript);
            ::lstrcpy(pData->szParametersSys, rsSrc.m_strParametersSys);
            ::lstrcpy(pData->szAnswer, rsSrc.m_strAnswer);
            pData->odtDateTime = rsSrc.m_odtDateTime;
            pData->odtDateAnswer = rsSrc.m_odtDateAnswer;
            ::lstrcpy(pData->szCommentary, rsSrc.m_strCommentary);
            ::lstrcpy(pData->szParametersExs, rsSrc.m_strParametersExs);
            ::lstrcpy(pData->szCommandCode, rsSrc.m_strCommandCode);
            ::PostMessage(hLogsArchiveDlg, CLogsArchiveDialog::DM_LOG_ENTRY_FETCHED, iItem,
                reinterpret_cast<LPARAM>(pData));
            // fetch the next record
            rsSrc.MoveNext();
        }
        ::QueryPerformanceCounter(&qwFinish);
        if (fHasCounter) {
            double fpElapsed = (double)(qwFinish.QuadPart - qwStart.QuadPart);
            fpElapsed = fpElapsed / (double)qwFrequency.QuadPart;
            TRACE(_T("FetchProcHelper(): %.1f second(s).\n"), fpElapsed);
        }
    }
    rsSrc.Close();
}

UINT CLogsArchiveDialog::MxFetchProc(void* pvParam)
{
    HWND hLogsArchiveDlg = static_cast<HWND>(pvParam);
    ASSERT(::IsWindow(hLogsArchiveDlg));

    try {
        CLogsArchiveRset rsLogsArchive;
#pragma inline_depth(0)
        FetchProcHelper(rsLogsArchive, hLogsArchiveDlg);
#pragma inline_depth()
    }
    catch (CDBException* pXcpt) {
        // oops!!
        pXcpt->ReportError(MB_ICONSTOP | MB_OK);
        pXcpt->Delete();
        AfxEndThread((UINT)-2);
        return ((UINT)-2);
    }

    AfxEndThread(0);
    return (0);
}
[ posted via RSDN@Home 1.1.4 beta 3 r240 ]
- Искренне ваш, Поросенок Пафнутий
Re[7]: Помогите, плз, с примером
От: grey109 http://music.rekom.ru
Дата: 02.12.04 10:09
Оценка:
B>Я сам пользуюсь Stingray Objective Grid посмотреть можно тут http://www.roguewave.com/products/stingray/objectivegrid/

Чего-то у меня сайт не грузится Тебя не затруднит прислать дистрибутив этого objectivegrid на мыло grey109@yandex.ru ?

2SchweinDeBurg: спасибо за пример, буду сейчас в не разбираться.
Re[8]: Помогите, плз, с примером
От: Bingin  
Дата: 02.12.04 12:35
Оценка:
Здравствуйте, grey109, Вы писали:

B>>Я сам пользуюсь Stingray Objective Grid посмотреть можно тут http://www.roguewave.com/products/stingray/objectivegrid/


G>Чего-то у меня сайт не грузится Тебя не затруднит прислать дистрибутив этого objectivegrid на мыло grey109@yandex.ru ?


G>2SchweinDeBurg: спасибо за пример, буду сейчас в не разбираться.


Он слицком здоровый 28Мб
Re[9]: Помогите, плз, с примером
От: grey109 http://music.rekom.ru
Дата: 03.12.04 05:50
Оценка:
B>Он слицком здоровый 28Мб

Ого! Ладно, тогда может подскажешь название файла дистрибутива, я сам попробую его найти и скачать.
Re[10]: Помогите, плз, с примером
От: Bingin  
Дата: 03.12.04 08:01
Оценка:
Здравствуйте, grey109, Вы писали:

B>>Он слицком здоровый 28Мб


G>Ого! Ладно, тогда может подскажешь название файла дистрибутива, я сам попробую его найти и скачать.


Stingray_Objective_Grid_PRO_8_0.zip
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.