Интернет решения от доктора Боба | страница 20



>         FieldTypes[i] := sf_UnKnown { ignore }

>   end

finally

>   Free

end;

2.1.4. Записи

После анализа полей таблицы, мы можем пройтись по всей таблице и получить значения полей. Для каждой записи в таблице мы сгенерируем HTML-страницу. Мы можем использовать имена полей как заголовки, используя тег

для ключевых полей и тег

для не ключевых полей. Код просматривает всю таблицу т преобразовывает поля в текст и выводит их в HTML-файл:

>while not Eof do

>begin

>  Inc(RecNr);

>  System.Assign(f,FileName+'/'+PageNr(RecNr));

>  System.Rewrite(f);

>  writeln(f,'');

>  writeln(f,'

');

>  writeln(f,'');</code></p><p><code>>  writeln(f,Format('%s %d/%d',[ATable,RecNr,RecordCount]));</code></p><p><code>>  writeln(f,'');

>  writeln(f,'

');

>  writeln(f,'');

{ print fields }

for i:=0 to Pred(FieldCount) do

>    if FieldTypes[i] > sf_UnKnown then

>    begin

>      if (keys >= i) then writeln(f,'

')

>                     else writeln(f,'

');

>      writeln(f,FieldDefs[i].Name,':');

>      if (keys >= i) then writeln(f,'
') {

}

>                     else writeln(f,'
'); { }

>      if FieldTypes[i] = sf_Memo then

>        writeMemo(f,Fields[i])

>      else writeln(f,Fields[i].AsString);

>      if (keys = i) then writeln(f,'


');

>    end;

>    writeln(f,'');

>    writeln(f,'');

>    System.Close(f);

>    Next

end;

Заметим, что я использую здесь одно недокументированное свойство HTML: для окончания заголовка вы можете написать , но вы должны использовать
для разрыва строки. Таким образом, вы можете иметь заголовки, и текст, начинающийся правее и ниже заголовка. Пожалуйста, учтите, что это недокументированное свойство и вы должны заменить его раскомментировав и если вы не желаете жить на угле <юмор>. Следующий листинг показывает как получить информацию из мемо поля базы данных и поместить его в текстовый файл. И наконец после этого мы отформатируем немного, помня что 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

break }

>       if (Buffer[i] = LF) and (Buffer[i+1] = LF)