📄 dbgridehimpexp.pas
字号:
if THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[Row]).Items[i]) = Node
then
begin
Inc(AColSpan);
TList(ListOfHeadTreeNodeList.Items[Row]).Items[i] := nil;
end else
Break;
for k := Row - 1 downto Row - ARowSpan + 1 do
for i := Col + 1 to Col + AColSpan - 1 do
TList(ListOfHeadTreeNodeList.Items[k]).Items[i] := nil;
end;
end;
procedure CreateMultiTitleMatrix(DBGridEh: TCustomDBGridEh;
ColumnsList: TColumnsEhList;
var FPTitleExpArr: PTitleExpArr;
var ListOfHeadTreeNodeList: TList);
var i: Integer;
NeedNextStep: Boolean;
MinHeight: Integer;
FHeadTreeNodeList: TList;
begin
ListOfHeadTreeNodeList := nil;
FPTitleExpArr := AllocMem(SizeOf(TTitleExpRec) * ColumnsList.Count);
for i := 0 to ColumnsList.Count - 1 do
begin
FPTitleExpArr[i].Height := DBGridEh.LeafFieldArr[ColumnsList[i].Index].FLeaf.Height;
FPTitleExpArr[i].PTLeafCol := DBGridEh.LeafFieldArr[ColumnsList[i].Index].FLeaf;
end;
ListOfHeadTreeNodeList := TList.Create;
NeedNextStep := True;
while True do
begin
//search min height
MinHeight := FPTitleExpArr[0].Height;
for i := 1 to ColumnsList.Count - 1 do
if FPTitleExpArr[i].Height < MinHeight then
MinHeight := FPTitleExpArr[i].Height;
//add NodeList
FHeadTreeNodeList := TList.Create;
for i := 0 to ColumnsList.Count - 1 do
begin
FHeadTreeNodeList.Add(FPTitleExpArr[i].PTLeafCol);
if FPTitleExpArr[i].Height = MinHeight then
begin
if FPTitleExpArr[i].PTLeafCol.Host <> nil then
begin
FPTitleExpArr[i].PTLeafCol := FPTitleExpArr[i].PTLeafCol.Host;
Inc(FPTitleExpArr[i].Height, FPTitleExpArr[i].PTLeafCol.Height);
NeedNextStep := True;
end;
end;
end;
if not NeedNextStep then Break;
ListOfHeadTreeNodeList.Add(FHeadTreeNodeList);
NeedNextStep := False;
end;
end;
{ TDBGridEhExportAsHTML }
procedure TDBGridEhExportAsHTML.Put(Text: String);
begin
Stream.Write(PChar(Text)^, Length(Text));
end;
procedure TDBGridEhExportAsHTML.PutL(Text: String);
begin
Put(Text + #13#10);
end;
procedure TDBGridEhExportAsHTML.WritePrefix;
var s: String;
CellPaddingInc: String;
begin
PutL('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">');
PutL('<HTML>');
PutL('<HEAD>');
PutL('<TITLE>');
PutL(DBGridEh.Name);
PutL('</TITLE>');
PutL('</HEAD>');
s := '<TABLE ';
if DBGridEh.Flat then CellPaddingInc := '1' else CellPaddingInc := '2';
if DBGridEh.Options * [dgColLines, dgRowLines] <> [] then
if DBGridEh.Ctl3D then s := s + 'BORDER=1 CELLSPACING=0 CELLPADDING=' + CellPaddingInc
else s := s + 'BORDER=0 CELLSPACING=1 CELLPADDING=' + CellPaddingInc
else
s := s + 'BORDER=0 CELLSPACING=0 CELLPADDING=' + CellPaddingInc;
s := s + ' BGCOLOR=#' + GetColor(DBGridEh.FixedColor) + '>' + #13#10;
PutL(s);
end;
procedure TDBGridEhExportAsHTML.WriteSuffix;
begin
PutL('</TABLE>');
PutL('</BODY>');
PutL('</HTML>');
end;
procedure TDBGridEhExportAsHTML.WriteTitle(ColumnsList: TColumnsEhList);
var i, k: Integer;
FPTitleExpArr: PTitleExpArr;
ListOfHeadTreeNodeList: TList;
ColSpan, RowSpan: Integer;
begin
if ColumnsList.Count = 0 then Exit;
if DBGridEh.UseMultiTitle then
begin
try
CreateMultiTitleMatrix(DBGridEh, ColumnsList, FPTitleExpArr, ListOfHeadTreeNodeList);
for k := ListOfHeadTreeNodeList.Count - 1 downto 1 do
begin
PutL('<TR>');
for i := 0 to ColumnsList.Count - 1 do
begin
if THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[k]).Items[i]) <> nil then
begin
Put(' <TD ALIGN="CENTER"');
CalcSpan(ColumnsList, ListOfHeadTreeNodeList, k, i, ColSpan, RowSpan);
if ColSpan > 1 then
Put(' COLSPAN = "' + IntToStr(ColSpan) + '"');
if RowSpan > 1 then
Put(' ROWSPAN = "' + IntToStr(RowSpan) + '"');
Put('>');
PutText(DBGridEh.TitleFont,
THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[k]).Items[i]).Text);
PutL('</TD>');
end;
end;
PutL('</TR>');
end;
PutL('<TR>');
for i := 0 to ColumnsList.Count - 1 do
begin
if THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[0]).Items[i]) <> nil then
begin
Put(' <TD WIDTH=' + IntToStr(ColumnsList[i].Width) + ' ALIGN="CENTER"');
CalcSpan(ColumnsList, ListOfHeadTreeNodeList, 0, i, ColSpan, RowSpan);
if ColSpan > 1 then
Put(' COLSPAN = "' + IntToStr(ColSpan) + '"');
if RowSpan > 1 then
Put(' ROWSPAN = "' + IntToStr(RowSpan) + '"');
Put('>');
PutText(ColumnsList[i].Title.Font,
THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[0]).Items[i]).Text);
PutL('</TD>');
end;
end;
PutL('</TR>');
finally
for i := 0 to ListOfHeadTreeNodeList.Count - 1 do
TList(ListOfHeadTreeNodeList.Items[i]).Free;
ListOfHeadTreeNodeList.Free;
FreeMem(FPTitleExpArr);
end;
end else
begin
PutL('<TR>');
for i := 0 to ColumnsList.Count - 1 do
begin
Put(' <TD WIDTH=' + IntToStr(ColumnsList[i].Width) +
' ALIGN="' + GetAlignment(ColumnsList[i].Title.Alignment) + '"' + '>');
PutText(ColumnsList[i].Title.Font, ColumnsList[i].Title.Caption);
PutL('</TD>');
end;
PutL('</TR>');
end;
end;
procedure TDBGridEhExportAsHTML.WriteRecord(ColumnsList: TColumnsEhList);
begin
PutL('<TR>');
inherited;
PutL('</TR>');
end;
procedure TDBGridEhExportAsHTML.WriteDataCell(Column: TColumnEh; FColCellParamsEh: TColCellParamsEh);
begin
Put(' <TD WIDTH=' + IntToStr(Column.Width) +
' ALIGN="' + GetAlignment(FColCellParamsEh.Alignment) + '"' +
' BGCOLOR=#' + GetColor(FColCellParamsEh.Background) +
'>');
PutText(FColCellParamsEh.Font, FColCellParamsEh.Text);
PutL('</TD>');
end;
function TDBGridEhExportAsHTML.GetAlignment(Alignment: TAlignment): String;
begin
case Alignment of
taLeftJustify: Result := 'LEFT';
taCenter: Result := 'CENTER';
taRightJustify: Result := 'RIGHT';
end;
end;
procedure TDBGridEhExportAsHTML.PutText(Font: TFont; Text: String);
var s: String;
begin
s := '<FONT STYLE="font-family: ' + Font.Name;
s := s + '; font-size: ' + IntToStr(Font.Size);
s := s + 'pt; color: #' + GetColor(Font.Color) + '">';
if (fsBold in Font.Style) then s := s + '<B>';
if (fsItalic in Font.Style) then s := S + '<I>';
if (fsUnderline in Font.Style) then s := s + '<U>';
if (fsStrikeOut in Font.Style) then s := s + '<STRIKE>';
Text := StringReplace(Text, '&', '&', [rfReplaceAll]);
Text := StringReplace(Text, '<', '<', [rfReplaceAll]);
Text := StringReplace(Text, '>', '>', [rfReplaceAll]);
Text := StringReplace(Text, '"', '"', [rfReplaceAll]);
if Text <> '' then
s := s + Text
else
s := s + ' ';
if (fsBold in Font.Style) then s := s + '</B>';
if (fsItalic in Font.Style) then s := S + '</I>';
if (fsUnderline in Font.Style) then s := s + '</U>';
if (fsStrikeOut in Font.Style) then s := s + '</STRIKE>';
s := s + '</FONT>';
Put(s);
end;
function TDBGridEhExportAsHTML.GetColor(Color: TColor): String;
var s: String;
begin
if Color = clNone then
s := '000000'
else
s := IntToHex(ColorToRGB(Color), 6);
Result := Copy(s, 5, 2) + Copy(s, 3, 2) + Copy(s, 1, 2);
end;
procedure TDBGridEhExportAsHTML.WriteFooter(ColumnsList: TColumnsEhList;
FooterNo: Integer);
begin
PutL('<TR>');
inherited;
PutL('</TR>');
end;
procedure TDBGridEhExportAsHTML.WriteFooterCell(DataCol, Row: Integer;
Column: TColumnEh; AFont: TFont; Background: TColor;
Alignment: TAlignment; Text: String);
var Footer: TColumnFooterEh;
begin
Footer := Column.UsedFooter(Row);
Put(' <TD WIDTH=' + IntToStr(Column.Width) +
' ALIGN="' + GetAlignment(Footer.Alignment) + '"' +
' BGCOLOR=#' + GetColor(Background) +
'>');
PutText(AFont, Text);
PutL('</TD>');
end;
{ TDBGridEhExportAsRTF }
procedure TDBGridEhExportAsRTF.ExportToStream(AStream: TStream; IsExportAll: Boolean);
var i: Integer;
begin
FCacheStream := TMemoryStream.Create;
ColorTblList := TStringList.Create;
FontTblList := TStringList.Create;
try
GetColorIndex(clBlack);
GetColorIndex(clWhite);
GetColorIndex(clBtnFace);
inherited ExportToStream(FCacheStream, IsExportAll);
Stream := AStream;
PutL('{\rtf0\ansi');
Put('{\colortbl');
for i := 0 to ColorTblList.Count - 1 do
Put('\red' + Trim(Copy(ColorTblList[i], 1, 3)) +
'\green' + Trim(Copy(ColorTblList[i], 4, 3)) +
'\blue' + Trim(Copy(ColorTblList[i], 7, 3)) + ';');
PutL('}');
Put('{\fonttbl');
for i := 0 to FontTblList.Count - 1 do
Put('\f' + IntToStr(i) + '\fnil ' + FontTblList[i] + ';');
PutL('}');
FCacheStream.SaveToStream(Stream);
finally
FCacheStream.Free;
ColorTblList.Free;
FontTblList.Free;
end;
end;
procedure TDBGridEhExportAsRTF.Put(Text: String);
begin
Stream.Write(PChar(Text)^, Length(Text));
end;
procedure TDBGridEhExportAsRTF.PutL(Text: String);
begin
Put(Text + #13#10);
end;
procedure TDBGridEhExportAsRTF.PutText(Font: TFont; Text: String; Background: TColor);
var s: String;
begin
s := '\fs' + IntToStr(Font.Size * 2);
if (fsBold in Font.Style) then s := s + '\b';
if (fsItalic in Font.Style) then s := s + '\i';
if (fsStrikeOut in Font.Style) then s := s + '\strike';
if (fsUnderline in Font.Style) then s := s + '\ul';
s := s + '\f' + IntToStr(GetFontIndex(Font.Name));
s := s + '\cf' + IntToStr(GetColorIndex(Font.Color));
s := s + '\cb' + IntToStr(GetColorIndex(Background));
Put(s + ' ');
Put(Text);
end;
function TDBGridEhExportAsRTF.GetAlignment(Alignment: TAlignment): String;
begin
case Alignment of
taLeftJustify: Result := '\ql';
taCenter: Result := '\qc';
taRightJustify: Result := '\qr';
end;
end;
function TDBGridEhExportAsRTF.GetFontIndex(FontName: String): Integer;
begin
Result := FontTblList.IndexOf(FontName);
if Result = -1 then
Result := FontTblList.Add(FontName);
end;
function TDBGridEhExportAsRTF.GetColorIndex(Color: TColor): Integer;
var RGBColor: Longint;
s: String;
begin
RGBColor := ColorToRGB(Color);
s := Format('%3d%3d%3d', [GetRValue(RGBColor), GetGValue(RGBColor), GetBValue(RGBColor)]);
Result := ColorTblList.IndexOf(s);
if Result = -1 then
Result := ColorTblList.Add(s);
end;
procedure TDBGridEhExportAsRTF.WritePrefix;
begin
end;
procedure TDBGridEhExportAsRTF.WriteSuffix;
begin
Put('}');
end;
procedure TDBGridEhExportAsRTF.WriteTitle(ColumnsList: TColumnsEhList);
var fLogPelsX: Integer;
i, w, k: Integer;
FPTitleExpArr: PTitleExpArr;
ListOfHeadTreeNodeList: TList;
ColSpan, RowSpan: Integer;
Text: String;
LeftBorder, TopBorder, BottomBorder, RightBorder: Boolean;
ExclLeftBorders, ExclTopBorders, ExclBottomBorders, ExclRightBorders: TStringList;
Space: String;
procedure AddExclBorders(Col, Row, ColSpan, RowSpan: Integer);
var i, k: Integer;
begin
for i := Col to Col + ColSpan - 1 do
for k := Row downto Row - RowSpan + 1 do
begin
if i <> Col then
ExclLeftBorders.Add(Format('%3d%3d', [i, k]));
if i <> Col + ColSpan - 1 then
ExclRightBorders.Add(Format('%3d%3d', [i, k]));
if k <> Row then
ExclTopBorders.Add(Format('%3d%3d', [i, k]));
if k <> Row - RowSpan + 1 then
ExclBottomBorders.Add(Format('%3d%3d', [i, k]));
end;
end;
procedure CalcBorders(Col, Row: Integer);
begin
LeftBorder := True; TopBorder := True;
BottomBorder := True; RightBorder := True;
if ExclLeftBorders.IndexOf(Format('%3d%3d', [Col, Row])) <> -1 then
LeftBorder := False;
if ExclRightBorders.IndexOf(Format('%3d%3d', [Col, Row])) <> -1 then
RightBorder := False;
if ExclTopBorders.IndexOf(Format('%3d%3d', [Col, Row])) <> -1 then
TopBorder := False;
if ExclBottomBorders.IndexOf(Format('%3d%3d', [Col, Row])) <> -1 then
BottomBorder := False;
end;
begin
fLogPelsX := GetDeviceCaps(DBGridEh.Canvas.Handle, LOGPIXELSX);
if DBGridEh.UseMultiTitle then
begin
Space := IntToStr(Abs(Trunc(DBGridEh.VTitleMargin / 2 / fLogPelsX * 1440 - 20)));
ExclLeftBorders := nil; ExclTopBorders := nil;
ExclBottomBorders := nil; ExclRightBorders := nil;
try
CreateMultiTitleMatrix(DBGridEh, ColumnsList, FPTitleExpArr, ListOfHeadTreeNodeList);
ExclLeftBorders := TStringList.Create;
ExclTopBorders := TStringList.Create;
ExclBottomBorders := TStringList.Create;
ExclRightBorders := TStringList.Create;
//MultiTitle
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -