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

ЖАНРЫ

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

Swart Bob

Шрифт:

2.1.1. Delphi и HTML

Мой главный инструмент разработчики это Дельфи, и мы напишем Delphi Database HTML Expert в данной главе. Дельфи позволяет подсоединяться практически к базе данных любого формата. С помощью BDE к Парадоксу и dBASE, с помощью ODBC например к Access, и с помощью SQL Links к большим DBMS типа InterBase, Oracle, Sybase и Informix. Также, вы можете купить дополнительные продукты типа Apollo для связи с таблицами Clipper и FoxPro. В этой главе мы будем использовать базы формата Парадокс. Парадокс имеет достаточно развитый формат, что решает многие проблемы при преобразовании полей, типов и значения из базы в HTML.

2.1.2. Basic HTML

Ввод будет преобразовываться в формат базы данных, а вывод в формат HTML-страниц.

2.1.3.

Преобразование полей

HTML страница может содержать только простой ASCII текст. Конечно, здесь могут быть и другие вещи встроенный в текст, обычно картинки в .GIF или .JPEG формат. Таблица базы данных содержит поля, у которых есть значения, которые можно преобразовать в строки символов. Дельфи даже имеет встроенное свойство "AsString" для всех основных классов наследованных от TField. Свойство AsString в действительно преобразующие свойство. Для TStringField, AsString может использоваться для чтения значения из поля как строка. Для TBCDField, TCurrencyField, TDateField, TDateTimeField, TFloatField, TIntegerField, TSmallintField, TTimeField, и TWordField, свойство AsString преобразует тип в строку при чтении из поля. Для TBooleanField, свойство AsString возвращает 'T' или 'F'. Для TMemoField, TGraphicField, TBlobField, TBytesField или TVarBytesField, свойство AsString должно использоваться только для чтения из поля. Это возвращает строковое выражение '(Memo)', '(Graphic)', '(Blob)', '(Bytes)' или '(Var Bytes)' соответственно. Так как мемо поля могут содержать важную текстовую информацию, я решил игнорировать все кроме TMemoField, и при работе с TMemoField мы можем использовать метод SaveToStream для чтения данных из поля, как мы увидим это позже. Так что мы можем разделить их на две группы: те у которых мы можем использовать свойство AsString, и те у которых нет. Мы можем определить третий тип (неизвестный – unknown), и использовать следующие определения для таблиц не более 255 полей:

const

MaxField = 255;

sf_UnKnown = 0;

sf_String = 1;

sf_Memo = 2;

var

FieldTypes: Array[0..Pred(MaxField)] of Byte; { default unknowns }

Мы должны просмотреть структуру таблицы для получения информации об типах полей:

 with TTable.Create(nil) do

 try

DatabaseName := ADatabase;

TableName := ATable;

Active := True;

keys := -1; { no key in table }

for i:=0 to Pred(FieldDefs.Count) do

begin

if Fields[i].IsIndexField then keys := i;

FieldTypes[i] := sf_String; { default }

if (FieldDefs[i].FieldClass = TMemoField) then

FieldTypes[i] := sf_Memo

else

if (FieldDefs[i].FieldClass = TGraphicField) or

(FieldDefs[i].FieldClass = TBlobField) or

(FieldDefs[i].FieldClass = TBytesField) or

(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

Поделиться с друзьями: