Интернет решения от доктора Боба | страница 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,'
> writeln(f,Format('%s %d/%d',[ATable,RecNr,RecordCount]));
> 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
break }> { empty line converted to
> if (Buffer[i] = LF) and (Buffer[i+1] = LF)