Пишем программу (в Delphi) для создания книг FB2 - страница 5

стр.

Поле book-title действительно обязательно надо заполнить

Теперь Genre ― Жанр.

Ага, тут немного интереснее, есть о чем погуторить.

Нажимаем кнопку с тремя точками.

И открывается окошко Жанры.

Наша цель добавить один или несколько жанров в левый ListBox.

Выберите подходящий жанр в правом ListBoxсике и нажмите кнопку Add

В навигации по жанрам поможет верхний ComboBox

О коде в этом unit мне говорить лень, ничего особенного, рутина.

Интереснее, вот, что, информация для загрузки в эти Боксики находится в unit dm

Посмотрите на нее, и поругайте мою лень. Дело в том, что я не уверен, что этот список жанров правилен. Второе, этот список, очевидно, не окончателен. А значит он не должен быть жестко зафиксирован в программе.

Значит, так. Вам задание ― переписать прогу, чтобы эти списки грузились или из текстового файла или из INI файла.

Вернемся к заполнению заголовка

Нам надо ввести данные об авторе / авторах и переводчике / переводчиках

Так же нажимаем на соответствующую кнопочку с троеточием и работаем в открывшемся окне.

Вы уже наверно заметили, что мне прискучило очень уж подробно расписывать код. Но в данном unit тоже ничего особенного, единственно, пришлось ввести структуру >TPerson, я думаю Вы легко разберетесь зачем она мне нужна.

Мне интереснее, совершенствование программы. Представьте ситуацию, Вы делаете 10 книг (или 100) одного автора и каждый раз делая новую книгу, заполняете опять и опять данные об этом человеке. Мне было бы лень. Ваши предложения?…

Ну хорошо мы заполнили и Title-info и Document-info и Publish-info.

Давайте-ка глянем, что там в коде записи файла FB2.

>// начало кода

>Procedure Make_fb2(S: string);

>begin //

>if Form1.ListBox1.Items.Count = 0 then exit;

>SytleStack.Clear; // подготовка стека стилей

>OutList.Clear; // подготовка выходного списка

>SaveDescription;

>SaveBodyFB2; // это мы уже в общем рассмотрели

>SaveEndnotes;

>OutList.Add(''); // закрываем книгу

>OutList.SaveToFile(S); // Запись в файл

>showMessage('Done.'); // Сообщаем об удачном завершении

>end;

>// конец кода

Как видите мы еще не рассмотрели две процедуры.

>// начало кода

>procedure SaveDescription;

>const

>max = 5; // может я захочу изменить число строк в массиве, тогда я изменю только одну цифру

>mas: array[1.. max] of string =

>(// массив для заголовочной части FB2 файла

>'', // как видите я делаю файл в кодировке Win

>// я не вижу смысла в применении юникода, но если речь идет не о русском языке,

>// то сделайте здесь изменение.

>'

>' xmlns: l=«http://www.w3.org/1999/xlink» >',

>' ',

>' '

>);

>var i: byte;

>begin

>// Выводим в выходной файл начало FB2 файла

>for i:= 1 to max do

>OutList.Add(Mas[i]);

>// конец кода

Дальше просматриваем списки Жанров, Автором и Переводчиков и выводим оттуда информацию (если она там есть).

Т.е. проверяем все заполненные поля форм описывающих книгу и выводим информацию в соответствующие секции заголовка книги.

Будем считать, что с Description – покончили.

Осталось только

>// начало кода

>procedure SaveEndnotes;

>var

>S: string;

>i: integer;

>begin

>if Form1.EndNotesList.Items.Count = 0 then exit;

>OutList.Add('<p>Примечания</p>');

>for i:= 0 to Form1.EndNotesList.Items.Count – 1 do

>begin

>S:= Form1.EndNotesList.Items[i];

>OutList.Add('

<p>'+IntToStr(i+1)+'</p>');</code></p><p><code>>OutList.Add('

'+S+'

');

>OutList.Add('

');

>end;

>OutList.Add('');

>end;

>// конец кода

Согласитесь, что здесь все просто, просматриваем список сносок и соблюдаем формат FB2. Но остается один маленький вопрос, а что если нам нужно будет вывести многострочную (точнее много абзачную) сноску. Да, возникает вопрос, приходят и варианты решения…

Ладно, кое-что в коде я пропустил. Но основные недостатки программы, я кажется описал. Правда, наверняка есть ляпы, которые я не заметил…

Наконец файл книги в формате FB2 создан.

На этом все? Ну нет, сейчас все авторы заканчивают книги словами «Продолжение следует» . И я замыслил по крайней мере одно продолжение. Мне кажется оно просто необходимо.