Чтение онлайн

на главную - закладки

Жанры

Пишем программу для создания книг FB2
Шрифт:

Процедура считывает выделенную строку из списка ListBox1, удаляет сведения о типе и записывает строку на старое место с новым стилем.

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

procedure ChangeStyle(LStyle: TmyStyle);

var

n, curIndex: integer;

S: string;

begin

with Form1.ListBox1 do

begin

curIndex:= ItemIndex; // читаем текущий индекс в списке ListBox

if curIndex = -1 then exit; // если ничего не выделено

выходим

S:= Items[curIndex]; // считываем текущую строку

n:= pos('|', s); // находим разделитель

/ / хотя это лишнее, n всегда = 4 / когда писал это еще не было ясно, утрясался формат…

// в окончательном варианте n можно удалить

delete(S, 1, n+1); // удаляем информацию о стиле

// Записывается строка с новым стилем. Приводить SetStyle не буду, она очень простенькая

Items[curIndex]:= SetStyle1(LStyle)+ S;

if ItemIndex < Items.Count - 1

then ItemIndex:= ItemIndex+1;

SetFocus; // активным снова становится список с содержимым книги.

end;

end;

// конец кода

(Одно предложение: можно, и не трудно, предоставить пользователю возможность возврата старого стиля)

Теперь о расстановке заголовков

Для этой работы предназначены три кнопки: [+] [H1] [-]. Вообще-то средняя кнопка будем менять свое название, и показывать этим текущий (в данном месте текста) стиль заголовка.

Посмотрим, как это делается:

При любом клике на ListBox вызывается процедура ShowHeadStyle ее параметром является индекс выделенной строки.

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

procedure ShowHeadStyle(n: integer);

var

LStyle: TmyStyle;

begin

LStyle:= ScanUpStyle(n); // получаем тип заголовка к которому относится эта строка

Form1.Button2.Caption:= SetStyle(LStyle); // меняем название кнопки

Form1.Button2.Tag:= integer(LStyle); // запоминаем этот стиль, чтобы потом меньше возиться.

end;

// конец кода

Теперь посмотрим, как мы получаем информацию о стиле.

Элементарно, Ватсон!

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

function ScanUpStyle(n: integer):TmyStyle;

var

i: integer;

LStyle: TmyStyle;

begin

with Form1.ListBox1 do

for i:= n downto 0 do

begin // просматриваем список от заданной строки вверх

GetStyle(Items[i], LStyle); // получаем стиль строки

if LStyle in [H1..H5] then

begin // если стиль строки заголовочный

result:= LStyle; // записываем его в результат

exit; // и выходим, нечего больше время терять!

end;

end; // если дошли до начала списка, а заголовков не найдено…

result:= H1; // присваиваем тип

заголовка H1

end;

// конец кода

Устанавливаем стиль заголовка

Выбираем строку в тексте

И если указанный на кнопке стиль подходит, нажимаем ее.

При этом вызывается процедура ChangeStyle(TmyStyle(Button2.Tag));

Параметром ее будет ранее сохраненные сведения о текущем стиле заголовка.

Процедура ChangeStyle описана ранее.

Теперь кнопки [+] и [-]

Код процедур аналогичен, разница только в одной строчке

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

procedure TForm1.Button5Click(Sender: TObject);

var // кнопка плюс

LStyle: TmyStyle;

begin

LStyle:= TmyStyle(Button2.Tag); // получаем текущий стиль

if LStyle < H5 then ChangeStyle(Succ(LStyle)); // если он не слишком велик, прибавляем единицу

// а для кнопки минус, вот эта строчка. Вычитается единичка, если есть откуда вычитать

// if LStyle > H1 then ChangeStyle(Pred(LStyle));

end;

// конец кода

Редактирование строки

Двойной щелчок на строке и открывается окно редактирования

Текст можно исправить или строку разбить на несколько. После нажатия ОК все содержимое записывается в книгу с сохранением старого стиля.

Нажатием кнопок Bold и Italic можно получить соответствующее оформление выделенного текста

(т. е. если текст не выделен ничего не произойдет).

Тут два замечания: отмена такого форматирования возможна только вручную удалением соответствующих тегов, второе, не допустимо форматирование такого вида:

<strong> <emphasis> какой либо текст </strong></emphasis>. Можно конечно отслеживать такую ошибку и программным путем, но небольшое облегчение жизни пользователя, резко усложняет жизнь программиста.

Концевые сноски.

Книга может содержать концевые сноски. Я поленился и сделал пока так: необходимые сноски записываются в файл EndNotes.txt и этот файл должен находится в папке программы.

Внимание! Каждая сноска - одна строка в файле.

В тексте книги в местах сносок надо расставить значки тильды - ~

Ударения.

В первой же книге, которую я делал, в одном слове мне потребовалось сделать ударение и поэтому пришлось ввести значок «крышки» ^

Создание FB2

Наконец добрались.

Казалось бы, что проще, бери строку за строкой и вперед…

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

with Form1.ListBox1 do

Поделиться:
Популярные книги

Адвокат Империи 3

Карелин Сергей Витальевич
3. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 3

Кротовский, может, хватит?

Парсиев Дмитрий
3. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
7.50
рейтинг книги
Кротовский, может, хватит?

Дурная жена неверного дракона

Ганова Алиса
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Дурная жена неверного дракона

Вонгозеро

Вагнер Яна
1. Вонгозеро
Детективы:
триллеры
9.19
рейтинг книги
Вонгозеро

Ведьма Вильхельма

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
8.67
рейтинг книги
Ведьма Вильхельма

Папина дочка

Рам Янка
4. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Папина дочка

Законы Рода. Том 6

Flow Ascold
6. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 6

Как я строил магическую империю 7

Зубов Константин
7. Как я строил магическую империю
Фантастика:
попаданцы
постапокалипсис
аниме
фантастика: прочее
5.00
рейтинг книги
Как я строил магическую империю 7

Лучший из худший 3

Дашко Дмитрий
3. Лучший из худших
Фантастика:
городское фэнтези
попаданцы
аниме
6.00
рейтинг книги
Лучший из худший 3

Штурмовик из будущего 3

Политов Дмитрий Валерьевич
3. Небо в огне
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Штурмовик из будущего 3

Последний попаданец 2

Зубов Константин
2. Последний попаданец
Фантастика:
юмористическая фантастика
попаданцы
рпг
7.50
рейтинг книги
Последний попаданец 2

Идеальный мир для Лекаря 14

Сапфир Олег
14. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 14

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Вдова на выданье

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Вдова на выданье