Пишем программу (в 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('
>for i:= 0 to Form1.EndNotesList.Items.Count – 1 do
>begin
>S:= Form1.EndNotesList.Items[i];
'+IntToStr(i+1)+'>OutList.Add('
'+S+'>OutList.Add('
>OutList.Add('');
>end;
>OutList.Add('');
>end;
>// конец кода
Согласитесь, что здесь все просто, просматриваем список сносок и соблюдаем формат FB2. Но остается один маленький вопрос, а что если нам нужно будет вывести многострочную (точнее много абзачную) сноску. Да, возникает вопрос, приходят и варианты решения…
Ладно, кое-что в коде я пропустил. Но основные недостатки программы, я кажется описал. Правда, наверняка есть ляпы, которые я не заметил…
Наконец файл книги в формате FB2 создан.
На этом все? Ну нет, сейчас все авторы заканчивают книги словами «Продолжение следует» . И я замыслил по крайней мере одно продолжение. Мне кажется оно просто необходимо.