На этом шаге мы рассмотрим алгоритм заполнения окна Select Fund.
Сейчас напишем функцию, загружающую названия ценных бумаг в список, который отображается в диалоговом окне
Selection Fund. Поскольку записи с информацией о ценных бумагах, хранящиеся в объекте
CSTUploadDoc::m_DocList, отсортированы по названиям ценных бумаг, то организовать цикл для
извлечения из списка уникальных названий достаточно легко.
Прежде чем писать функцию, создайте переменную типа CListBox.
- Добавление переменной-члена CFundDialog::m_listBox.
- Нажмите CTRL+W, чтобы запустить ClassWizard. Щелкните вкладку Member Variables.
- В списке Class Name выберите CFundDialog.
- Щелкните Add Variable. В поле Member variable name введите m_listBox.
- В списке Category выберите Control. В списке Variable Type появится тип CListBox.
Рис.1. Добавление переменной m_listBox - Щелкните OK, чтобы создать переменную, и еще раз щелкните ОК, чтобы закрыть ClassWizard.
Теперь Вам нужно добавить в класс CMainFrame функцию-член UpdateFundList(), предназначенную
для помещения в список названий ценных бумаг. У функции два параметра - ссылка на источник названий типа
CStockDataList и строка, в которой задается имя первоначально выбранной ценной бумаги. Если во втором
параметре задана пустая строка (значение по умолчанию) или указанная ценная бумага в списке не найдена, то никакой
элемент не будет выделен.
- Реализация функции CMainFrame::UpdateFundList().
- На вкладке FileView раскройте узел Header Files и дважды щелкните значок файла MainFrm.h.
- В начале файла после других операторов #include добавьте следующую строку:
#include "StockDataList.h"
- Щелкните вкладку ClassView и правой кнопкой мыши щелки значок CMainFrame. Выбрав пункт
Add Member Function, добавьте объявление функции в раздел public. Оно должно выглядеть так:void UpdateFundList(const CStockDataList & pList, CString strCurrentFund = "");
- Добавьте следующий код в тело функции UpdateFundList():
// Функция добавляет в список CStockDataLists названия ценных бумаг. // Он отсортирован по именам, поэтому делается это легко. CListBox *pListBox = &m_wndFundDialog.m_listBox; // Очистить содержание списка pListBox->ResetContent(); CString strLastFund; POSITION pos = pList.GetHeadPosition(); while( pos ) { CStockData sd = pList.GetNext( pos ); CString strFund = sd.GetFund(); if( strFund != strLastFund ) pListBox->AddString( strFund ); strLastFund = strFund; } // Выделяем в списке элемент, соответствующий параметру // strCurrentFund. // Если параметр пустой или не найден, выбор не делаем. int iPos = pListBox->FindStringExact( -1, strCurrentFund ); pListBox->SetCurSel( iPos );
Просмотрите код функции и постарайтесь понять, как она работает.
Функцию UpdateFundList() вызывает функция LoadData(), которая в окончательном варианте будет
загружать данные из текстового файла. А пока ограничимся тем, что поместим в список несколько фиксированных записей. - Pеализация функции STUploadDoc::LoadData().
- На вкладке ClassView щелкните правой кнопкой мыши узел STUploadDoc. В диалоговом окне
Add Member Function в раздел protected объявления класса добавьте объявление функции, которое
должно выглядеть следующим образом:BOOL LoadData(CStdioFile & infile);
- В текст функции LoadData() добавьте следующий код:
m_DocList.AddTail( CStockData( _T("ARSC"), COleDateTime( 1999, 4, 1, 0, 0, 0 ), 22.33 )); m_DocList.AddTail( CStockData( _T("ARSC"), COleDateTime( 1999, 4, 2, 0, 0, 0 ), 25.44 )); m_DocList.AddTail( CStockData( _T("ARSC"), COleDateTime( 1999, 4, 3, 0, 0, 0 ), 23.55 )); m_DocList.AddTail( CStockData( _T("ARSC"), COleDateTime( 1999, 4, 4, 0, 0, 0 ), 27.66 )); m_DocList.AddTail( CStockData( _T("ARSC"), COleDateTime( 1999, 4, 5, 0, 0, 0 ), 28.77 )); m_DocList.AddTail( CStockData( _T("BBIC"), COleDateTime( 1999, 4, 1, 0, 0, 0 ), 15.33 )); m_DocList.AddTail( CStockData( _T("BBIC"), COleDateTime( 1999, 4, 2, 0, 0, 0 ), 16.44 )); m_DocList.AddTail( CStockData( _T("BBIC"), COleDateTime( 1999, 4, 3, 0, 0, 0 ), 13.55 )); m_DocList.AddTail( CStockData( _T("BBIC"), COleDateTime( 1999, 4, 4, 0, 0, 0 ), 14.66 )); m_DocList.AddTail( CStockData( _T("BBIC"), COleDateTime( 1999, 4, 5, 0, 0, 0 ), 12.77 )); m_DocList.AddTail( CStockData( _T("COMP"), COleDateTime( 1999, 4, 1, 0, 0, 0 ), 15.33 )); m_DocList.AddTail( CStockData( _T("COMP"), COleDateTime( 1999, 4, 2, 0, 0, 0 ), 16.44 )); m_DocList.AddTail( CStockData( _T("COMP"), COleDateTime( 1999, 4, 3, 0, 0, 0 ), 18.55 )); m_DocList.AddTail( CStockData( _T("COMP"), COleDateTime( 1999, 4, 4, 0, 0, 0 ), 21.66 )); m_DocList.AddTail( CStockData( _T("COMP"), COleDateTime( 1999, 4, 5, 0, 0, 0 ), 19.77 )); // Обновляем главное окно UpdateAllViews( NULL ); // Обновляем диалоговое окно CMainFrame * pWnd = dynamic_cast< CMainFrame * > (AfxGetMainWnd()); if( pWnd ) { pWnd->UpdateFundList( m_DocList ); // Отображаем окно со списком после загрузки новых данных pWnd->SetFundsVisible( TRUE ); } return TRUE;
- В начале файла CSTUploadDoc.cpp добавьте следующую строку:
#include "MainFrm.h"
- Найдите конструктор класса CSTUploadDoc. Удалите весь его код, чтобы конструктор остался пустым:
CSTUploadDoc::CSTUploadDoc() { }
- Установите курсор в конец функции CSTUploadDoc::OnDataImport(). Перед закрывающей фигурной
скобкой вставьте код для вызова функции LoadData():if(nID == IDOK) { CStdioFile aFile; LoadData(aFile); }
Теперь можно собрать приложение STUpload. Выберите в меню Data команду Import. Посредством
диалогового окна Open откройте файл Ch5Test.dat (он находится в папке STUpload). Из него
считываются записи с информацией о ценных бумагах ARSC, BBIC и СОМР. Они должны
быть перечислены в диалоговом окне Select Fund.
Текст измененного приложения можно взять здесь (58,6 Кб).
На следующем шаге мы рассмотрим обработку уведомляющих сообщний от диалогового окна Select Fund.