Назад | Начало урока | Вперед
Содержание

Глава 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) {

DataStructZ bbc1;//экземпляр класса

};

То возникает ошибка:
Undeclared identifier bbc1.

Причем это происходит - где бы я не объявлял экземпляр
этого класса в этом файле.

Эта ошибка исчеза и программа начала выполняться правильно
только тогда,когда объявление класса и определение его
функций я перенес в файл 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 и поместить его
в строковую переменную.


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz