Глава 3
23:19 03.01.2006
Теперь перейдем снова к программированию в стиле Windows
Например на базе двух программ создадим третью,которая
впитает в себя свойства обоих программ, но будет написана
в стиле Windows.
Я имею в виду программу:
d:\ЯзыкС++\Kross01\StructClass\Упражнения1\R30_02g
Это интересная программа, которая сама находит
все 6 слов для кроссворда.
и программу:
d:\MyC++Projects\MyC++Project04\Буфер\ListBox05
Эта программа по нажатию кнопки выводит в элемент ListBox
определенный текст из текстового файла.
Мне надо чтобы в моя новая программа находила все 6 слов
для кроссворда и выводила бы кроссворд в элемент ListBox
Тогда в функции нажатия кнопки мне надо сделать код
который в настоящее время содержится в функции main()
консольной программы.Функцию вывода кроссворда на экран
надо переделать в функцию вывода кроссворда в текстовый файл.
А уже этот файл считать в элемент типа ListBox.
Сделай это!
Итак сначала надо переделать программу R30_02g так,чтобы
она выводила результат в текстовый файл.В дальнейшем из
этого текстового файла можно будет считать в ListBox
Для этого в программе R30_02g надо переделать всего
только модуль вывода
void DataStructZ::VyvodKrossv01(DataStructZ & nds)
Модуль вывода переделал смотри программу
d:\ЯзыкС++\Kross01\StructClass\Упражнения1\R30_02h
Теперь кроссворд выводится прямо в файл.
Итак наш новый проект в файле
d:\MyC++Projects\MyC++Project04\Буфер\ListBox06
9:33 04.01.2006
Столкнулся с неожиданными ошибками и нежеланием компилятора
компилировать новую программу.
------------------------------------------
Fatal Error C1010
unexpected end of file while looking for precompiled header directive
A precompiled header was specified, but it did not contain a precompiled
header directive.
This error can be caused by specifying an incorrect file as a header file.
--------------------------------------------------
Поскольку программы у меня сейчас многомодульные,то пришлось
естественно включить в проект .cpp и .h модули.
Например включаю модуль fn3.cpp и fn3.h в проект.
Е компилятор выдает такую ошибку.
Как это дело исправить?
Ошибка исчезла как только я подключил к cpp-файлу
следующую инструкцию:
#include "stdafx.h"
Причем эту инструкцию надо ставить первой в тексте.
И так надо сделать во всех новых cpp исходных файлах.
Теперь возникла еще одна ошибка:
Когда я в файле TextFontsDlg.cpp
объявляю внутри функции экземпляр класса
int CTextFontsDlg::FunFileToList(void) {
Причем это происходит - где бы я не объявлял экземпляр
этого класса в этом файле.
Эта ошибка исчеза и программа начала выполняться правильно
только тогда,когда объявление класса и определение его
функций я перенес в файл TextFontsDlg.cpp
В этом же файле и происходит объявление экземпляра класса.
Хотя согласно правил программирования такой же результат
должен происходить если мы объявление класса и определение
его функций сделаем в отдельном заголовочном файле
а потом включим этот заголовочный файл при помощи инструкции
#include
Проверь это на практике.
23:20 04.01.2006
Итак наш новый проект в файле
d:\MyC++Projects\MyC++Project04\Буфер\ListBox06
Наконец то эта программа откомпилировалась и
правильно выполняется.Хотя в окне ListBox я и
не вижу правильного кроссворда.Но это уже свойства самого
этого окна,и его функции
Стоило только объявление класса и определение
его функций перенести в отдельный заголовочный файл.
Как тут же перестала программа компилироваться
и вновь ошибка - undeclared identifier
То есть главный модуль не видит этого заголовочного файла.
9:33 05.01.2006
Ну вот и получилось.Ошибка устранена и теперь программа
работает и с заголовочным файлом.А не работала программа
потому,что не в правильном месте была расположена инструкция
#include "stdafx.h"
Было написано так и не работало :
#include "DataStructZ.h"
#include "stdafx.h"
Теперь написано так и работает правильно :
#include "stdafx.h"
#include "DataStructZ.h"
Смотри программу
d:\MyC++Projects\MyC++Project04\Буфер\ListBox07
---------------------------------------------------
Теперь надо разбить файл DataStructZ.h на DataStructZ.h
и DataStructZ.cpp, VyvodCross01.cpp, ConstDataStructZ.cpp - файлы
чтобы получились обычные модули.Здесь один заголовочный файл
играет роль заголовочного файла для все трех cpp- модулей.
Разбил файл на модули но компилятор сообщает об ошибке
при линкеровании.
Смотри программу
d:\MyC++Projects\MyC++Project04\Буфер\ListBox08
Теперь эта программа работает правильно.Проблема заключалась
в неправльном объявлении включаемых заголовочных файлов
в начале cpp -файлов.(инструкции include)
----------------------------------------------------------
В следующей программе все эти три cpp -файла объединил
в один файл - DataStructZ.cpp и заголовочный файл
DataStructZ.h оставил без изменений.
И программа откомпилировалась и работает правильно
Смотри программу
d:\MyC++Projects\MyC++Project04\Буфер\ListBox09
Не понятно в чем была ошибка в предыдущем файле?
А надо бы понять!
Проблема заключалась в неправльном объявлении
включаемых заголовочных файлов в начале cpp -файлов.
(инструкции include)
------------------------------------------------------
Ну вот все три программы работают правильно!
Какая из них лучше?
d:\MyC++Projects\MyC++Project04\Буфер\ListBox07
d:\MyC++Projects\MyC++Project04\Буфер\ListBox08
d:\MyC++Projects\MyC++Project04\Буфер\ListBox09
На мой взгляд лучше:
d:\MyC++Projects\MyC++Project04\Буфер\ListBox08
Потому что в ней сохранен принцип как и в исходной
консольной программе : один заголовочный файл DataStructZ.h
для трех cpp файлов:
DataStructZ.cpp, VyvodCross01.cpp, ConstDataStructZ.cpp.
Только надо быть внимательней с инструкциями #include
в начале всех cpp-файлов.
13:30 05.01.2006
//////////////////////////////////////////////////////////////////////////
АВ:У управляющего элемента типа List Box оказывается есть много
встроенных методов.Как я увидел из вышеприведенного кода
Например :
1.Очистить все строки из List Box:
m_ctlFontList.ResetContent();
2.По номеру строки в List присвоить ее содержимое переменной strCurFont
m_ctlFontList.GetText((iCurCount - 1),strCurFont);
То есть по сути скопировать указанную строку в объявленную переменную.
3.Получить количество строк(записей) в элементе List Box :
m_ctlFontList.GetCount()
Этот метод возвращает количество строк в элемента List Box.
4.Удалить строку номер которой указан в параметре.
m_ctlFontList.DeleteString((iCurCount - 1))
---------------------------------------------------------------
Как видно строки в элементе List Box могут быть словами.Эти слова
можно сравнивать между собой и убирать повторяющиеся слова,как
я делал это для составления словаря.
---------------------------------------------------------------
1.Мы можем поместить слово (или строку) из строковой переменной
указанной в параметре функции, в элемент List box при помощи
функции AddString()
m_ctlFontList.AddString(lpelf->elfLogFont.lfFaceName)
Здесь переменная m_ctlFontList имеет особый тип - CListBox
2.Мы можем получить слово(или строку) из List Box
и поместить ее в переменную типа string
Например функция GetText() помещает слово(или строку) находящуюся
в списке под номером указанным в первом параметре,она помещает это
слово в переменную типа string указанную во втором параметре.
// поместить одну строку (или слово)из List Box в переменную типа string
m_ctlFontList.GetText((iCurCount - 1),strCurFont);
3.Мы можем получить количество слов(или строк) находящихся в элементе
List Box при помощи функции GetCount()
//получить количество слов (или строк) в списке
m_ctlFontList.GetCount()
Этот метод возвращает количество строк в элементе List Box.
4.Мы можем удалить отдельную строку(или слово) из элемента List Box
при помощи функции DeleteString().Указав в параметре номер строки
которую мы хотим удалить.
// Удалить строку номер которой указан в параметре.
m_ctlFontList.DeleteString((iCurCount - 1))
5.Мы можем полностью очистить элемент List Box от всех слов
(или строк) которые в нем содержатся при помощи функции ResetContent()
// Очистить все строки из List Box:
m_ctlFontList.ResetContent();
----------------------------------------------------------------------
Не помню откуда взят этот материал?
Особенно мне интересны первые два пункта:
Это поместить строку из строковой переменной в строку элемента ListBox
и наоборот взять строку из элемента ListBox и поместить его
в строковую переменную.
Назад |
Начало урока |
Вверх |
Вперед
Содержание