Kniga-Online.club
» » » » Bob Swart - Интернет решения от доктора Боба

Bob Swart - Интернет решения от доктора Боба

Читать бесплатно Bob Swart - Интернет решения от доктора Боба. Жанр: Программирование издательство неизвестно, год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

          (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="'+

Перейти на страницу:

Bob Swart читать все книги автора по порядку

Bob Swart - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


Интернет решения от доктора Боба отзывы

Отзывы читателей о книге Интернет решения от доктора Боба, автор: Bob Swart. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*