Пишем программу для создания книг FB2 - [4]
begin
if not BookHaveName then // проверяем, все ли в порядке в заголовке
begin // если нет, то происходит все то что Вы видели
PageControl1.ActivePageIndex:= 0;
ShowMessage('Fill the form.');
exit;
end;
SaveDialog1.FileName:= form1.FB2_file.Text;
if SaveDialog1.Execute then
Make_fb2(SaveDialog1.FileName);
end;
// конец кода
Посмотрим на процедуру BookHaveName
// начало кода
function BookHaveName: boolean;
begin
with Form1 do
result:= (book_title.Text <> '') and
(FB2_file.Text <> '') and
(GenresBox.Count > 0);
end;
// конец кода
Ничего особенного в этой функции нет. Единственно из-за чего я ее вытащил, это сказать, что Вы можете и скорее даже будете вынуждены, как-то изменить ее, чтобы контроль заполнения заголовка книги был более разумным.
А я пока вернусь к заполнению заголовка.
В программе Вы видите три закладки Title-info, Document-info и Publish-info. В формате FB2 есть еще кое-что, но я пока это игнорировал. Предоставляю Вам такую возможность. Код Вам в руки…
Итак Title-info
Поле Project - само заполнится при открытии текстового файла. При желании, Вы можете изменить, имя сохраняемого fb2 файла.
Поле 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];
OutList.Add(' '+IntToStr(i+1)+'
OutList.Add('
'+S+'
');OutList.Add('');
end;
OutList.Add('');
end;
// конец кода
Согласитесь, что здесь все просто, просматриваем список сносок и соблюдаем формат FB2. Но остается один маленький вопрос, а что если нам нужно будет вывести многострочную (точнее много абзачную) сноску. Да, возникает вопрос, приходят и варианты решения…
Ладно, кое-что в коде я пропустил. Но основные недостатки программы, я кажется описал. Правда, наверняка есть ляпы, которые я не заметил…
Наконец файл книги в формате FB2 создан.
На этом все? Ну нет, сейчас все авторы заканчивают книги словами "Продолжение следует". И я замыслил по крайней мере одно продолжение. Мне кажется оно просто необходимо.
![Извлекаем архив из fb2](/build/oblozhka.dc6e36b8.jpg)
Книга предназначена студенту, писавшему программы только в качестве курсовых, "сдавшему" Delphi и несмотря на это, желающему стать программистом. Это, не сборник готовых рецептов, автор хочет поставить читателя в условия максимально приближенные к рабочим. Мы вместе напишем программу, пройдя через ошибки, и сомнения к окончательной победе...
![Рекурсия](/build/oblozhka.dc6e36b8.jpg)
Книга предназначена студенту, писавшему программы только в качестве курсовых, "сдавшему" Delphi и несмотря на это, желающему стать программистом. Это, не сборник готовых рецептов, автор хочет поставить читателя в условия максимально приближенные к рабочим. Мы вместе напишем программу, пройдя через ошибки, и сомнения к окончательной победе...
![Английский по методу w_cat](/storage/book-covers/83/837cace9f50ddf7adf5c27240ed0a4dcc46185e8.jpg)
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
![Графика для Windows средствами DirectDraw](/storage/book-covers/6d/6dbc78361f37e9af5b71d5019ca64570a40e0466.jpg)
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
![Виртуальная библиотека Delphi](/build/oblozhka.dc6e36b8.jpg)
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
![Пишем драйвер Windows на ассемблере](/build/oblozhka.dc6e36b8.jpg)
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
![Как писать драйвера](/build/oblozhka.dc6e36b8.jpg)
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
![MFC и OpenGL](/build/oblozhka.dc6e36b8.jpg)
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
![Информационная технология. Оценка программной продукции характеристики качества и руководства по их применению](/build/oblozhka.dc6e36b8.jpg)
Стандарт подготовлен на основе применения аутентичного текста международного стандарта ИСО/МЭК 9126-91 «Информационная технология. Оценка программной продукции. Характеристики качества и руководства по их применению»Information technology. Software product evaluation. Quality characteristics and guidelines for their use.