- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Интернет решения от доктора Боба - Bob Swart
Шрифт:
Интервал:
Закладка:
(FieldDefs[i].FieldClass = TVarBytesField) then
FieldTypes[i] := sf_UnKnown { ignore }
end
finally
Free
end;
2.1.4. Записи
После анализа полей таблицы, мы можем пройтись по всей таблице и получить значения полей. Для каждой записи в таблице мы сгенерируем HTML-страницу. Мы можем использовать имена полей как заголовки, используя тег <H2> для ключевых полей и тег <H3> для не ключевых полей. Код просматривает всю таблицу т преобразовывает поля в текст и выводит их в HTML-файл:
while not Eof do
begin
Inc(RecNr);
System.Assign(f,FileName+'/'+PageNr(RecNr));
System.Rewrite(f);
writeln(f,'<HTML>');
writeln(f,'<HEADER>');
writeln(f,'<TITLE>');
writeln(f,Format('%s %d/%d',[ATable,RecNr,RecordCount]));
writeln(f,'</TITLE>');
writeln(f,'</HEADER>');
writeln(f,'<BODY>');
{ print fields }
for i:=0 to Pred(FieldCount) do
if FieldTypes[i] > sf_UnKnown then
begin
if (keys >= i) then writeln(f,'<H2>')
else writeln(f,'<H3>');
writeln(f,FieldDefs[i].Name,':');
if (keys >= i) then writeln(f,'</B><BR>') { </H2> }
else writeln(f,'</B><BR>'); { </H3> }
if FieldTypes[i] = sf_Memo then
writeMemo(f,Fields[i])
else writeln(f,Fields[i].AsString);
if (keys = i) then writeln(f,'<HR>');
end;
writeln(f,'</BODY>');
writeln(f,'</HTML>');
System.Close(f);
Next
end;
Заметим, что я использую здесь одно недокументированное свойство HTML: для окончания заголовка вы можете написать </B>, но вы должны использовать <BR> для разрыва строки. Таким образом, вы можете иметь заголовки, и текст, начинающийся правее и ниже заголовка. Пожалуйста, учтите, что это недокументированное свойство и вы должны заменить его раскомментировав </H2> и </H3> если вы не желаете жить на угле <юмор>. Следующий листинг показывает как получить информацию из мемо поля базы данных и поместить его в текстовый файл. И наконец после этого мы отформатируем немного, помня что HTML игнорирует множественные переводы строки и пробелы.
procedure WriteStream(var f: Text; var Stream: TMemoryStream);
const
LF = #10;
BufSize = 8192; { bigger memos are chopped off!! }
var
Buffer: Array[0..Pred(BufSize)] of Char;
i: Integer;
begin
Stream.Seek(0,0);
if Stream.Size > 0 then
begin
Stream.Read(Buffer,Stream.Size);
for i:=0 to Pred(Pred(Stream.Size)) do
begin
{ empty line converted to <P> break }
if (Buffer[i] = LF) and (Buffer[i+1] = LF) then writeln(f,'<P>');
{ strip multiple spaces (are ignored anyway) }
if not ((Buffer[i] = ' ') and (Buffer[i+1] = ' ')) then write(f,Buffer[i]);
{ start new sentence on a new line (but only in HTML doc itself }
if (Buffer[i] = '.') and (Buffer[i+1] = ' ') then writeln(f)
end;
writeln(f,Buffer[Pred(Stream.Size)])
end
else writeln(f,' ') { empty memo }
end {WriteStream};
procedure WriteMemo(var f: Text; Field: TField);
var Stream: TMemoryStream;
begin
Stream := TMemoryStream.Create;
(Field AS TMemoField).SaveToStream(Stream);
WriteStream(f,Stream);
Stream.Free
end {WriteMemo};
2.1.5. Страницы
Теперь у нас есть метод преобразования записей в HTML страницы, нам также нужен путь уникальной идентификации каждой записи. Допустим, что база данных не не содержит более 100,000 записей (Если таблица содержит свыше 100,000 записей, то конвертирование их в HTML страницы наверно не очень хорошая идея), Я думаю что подойдет схема где каждая запись помещается в файл с именем "pag#####.htm", где ##### номер записи в базе данных. Для уменьшения конфликта имен, каждая таблица должна размещаться в своем собственном каталоге (например, BIOLIFE.HTM каталог для BIOLIFE.DB таблиц, так что мы будем иметь BIOLIFE.HTM/PAG00001.HTM для первой записи из BIOLIFE.DB таблицы).
const
FirstPage = 'pag00001.htm';
LastPage: TPageName = 'pag%.5d.htm'; { format }
function PageNr(Nr: Word): TPageName;
begin
Result := Format('pag%.5d.htm',[Nr])
end {PageNr};
Кроме первой страницы PAG00001.HTM, нам также необходимо знать имя последней страницы, и функцию, которая нам даст номер текущей страницы для номера записи.
2.1.6. HTML "Живые" клавиши
Неплохо также иметь путь для навигации по записям таблицы, для этого я использую IMAGE MAP, встроенный в HTML-страницу и работающий даже если браузер загружает локальный файл. HTML-синтаксис для отображения картинки следующий:
<IMG SRC="image.gif">
где image.gif это файл типа .GIF или .JPEG. Мы можем вставить опцию USEMAP в тег, для указания имени карты образа, например:
<IMG SRC="image.gif" USEMAP="#map">
Внутри страницы мы можем ссылаться на "#map", а в действительности на картинку. Image map ничего более чем список координат и ссылок. Переход на ссылку произойдет, мы щелкнем мышкой в указанных координатах. HTML-синтаксис карты образа, the image map выглядит как навигационная панель размером 25x125 пикселей:
<MAP NAME="map">
<AREA SHAPE="rect" COORDS="51,0,75,25" HREF="next">
<AREA SHAPE="rect" COORDS="76,0,100,25" HREF="last">
<AREA SHAPE="rect" COORDS="101,0,125,25"HREF="this">
</MAP>
Таким образом, мы можем свой навигатор по базе данных. Для этого нам необходимо иметь три картинки: одна для первой записи (клавиши первая и предыдущая запрещены), одна для последней записи (клавиши следующая и последняя запись запрещены) и одна для записей в середине таблицы (все клавиши разрешены). В каждой ситуации я назначаю ссылку для одной из клавиш на другую страницу. Это обеспечивает сильную обратную связь между нажатиями на клавиши. Конечно, клавиши не могут быть надавлены, но мы имеем очень быстрый ответ по сравнению с Java или CGI-приложениями (все что происходит это только прыжок на другую страницу).
NAVIGATL.GIF:
NAVIGAT.GIF:
NAVIGATR.GIF:
Вот код на Дельфи, который генерирует корректный образ и карту для каждой записи:
if (RecNr = 1) then { first record }
begin
writeln(f,'<IMG SRC="../images/navigatl.gif" '+
'ALIGN=RIGHT USEMAP="#map" BORDER="0">');
writeln(f,'<MAP NAME="map">');
writeln(f,'<AREA SHAPE="rect" COORDS="51,0,75,25" HREF="'+
PageNr(2)+'">');
writeln(f,'<AREA SHAPE="rect" COORDS="76,0,100,25" HREF="'+
LastPage+'">');
writeln(f,'<AREA SHAPE="rect" COORDS="101,0,125,25"HREF="'+
PageNr(RecNr)+'">');
end
else
if (RecNr = RecordCount) then { last record }
begin
writeln(f,'<IMG SRC="../images/navigatr.gif" '+
'ALIGN=RIGHT USEMAP="#map" BORDER="0">');
writeln(f,'<MAP NAME="map">');
writeln(f,'<AREA SHAPE="rect" COORDS="0,0,25,25" HREF="'+
FirstPage+'">');
writeln(f,'<AREA SHAPE="rect" COORDS="26,0,50,25" HREF="'+
PageNr(RecNr-1)+'">');
writeln(f,'<AREA SHAPE="rect" COORDS="101,0,125,25"HREF="'+
PageNr(RecNr)+'">');
end
else { middle record }
begin
writeln(f,'<IMG SRC="../images/navigat.gif" '+
'ALIGN=RIGHT USEMAP="#map" BORDER="0">');
writeln(f,'<MAP NAME="map">');
writeln(f,'<AREA SHAPE="rect" COORDS="0,0,25,25" HREF="'+
FirstPage+'">');
writeln(f,'<AREA SHAPE="rect" COORDS="26,0,50,25" HREF="'+
PageNr(RecNr-1)+'">');
writeln(f,'<AREA SHAPE="rect" COORDS="51,0,75,25" HREF="'+
PageNr(RecNr+1)+'">');
writeln(f,'<AREA SHAPE="rect" COORDS="76,0,100,25" HREF="'+
LastPage+'">');
writeln(f,'<AREA SHAPE="rect" COORDS="101,0,125,25"HREF="'+

