Выбрать главу

writeln('<TH><B>Author</B></TH>');

writeln('<TH><B>Publisher</B></TH>');

writeln('<TH><B>ISBN</B></TH>');

writeln('<TH><B>Level</B></TH>');

writeln('<TH>Con</TH>');

writeln('<TH>Wri</TH>');

writeln('<TH>Val</TH>');

writeln('<TH><B>Tot</B></TH>');

writeln('</TR>');

После того как заголовок написан, самое время выводить сами записи. Я не хочу сортировать их по рейтингу от 5 до 1, так что я просто иду по списку книг и печатаю каждую со своим рейтингом. Этот путь, потому что я знаю, что книги уже отсортированы по рейтингу в основной базе delbooks.db (которая отсортирована по уровню и рейтингу). Обычно книги в верху списка уже лучший ответ на заданный вопрос.

  if DataRec.Delphi2 then

  begin

    for Hits := 5 downto 1 do

    begin

      for i:=1 to Books32 do if Result32[i] = Hits then

      begin

        writeln('<TR>');

        writeln('<TD>',Roman[Hits],'</TD>');

        writeln('<TD><A HREF="',root32,Book32[i].HREF,'">',Book32[i].Title,'</A></TD>');

        writeln('<TD>',Book32[i].Author,'</TD>');

        writeln('<TD>',Book32[i].Publisher,'</TD>');

        writeln('<TD>',Book32[i].ISBN,'</TD>');

        writeln('<TD>',Level[Book32[i].Level],'</TD>');

        writeln('<TD>',Book32[i].TechnicalContentsQuality,'</TD>');

        writeln('<TD>',Book32[i].QualityOfWriting,'</TD>');

        writeln('<TD>',Book32[i].ValueForMoney,'</TD>');

        writeln('<TD><B>',Book32[i].OverallAssessment,'</B></TD>');

        writeln('</TR>')

      end

    end;

    if DataRec.Delphi1 then writeln('<TR></TR>')

  end;

  if DataRec.Delphi1 then

  begin

    for Hits := 5 downto 1 do

    begin

      for i:=1 to Books16 do if Result16[i] = Hits then

      begin

        writeln('<TR>');

        writeln('<TD>',Roman[Hits],'</TD>');

        writeln('<TD><A HREF="',root16,Book16[i].HREF,'">',Book16[i].Title,'</A></TD>');

        writeln('<TD>',Book16[i].Author,'</TD>');

        writeln('<TD>',Book16[i].Publisher,'</TD>');

        writeln('<TD>',Book16[i].ISBN,'</TD>');

        writeln('<TD>',Level[Book16[i].Level],'</TD>');

        writeln('<TD>',Book16[i].TechnicalContentsQuality,'</TD>');

        writeln('<TD>',Book16[i].QualityOfWriting,'</TD>');

        writeln('<TD>',Book16[i].ValueForMoney,'</TD>');

        writeln('<TD><B>',Book16[i].OverallAssessment,'</B></TD>');

        writeln('</TR>')

      end

    end

  end;

  writeln('</TABLE>');

  writeln('<HR>');

  writeln('<A HREF="http://www.drbob42.com">Dr.Bob''s Delphi Clinic</A>');

  writeln('</BODY>');

  writeln('</HTML>');

  writeln;

  Free

end

2.2.11. Отладка CGI

Страницу HTML с результатом, сгенерированную по запросу мы модем увидеть выполнив CGI приложение. Для этого требуется (персональный) Web сервер. По этому я написал небольшую программу отладки, используя Delphi 2.01 и NetManage HTML controclass="underline"

2.2.12. Заключение

Я надеюсь, что я показал, как мы можем писать интерактивные Интернет (Интранет) CGI приложения с помощью Delphi 2 используя CGI, WinCGI и Delphi 3 ISAPI/NSAPI Web Modules. Лично я планирую делать многое с помощью Дельфи для Интернет и Интранет.

3. Microsoft WinInet

Многое из того, что вы узнали, позволяет вам писать Интернет приложения с помощью Delphi. Особенно с помощью новых средств в Delphi 3 таких как ActiveForms и Web Modules. Но иногда мы хотим сделать, что еще быстрее и проще. Иногда мы просто хотим загрузить файл из Интернета. В терминах Интернета это означает, что мы хотим использовать FTP (file transfer protocol) клиента. И если вы верите мне, то вам не требуется ни какой FTP клиент, но если вы верите мне, то вы можете написать свой…

3.1. FTP

Как я сказал во введении, FTP означает File Transfer Protocol, который описан в RFC 959. Модель связи FTP может быть реализована с помощью сокетов, но это более низкоуровневое решение и если вы посмотрите спецификацию, то поймети, что написание программы FTP клиента с нуля не такая уж простая задача. С другой стороны, мы можем использовать NetManage TFTP компонент из Delphi 2.01 (и выше) и C++Builder. Я пробовал использовать этот компонент несколько раз, и нашел его просто глюкавым, особенно для файлов свыше 10 Kb. Я могу понять, почему Microsoft (первый разработчик Internet Solutions Pack) не захотела использовать его и продала затем NetManage, которая тоже не справилась с ним и продала далее фирме NetMasters. Проблема в том, что Internet Solutions Pack – хотя и бесплатный – основан на наборе с ограничениями ActiveX, и каждая компания которая использует его также имеет более лучшее решение (обычно не бесплатно). Поддержка и документация всегда отвратительная…

Так что же, назад к низкоуровневому программированию? Ни в коем случае. Как всегда на помощь приходит Microsoft

3.2. WinInet

Некоторое время назад, Microsoft выпустила WinInet, который ни что иное как промежуточный слой между высоким и нижним уровнем программирования Internet API специально для Win32 программистов. WinInet Является интерфейсом высокого уровня для протоколов нижнего уровня, таких как HTTP и FTP. Использование его действительно просто, и хорошо, что модуль WinInet.PAS с API определениями уже включен в Delphi 2.x и выше!