Создание информационно-поискового справочника на языка С/С++
Структура данных с указанием типов. Общая структурная схема программы. Алгоритмы сортировки вставками. Назначение make-файла. Функции управления программой; перемещения и корректировки введенных данных и их удаления справочника, загрузки данных из файла.
| Рубрика | Программирование, компьютеры и кибернетика |
| Вид | курсовая работа |
| Язык | русский |
| Дата добавления | 12.01.2016 |
| Размер файла | 1,3 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
- Создание информационно-поискового справочника
- Содержание
- Введение
- 1. Постановка задачи
- 2.Структура данных с указанием типов
- 3.Общая структурная схема программы
- 3.1 Назначение прототипов функций
- 4.1 Сортировка методом вставок
- 4.2 Сортировка методом Шелла
- 4.3 Сортировка методом быстрой сортировки
- 5.1Make-файл
- 5.2My.h
- 5.3Main.c
- 5.4Menu.c
- 5.5Vvod.c
- 5.6Vivod.c
- 5.7 Vstavka.c
- 5.8 SortChella.c
- 5.9 Sort.c
- 5.10Qsort.c
- 5.11Qsort1.c
- 5.12Del.c
- 5.13Per.c
- 5.14Cor.c
- 5.15Save.c
- 5.16New.c
a. В программе реализованы следующие функции:
b. Создание справочника в памяти (Ввод данных).
c. Вывод справочника на экран.
d. Сортировка методом вставок по полю строкового типа.
e. Сортировка методом Шелла по числовому полю.
f. Сортировка методом быстрой сортировки по числовому полю.
g. Удаление данных с указанным номером.
h. Перемещение указанной записи на новую позицию.
i. Корректировка данных с указанным номером.
j. Сохранение справочника в файле.
k. Задание нового имени файла для открытия.
l. Выход из программы.
2. Структура данных с указанием типов
Структура — это совокупность переменных, объединенных под одним именем. С помощью структур удобно размещать в смежных полях связанные между собой элементы информации. Объявление структуры создает шаблон, который можно использовать для создания ее объектов (то есть экземпляров этой структуры). Переменные, из которых состоит структура, называются членами. (Члены структуры еще называются элементами или полями).
char titile[30]; >;/*поле названия*/
float svet; /*вещественное поле*/
float Ipr; /*вещественное поле*/
float Tk; /*вещественное поле*/
float Uob; /*вещественное поле*/
3. Общая структурная схема программы
Рисунок 3.1 — Общая структурная схема программы.
3.1 Назначение прототипов функций
char menu(); прототип функции меню и возвращение символа определяющий пункт меню в соответствии с надписями в функции. При запуске программы выполняется проверка на наличие введённых аргументов, которые определяют имя файла, с которым она будет работать, или сохранять данные или файл, из которого нужно будет эти данные загрузить.
int vvod( struct baza *w ); прототип функции ввода данных в структуру baza и возвращает чиcло заполненных структур.
void vivod(int kol, struct baza *w ); прототип функции вывода данных на экран .
void per(struct baza *b ); прототип функции перемещения указанной записи.
void cor(int kol, struct baza *w ); прототип функции корректировки записи по справочнику в функцию передаются два аргумента число структур заполненных и указатель структуры в котором нужно произвести поиск
void vstavka(struct baza *w, int kol); прототип функции сортировки методом вставок.
void sortChella(int kol, struct baza *w); прототип функции сортировки методом Шелла, в функцию передаются два аргумента, число элементов заполненных и указатель на структуру которую надо отсортировать
void save(int kol, struct baza *w, char *name ); прототип функции сохранения, принимают число элементов, указатель структуры и имя файла в который нужно cохранить данные.
int new(int kol, struct baza *w, char *name); прототип функции задания нового имени файла для открытия, принимает число элементов, указатель на структуру которую предаем в функцию из файла c имени name.
int del (int kol,struct baza *w); прототип функции удаления элемента из справочника переданного в функцию и возвращает число элементов структур.
void sort( int kol, struct baza *w ); прототип функции методом быстрой сортировки, в функцию передаются два аргумента, число элементов заполненных и указатель на структуру которую надо отсортировать.
4. Описание специальных алгоритмов
4.1 Сортировка методом вставок
· эффективен на небольших наборах данных;
· эффективен на наборах данных, которые уже частично отсортированы;
· это устойчивый алгоритм сортировки (не меняет порядок элементов, которые уже отсортированы);
· может сортировать список по мере его получения;
На каждом шаге алгоритма мы выбираем один из элементов входных данных и вставляем его на нужную позицию в уже отсортированном списке, до тех пор, пока набор входных данных не будет исчерпан. Метод выбора очередного элемента из исходного массива произволен; может использоваться практически любой алгоритм выбора. Обычно (и с целью получения устойчивого алгоритма сортировки), элементы вставляются по порядку их появления во входном массиве.
4 .2 Сортировка методом Шелла
Сортировка Шелла — алгоритм сортировки, являющийся усовершенствованным вариантом сортировки вставками. Идея метода Шелла состоит в сравнении элементов, стоящих не только рядом, но и на определённом расстоянии друг от друга. Невзирая на то, что сортировка Шелла во многих случаях медленнее, чем быстрая сортировка, она имеет ряд преимуществ:
· отсутствие потребности в памяти под стек;
· отсутствие деградации при неудачных наборах данных;
Алгоритм состоит в том, что исходная последовательность разделяется на ряд групп, каждая из которых упорядочивается методом простой вставки. В процессе упорядочивания размеры групп возрастают до тех пор, пока все элементы не войдут в упорядоченную группу. Группой называется подмножество элементов последовательности, номера которых образуют арифметическую прогрессию с разностью d (d называется шагом группы).
4.3 Сортировка методом быстрой сортировки
Достоинства:
· Один из самых быстродействующих (на практике) из алгоритмов внутренней сортировки общего назначения.
· Прост в реализации.
Алгоритм состоит в том, что выбирается некоторый опорный элемент из массива, запускается рекурсивная процедура разделения массива, которая перемещает все значения, меньшие, либо равные элементу, влево от него, а все значения, большие, либо равные элементу — вправо (теперь массив состоит из двух подмножеств), для обоих подмассивов рекурсивно запускается та же процедура.
алгоритм файл программа справочник
5. Листинг функций программы
5.1 Make -файл
makefile
svet: main.o cor.o del.o menu.o new.o per.o qsort.o qsort1.o save.o sort.o sortChella.o vivod.o vstavka.o vvod.o
gcc main.o cor.o del.o menu.o new.o per.o qsort.o qsort1.o save.o sort.o sortChella.o vivod.o vstavka.o vvod.o -o svet
Технология создания форм для работы со справочниками
Для начинающих, да и не только, программистов зачастую большой проблемой является создание однотипных форм для работы со справочниками и тому подобных задач. По крайней мере большое количество вопросов как на форумах так и лично, об этом свидетельствует. Поэтому и по просьбе одного из своих друзей я решил посвятить отдельную статью вопросу организации работыс формами — и в частности организации работы с однотипными формами. Ведь в крупных проектах не редкость огромное количество различных справочников — таких как справочники должностей, справочники подразделений, справочники типов выплат и несть им числа. Мало того, в процессе эксплуатации программы не редкость дополнительный рост числа справочников — что само по себе доставляет. Как же с этим бороться? Ответ на это я попытаюсь дать в своей статье. Хочу обратить внимание, что приведенные рекомендации основываются на личном практическом опыте разработки крупных программных систем. В статье будут рассмотрены две основные темы
- Использование в работе шаблон проектирования Модель-Представление-Контроллер (MVС)
- Динамическое создание форм, как это делаю я.
Эти две темы практически не отделимы друг от друга — по одной простой причине — если вы не пользуетесь MVС, рано или поздно, в сравнительно большом проекте, вы начнете писать жуткий «макаронный» код, в котором будете путаться сами. Что бы этого избежать — используйте хорошие шаблоны программирования.
Все примеры, которые приведены в данной статье опираются на средства разработки компании Borland — Borland Builder C++, но по сути могу применяться в любой системе вне зависимости от языка программирования. BCB используется здесь только потому, что на нем пишет человек, который попросил написать данную статью.
И так MVС. Что это такое, с чем ее едят и почему именно вам надо этот шаблон использовать? Все очень просто. основной принцип использования MVС заключается в разделении кода — если вы разделяете код, который получает данные из базы, от кода коорый эти данные обрабатывает и отдельно формируете код, который результат этой обработки показывает — поздравляю — вы используете MVС. Большинство удачных программных инструментов спроектировано таким образом, что следовать этому шаблону в них достаточно просто, легко и интуитивно понятно. Но как раз таки BCB и Delphi к таким системам не относятся (за что, я думаю, их создатели будут гореть в Аду — в специально для них созданном 10 круге), потому что в них чрезвычайно просто и легко писать «макаронный» быдлокод — когда все получение данных, их обработка и вывод запихивается в один единственный класс единственной формы, на которую горе программист накидал под сотню контролов — и весь этот, с позволения сказать, код размером в несколько тысяч строк компилируется в исполнимый файл и гордо называется «продуктом».
В принципе ничего конечно страшного в этом нет — если конечно не вам это все в последствии обслуживать и поддерживать. Потому что, в процессе обслуживания и поддержки работающей программы так или иначе приходится ее расширять, дорабатывать и… и вот тут то наступает армагедец. Потому что, через несколько месяцев уже плохо помниться зачем была написана та функция — которая вызывается по 20 раз в разных местах, и почему в некоторых местах в место этой функции вызывается совершенно другой код…ну и так далее. Те, кому приходилось поддерживать «продукты» жизнедеятельности таких вот «программистов» меня поймут.
Как реализовать все это на практике? Спроектируем небольшой модуль системы — предположим наш модуль будет реализовать следующую функциональность:
- Вывод и отображение записей различных справочников.
- Добавление, редактирование и удаление выбранных записей.
- Предоставление единого интерфейса для получения записей справочников (списки, деревья и пр.) в любой точке приложения.
Для начала вполне достаточно. Если использовать стандартный подход — то обычно создается форма, туда запихиваются нужные контролы и компоненты — потом создаются еще форма(а зачастую и не одна) для редактирования и добавления. Выборка данных из справочников выполняется в каждой точке приложения независимо.
Как это сделать с точки зрения MVС? Необходимо спроектировать четыре класса — класс-контроллер, класс доступа к данным, класс-форма основная и класс-форма добавления редактирования. Так как справочник по-английски Reference то соответственно классы лично я именую следующим образом:
- TRefernceController — класс контроллера, наследует от общего класса контроллера (если нужно);
- TmfMain — класс основной формы, наследует от TForm (BCB);
- TfmAddEdit — класс вспомогательной формы, наследует от TForm (BCB);
- TdmMain — модуль данных, наследует от TDataModule (BCB).
Естественно, наследование классов зависит от вашего конкретного приложения — я взял простейший вариант, что бы не слишком углубляться и не путаться. Название модулей — тоже зависит от того, какая система наименований принята у вас. Например, TmfMain — у меня имеет название любая основная форма модуля, но впрочем, это детали и я оставляю это на ваше рассмотрение.
Объевление класса контроллера может выглядеть примерно таким образом:
#ifndef loginH
#define loginH
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <Buttons.hpp>
#include <ExtCtrls.hpp>
#include "main.h" //подключаем заголовочные файлы форм
#include "addedit.h"class TReferenceController : public TGlobalController //если нужно, наследуем от своего общего класса
{
TfmMain * fmMain ;
TfmMain * dmMain ;
. //другие закрытые объявления
public :
__fastcall TRefernceController ( TConnection * db ) ;
void __fastcall getList ( TStrings * list, const int index ) ;
. //другие открытые методы
} ;
#endifКак видим ничего особо сложного тут нет. Конкретная реализация контроллера зависит от задач приложения, но суть от этого не меняется — задача класса — обеспечивать всю работу с объектами, скрывая от пользователя-приложения все детали и тонкости. Основной момент — в конструктор класса я передаю указатель на существующее в приложении подключение — что бы было чем инициализировать модуль подключения к БД.
Класс модуля данных, в свою очередь, обеспечивает подключение к БД, получение необходимых данных, операции создания, редактирования и удаления данных в таблицах.
Его объявление может выглядеть примерно таким образом:
//—————————————————————————
class TdmMain : public TDataModule
{
__published : // IDE-managed Components
TADOConnection * adoConnect ;
TDataSource * dsListOrder ;
TADOQuery * adoListOrder ;
private : // User declarations
int UserId ;
//другие закрытые методы и свойства
public : // User declarations
__fastcall TdmMain ( TComponent * Owner, const bool visibleForm = true ) ;
__fastcall TdmMain :: TdmMain ( TComponent * Owner, TConnection * db ) ;
void __fastcall getListReference ( TStrings * list ) ;
//другие открытые методыВ описании форм нет ничего особенного, поэтому код приводить считаю тут излишним.
Общий алгоритм выглядит следующим образом:
- Приложение инициализирует модуль;
- Создает объект класса TReferenceController, путем вызова его конструктора и передав ему указатель на открытое соединение с БД;
- В качестве параметров конструктора создается объект модуля данных;
- Если установлен флаг создания формы — создаем форму.
Пример кода конструктора контроллера:
Думаю основная идея вполне понятна. Естественно, использование MVC немного усложняет жизнь на первом этапе — но зато значительно упрощает ее в дальнейшем.
Если же, идея с использованием контроллера все же вам кажется чересчур сложной — вы можете использовать упрощенный вариант — две формы и модуль данных. В таком случае получение, обработка и запись данных реализуется в модуле данных (dmMain) и соответственно там располагаются все компоненты для работы с БД. Формы в свою очередь реализуют отображение и обработку ввода данных.
И здесь основная проблема у начинающих возникает с тем, как создать динамически форму и передать ей нужные данные. Делается это следующим образом. Предположим что у нас в базе содержатся таблицы-справочники следующего вида:
CREATE TABLE [ dbo ] . [ Spr_Podr ] (
[ Kod ] [ int ] IDENTITY ( 1 , 1 ) NOT NULL , автоинкрементный
[ KodMR ] [ int ] NULL , код места работы
[ MR ] [ nvarchar ] ( 150 ) COLLATE Cyrillic_General_CI_AS NULL , название места работы
[ prMR ] [ nvarchar ] ( 250 ) COLLATE Cyrillic_General_CI_AS NULL , название места работы для формирования приказа
[ arh ] [ int ] NOT NULL признак записи в архиве 0 или 1
) ON [ PRIMARY ]CREATE TABLE [ dbo ] . [ Spr_Slugb ] (
[ Kod ] [ int ] IDENTITY ( 1 , 1 ) NOT NULL , автоинкрементный
[ KodPodr ] [ int ] NULL , код службы ( отдела )
[ Podr ] [ nvarchar ] ( 250 ) COLLATE Cyrillic_General_CI_AS NULL , название службы ( отдела )
[ arh ] [ int ] NOT NULL признак записи в архиве 0 или 1
) ON [ PRIMARY ]CREATE TABLE [ dbo ] . [ Spr_PodPodr ] (
[ Kod ] [ int ] IDENTITY ( 1 , 1 ) NOT NULL , автоинкрементный
[ KodPPodr ] [ int ] NULL , код подотдела
[ PodPodr ] [ nvarchar ] ( 255 ) COLLATE Cyrillic_General_CI_AS NULL , название подотдела
[ arh ] [ int ] NOT NULL признак записи в архиве 0 или 1
) ON [ PRIMARY ]CREATE TABLE [ dbo ] . [ SprDolg ] (
[ id ] [ int ] IDENTITY ( 1 , 1 ) NOT NULL , автоинкрементный
[ Kod ] [ int ] NULL , код должности
[ Dolg ] [ nvarchar ] ( 150 ) COLLATE Cyrillic_General_CI_AS NULL , название должности
[ Dolg_K ] [ nvarchar ] ( 150 ) COLLATE Cyrillic_General_CI_AS NULL , название должности для карточки
[ K_go ] [ nvarchar ] ( 150 ) COLLATE Cyrillic_General_CI_AS NULL , название должности — кого
[ K_mu ] [ nvarchar ] ( 150 ) COLLATE Cyrillic_General_CI_AS NULL , название должности — кому
[ K_m ] [ nvarchar ] ( 150 ) COLLATE Cyrillic_General_CI_AS NULL название должности — ким
[ arh ] [ int ] NOT NULL признак записи в архиве 0 или 1
) ON [ PRIMARY ]как видно, в целом справочники похожи — они отличаются только количеством текстовых полей, которые записываются и читаются в БД, т.е. три поля во всех справочниках однотипны — это поля id (Kod), Kod*, arh — первые два — числовые значения, последнее — может содержать либо 0 либо 1. Поле id автоинкремент — т.е. поле ввода ему не нужно, оно может только отображаться. Хотя бывают задачи, когда нужно иметь возможность устанавливать его вручную, тогда нужно реализовывать отдельную операцию — но в данном случае нет такой необходимости. Поле Kod пользователь должен иметь возможность устанавливать руками — т.е. для него мы предусматриваем отдельное текстовое поле ввода. Для поля arh нам достаточно чекбокса — так как оно может иметь только два значения. И как минимум, в каждом справочнике должно быть хотя бы одно текстовое поле. Структура конечно так себе, тут ничего не скажешь. Человек который ее проектировал — сложной судьбы человек, мягко говоря. 🙂 Но тут я не буду останавливаться на принципах проектирования БД, скажу только, что если вы реализуете подобное — старайтесь соблюдать единообразие. Если во всех справочниках присутствует однотипные поля — используйте для них и одинаковые названия. Не должно в одной из таблиц ключевое поле в одном случае Kod а во втором id. Не усложняйте сами себе жизнь.
Что бы нормально работать со справочниками — я бы рекомендовал добавить в БД две дополнительные таблицы, задача которых — хранить метаданные для отображения. В первой из них храните идентификатор справочника, название таблицы справочника, возможно название справочника для отображения (если система одноязычная, либо название для языка по умолчанию) и другие параметры, которые возможно вам понадобятся, а во второй таблице соответственно идентификатор записи, идентификатор справочника, имя поля и название поля для отображения. Ну и другие параметры, которые помогут вам настраивать отображение каждого из полей.Таблицы естественно должны быть связаны по идентификатору справочника. Если вы сердцем чуете что естественные ключи лучше чем искусственные — можете использовать в качестве ключа название таблицы справочника. Это на любителя.
В таком случае для каждого справочника задача упрощается максимально. После того, как таблицы созданы и заполнены — следующий шаг — создание основной формы. Помните, выше мы говорили о контроллере — так вот проще всего делать это через него. Если же эта модель вам кажется слишком сложной — то можно обойтись и без этого. В первую очередь определяемся — как будет происходить загрузка наших данных. Так как справочников может быть один и больше — используем TPageControl. Располагаем его на форме, называем pcMain, настраиваем нужные параметры. В принципе ничего особо сложного в этом нет — поэтому все дальнейшее я буду иллюстрировать кодом.
Код основной формы:
#include <vcl.h>
#pragma hdrstop#include "mainfm.h"
#include "addedit.h"
//—————————————————————————
#pragma package(smart_init)
#pragma resource "*.dfm"
TfmMain * fmMain ;
//—————————————————————————
__fastcall TfmMain :: TfmMain ( TComponent * Owner )
: TForm ( Owner ) ,dmMain ( Owner )
{
//тут пишете код, в котором инициализируете подключение к БД. Если БД уже подключена — используется другой конструктор
}
__fastcall TfmMain :: TfmMain ( TComponent * Owner, TADOConnection * db )
: TForm ( Owner ) ,dmMain ( Owner,db )
{
dmMain — > loadPages ( this — > pgMain ) ;
dmMain — > loadReference ( getCurrentGrid ( ) ) ;
}//—————————————————————————
TDBGrid * __fastcall TfmMain :: getCurrentGrid ( )
{
if ( pgMain — > ActivePageIndex == — 1 ) return ;
TDBGrid * db = NULL ;
for ( int i = 0 ; i < this — > ComponentCount ; ++ i ) {
if ( this — > Components — > ClassName ( ) ! = "TDBGrid" ) continue ;
db = dynamic_cast < "TDBGrid" > ( this — > Components ) ;
if ( db — > Parent == pgMain — > ActivePage ) break ;}
return db ;
}
void __fastcall TfmMain :: pgMainChange ( TObject * Sender )
{
dmMain — > loadReference ( getCurrentGrid ( ) ) ;
}
//—————————————————————————
void __fastcall TfmMain :: FormDblClick ( TObject * Sender )
{
TStringList * ls ;
TfmAddEdit * fm ;
try {
fm = new TfmAddEdit ( NULL ) ;
//получаем перевичный ключ
fm — > id = dmMain — > adoQuery — > Fields — > FieldByNumber ( 0 ) — > AsInteger ;
//тут получаем параметры наших полей из доптаблицы в список
ls = new TStringList ;
dmMain — > loadReferenceFields ( ls ) ;
//тут обрабатываем наш список — как создавать объекты и инициализировать их параметры
// показано выше. не забывайте проверять высоту формы и высоту объектов
.
}
__finally {
if ( fm ) delete fm ;
if ( ls ) delete ls ;
}//—————————————————————————
class TdmMain : public TDataModule
{
__published : // IDE-managed Components
TADOConnection * adoConnect ;
TADOQuery * adoQuery ;
TDataSource * dsQuery ;
TADOQuery * adoExecute ;
private : // User declarations
public : // User declarations
__fastcall TdmMain ( TComponent * Owner ) ;
__fastcall TdmMain ( TComponent * Owner, TADOConnection * db ) ;
void __fastcall loadPages ( TPageControl * pg, const int index = 0 ) ;
void __fastcall loadReference ( TDBGrid * gb ) ;
void __fastcall loadReferenceFields ( TStrings * ls ) ;
} ;
//—————————————————————————
extern PACKAGE TdmMain * dmMain ;
//—————————————————————————
#endif
//—————————————————————————#include <vcl.h>
#pragma hdrstop}
void __fastcall TdmMain :: loadPages ( TPageControl * pg, const int index )
{
TTabSheet * tab ;
adoExecute — > SQL — > LoadFromFile ( "loadreferense.sql" ) ;
adoExecute — > Active = true ;
while ( ! adoExecute — > Eof ) {
tab = new TTabSheet ( pg ) ;
tab — > Name = adoExecute — > FieldByName ( "tablename" ) — > AsString ;
//так же настраиваем другие параметры если надо
TDBGrid * grid = new TDBGrid ( tab ) ;
grid — > Name = "gd" + tab — > Name ;
grid — > Parent = tab ;
grid — > Tag = adoExecute — > FieldByName ( "referenceid" ) — > AsInteger ;
grid — > Align = alClient ;
grid — > OnDblClick = fmMain — > OnDblClick ; //устанавливаем обработчик двойного клика
adoExecute — > Next ( ) ;
}
if ( pg — > PageCount > index ) pg — > ActivePageIndex = index ;
else pg — > ActivePageIndex = 0 ;
}
void __fastcall TdmMain :: loadReference ( TDBGrid * gb )
{
if ( ! gb ) return ;
adoQuery — > Active = false ;
adoQuery — > LoadFromFile ( gb — > Name + ".sql" ) ;
adoQuery — > Active = true ;
gb — > DataSource = dsQuery ;
}
//—————————————————————————Как видно в коде, практически все компоненты создаются динамически, и в процессе работы я им присваиваю необходимые обработчики. Значительная часть кода опущена, так как она строится по тем же принципам, что и приведенный. Естественно в модуле данных надо реализовать сохранение изменений и т.п., но я думаю что вы с этим сможете справится сами. Ничего сложного. Кроме того — если вы обратили внимание — запросы к БД загружаются из файлов. Я считаю подобный подход более практичным — когда запросы хранятся отдельно от приложения. Хотя конечно все еще зависит от конкретных задач и от ваших предпочтений.
Надеюсь что этот материал оказался полезным — если есть вопросы, задавайте в комментариях.
Как сделать справочник на c
При разработке программы хорошим тоном является снабжение этой программы справочной системой. И чем сложнее программа, тем более необходимой оказывается справочная система.
Имеется много различных способов и средств для разработки справки. Рассмотрим один из них — это разработка справочной системы в виде файла с расширением chm при помощи бесплатной программы HTML Help Workshop фирмы Microsoft.
Формат CHM ( Compiled HTML — скомпилированный HTML) широко используется фирмой Microsoft для создания справочных файлов к своим продуктам.
При разработке справочной системы есть смысл придерживаться следующего порядка:
продумать общую схему справочной системы, т.е. какие темы должны быть отражены в справке;
написать все тексты по пунктам справки. Использовать лучше обычный текстовый редактор, например Writer из OpenOffice.org (OOO);
готовые тексты конвертировать в формат html . В ООО для этого достаточно выбрать пункт меню Файл/Сохранить как и сохранить в формате html (тип файла — Документ HTML );
создать новый проект справочной системы и включить в него тексты справки в формате html .
Рассмотрим последний пункт более подробно.
Создание нового проекта
Создать новый проект очень просто. Рассмотрим этот процесс по шагам:
Запускаем программу HTML Help Workshop:

Выбираем пункт меню File/New и в открывшемся окне диалога New выбираем строку Project и нажимаем на кнопку OK .
Появится первое окно мастера. В нём нам нечего делать, поэтому сразу нажимаем клавишу Далее .
Во втором окне мастера задаём имя проекта, например HelpAlfa, и определяем папку, где будет находится этот проект. Лучше всего указать ту же папку, где хранятся ранее созданные файлы справки в формате html .
В третьем окне мастера можно сразу же добавить файлы справки в проект, но лучше это сделать позже без использования мастера. Поэтому опять нажимаем кнопку Далее .
В последнем окне остаётся только нажать кнопку Готово .
Всё, проект создан. Он имеет расширение hhp . Так будет выглядеть окно программы HTML Help Workshop:

Сохраним файл проекта.
Добавление новых файлов справки
Во вкладке Project нажимаем вторую сверху кнопку Add/Remove topic files ( Добавление/Удаление файлов разделов ). Открывается окно Topic Files , нажимаем на кнопку Add и в окне диалога выбираем нужные файлы для нашей справки в формате html . В конце необходимо нажать на кнопку OK для подтверждения своего выбора. Для удаления ненужных файлов служит кнопка Remove .
Теперь в основном окне вкладки Project кроме секции [OPTIONS] появилась секция [FILES] с перечнем тех файлов, что мы только-что выбрали:

Создание оглавления
После того, как все файлы справки добавлены в проект, можно приступить к созданию оглавления. Выполним следующие действия:
В окне файла проекта выбираем вкладку Contents . В появившемся окне диалога выбираем пункт Create a new contents file ( Создание нового файла оглавления ) и нажимаем кнопку OK .
В открывшемся стандартном диалоге Сохранить как задаём имя файла оглавления. Оно получит расширение hhc . Я дал оглавлению имя Oglavlenie. В папке с проектом справки был создан файл Oglavlenie.hhc.
После этого будет открыта вкладка Contents , имеющая свой набор инструментов, расположенных слева:

Теперь самое важное: необходимо связать пункты оглавления с соответствующими им файлами справки (для «книги» это не всегда требуется, а для «страницы» это обязательно).
Добавление «книги». На панели инструментов щелкаем по кнопке Insert a heading , открывается окно Table of Contents Entry ( Вход в таблицу оглавления ) и в поле Entry title ( Заголовок входа ) набираем текст, например «Часть 1» и сразу нажимаем OK , если «книга» не имеет собственного текста. Если для неё нужен свой текст, то нажимаем кнопку Add , затем Browse , выбираем имя файла и нажимаем кнопку OK , а затем снова OK .
Добавление «страницы. Щелкаем по кнопке Insert a page , также открывается окно Table of Contents Entry и в поле Entry title набираем поясняющий текст, например, «Введение», затем нажимаем кнопку Add , затем Browse , выбираем имя файла и нажимаем кнопку OK , а затем снова OK .
И так последовательно заводим всё оглавление. Как видим, всё достаточно просто.
Редактирование оглавления
Выделив необходимый пункт оглавления, его можно отредактировать.
Прежде всего, необходимо убедится в правильности следования пунктов оглавления. Для перестановки вверх служит кнопка Move selection up ( Переместить выделенное вверх ), для перестановки вниз — Move selection down ( Переместить выделенное вниз ).
Затем с помощью кнопок Move selection right ( Переместить выделенное вправо ) и, при необходимости, — Move selection left ( Переместить выделенное влево ), определяем вложенность пунктов оглавления.
Внешний вид значка для «книги» можно подредактировать. Выделяем нужный объект («книга»), нажимаем кнопку Edit selection , открываем вкладку Advanced и в списке Image index вместо auto выбираем, к примеру, 1 (Внимание! «Книга» не должна быть пуста, т.е. в неё должна входить хотя бы одна страница).
Пример того, что может получиться.

А вот так справочная система будет выглядеть в работе:

Выходной файл будет иметь имя HelpAlfa.chm.
Создание предметного указателя
Предметный указатель, по своей сути, является альтернативой оглавлению. Есть смысл создавать предметный указатель только в том случае, когда справочная система велика, и поиск по оглавлению получается долгим.
Порядок создания предметного указателя аналогичен порядку создания оглавления. Рассмотрим это по шагам:
В окне проекта щёлкаем по вкладке Index . В появившемся окне выбираем пункт Create a new index file и нажимаем на кнопку OK .
В открывается окне диалога Сохранить как задаём имя индексного файла. Можно согласиться с тем, что идёт по-умолчанию: Index.hhk. Окно проекта будет выглядеть так:

На вертикальной панели инструментов щёлкаем по второй сверху кнопке — Inset a keyword ( Вставить ключевое слово ). На экране появится окно Index Entry ( Вход указателя ).
В поле Keyword ( Ключевое слово ) набираем необходимое ключевое слово, например, «Функции». Именно в таком виде это слово будет показываться во вкладке Указатель панели навигации справочника.
Теперь необходимо связать ключевое слово с разделом справочника. Нажимаем кнопку Add ( Добавить ), в новом окне нажимаем кнопку Browse ( Выбор ) и указываем имя файла. Здесь же необходимо заполнить поле Title .
Таким же образом заполняем информацию для остальных ключевых слов.
Редактирование предметного указателя
Предметный указатель можно упорядочить — кнопка Sort keywords alphabetically ( Сортировать в алфавитном порядке ).
Есть и другие возможности по редактированию предметного указателя, но на них мы не останавливаемся.
Подключение файла со справочной системой к программе на C#
После создания файла справки, его необходимо подключить к нашей программе. Всё рассмотрим на элементарном примере. Пусть имеется простейшая программа с пунктами меню Файл/Выход и Помощь/Справка . Создадим для них необходимые обработчики.
Как сделать справочник на c
Профиль
Группа: Участник
Сообщений: 2
Регистрация: 3.4.2009Репутация: нет
Всего: нетРебят подскажите
Как сделать само дерево, чтоб можно было использовать в качестве поиска по базе данных?Let's do some .NET
Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-ПетербургРепутация: 18
Всего: 67Профиль
Группа: Участник
Сообщений: 2
Регистрация: 3.4.2009Репутация: нет
Всего: нет- Что же такое .NET? Краткое описание,изучаем.
- Какой язык программирования выбрать? выбираем.
- C#. С чего начать? начинаем.
- Защита исходного кода .NET приложений, защищаем.
- Литература по .NET, обращаемся.
- FAQ раздела,ищем здесь.
- Архиполезные ссылки:www.connectionstrings.com, www.pinvoke.net, www.codeproject.com
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) 0 Пользователей: « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » [ Время генерации скрипта: 0.1025 ] [ Использовано запросов: 21 ] [ GZIP включён ]