Записи
После анализа полей таблицы, мы можем пройтись по всей таблице и получить значения полей. Для каждой записи в таблице мы сгенерируем 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};