середу, 3 липня 2013 р.

Створення HTML-таблиці

Тема досить багато і детально розписана на багатьох спеціалізованих порталах. Зараз хочеться подивитися на створення html-таблиць за допомогою Delphi. Точніше, як автоматизувати і спростити  виведення табличних даних.
Якщо коротко нагадати, то все можна описати досить просто:

<table>
  <tbody>
    <tr>
      <td>...</td>
    </tr>
  </tbody>
<table>

Основна задача наведеної функції - спрощення створення та стандартизація оформлення таблиць у всьому проекті. Константа C_TABLE_TAG за допомогою атрибутів описує зовнішній вигляд, форматування елементів таблиці. В якості параметрів передається одне значення або варіантний масив назв стовпців. Функція VarIsArray визначає, передався масив чи одне значення. Ширина таблиці задана 100%, знак % замінено на еквівалент &#37; для того, щоб функція Format коректно могла відпрацювати. Знову ж таки, оформлення таблиці - справа корпоративних стандартів та особистих смаків:

function GetTableTag(aColumns: Variant; aTableCaption: string = ''): string;
const
  C_TABLE_TAG = '<TABLE width="100&#37;" border="1" bordercolor="gray" cols="%d" cellspacing="0" cellpadding="2">';
var
  i           : Integer;
  nArrayBound : Byte;
  sTableTag   : string;
  sTrTag      : string;
begin
  if VarIsArray(aColumns) then
  begin
    nArrayBound := VarArrayHighBound(aColumns, 1);
    sTableTag   := Format(C_TABLE_TAG, [nArrayBound]);
    if (aTableCaption <> '') then
      sTableTag := Concat(sTableTag, '<CAPTION>', aTableCaption, '</CAPTION>');
    sTrTag := '<THEAD><TR bgcolor="#85ACE3">';
    for i := VarArrayLowBound(aColumns, 1) to nArrayBound do
      sTrTag := Concat(sTrTag, '<TH>', VarToStr(aColumns[i]), '</TH>');
    sTrTag := Concat(sTrTag,  '</TR></THEAD>');
  end
  else
  begin
    sTableTag := Format(C_TABLE_TAG, [1]);
    if (aTableCaption <> '') then
      sTableTag := Concat(sTableTag, '<CAPTION>', aTableCaption, '</CAPTION>');
    sTrTag := Concat('<THEAD><TR bgcolor="#85ACE3"><TH>', VarToStr(aColumns), '</TH></TR></THEAD>')
  end;
  Result := Concat(sTableTag, sTrTag);
end;

Наповнення таблиці можна реалізувати ще простіше:

class function TvmsHtmlLib.GetTableLineTag(aLineText: Variant): string;
var
  i      : Integer;
  sTrTag : string;
begin
  if VarIsArray(aLineText) then
  begin
    sTrTag := '<TR>';
    for i := VarArrayLowBound(aLineText, 1) to VarArrayHighBound(aLineText, 1) do
      sTrTag := Concat(sTrTag, '<TD valign="top">', VarToStr(aLineText[i]), '</TD>');
    sTrTag := Concat(sTrTag, '</TR>');
  end
  else
    sTrTag := Concat('<TR><TD>', VarToStr(aLineText), '</TD></TR>');
  Result := sTrTag;
end;

Приклад виклику функцій:

procedure TForm1.Button1Click(Sender: TObject);
var
  i : Byte;
begin
  Memo1.Text := GetTableTag(VarArrayOf(['Column1', 
                                        'Column2', 
                                        'Column3', 
                                        'Column4', 
                                        'Column5']), 
                            'Some Caption');
  for i := 0 to 4 do
    Memo1.Text := Concat(Memo1.Text, GetTableLineTag(VarArrayOf(['Value1', 
                                                                 'Value2', 
                                                                 'Value3', 
                                                                 'Value4', 
                                                                 'Value5'])));
end;

Результат роботи функцій:

Some Caption
Column1Column2Column3Column4Column5
Value1Value2Value3Value4Value5
Value1Value2Value3Value4Value5
Value1Value2Value3Value4Value5
Value1Value2Value3Value4Value5
Value1Value2Value3Value4Value5

Звичайно, наведені функції не вміють робити таких речей, як, наприклад, об'єднання комірок. Але це лише шаблон, який можна використовувати для нарощення функціональності.


Немає коментарів :

Дописати коментар