Skip to content

Commit

Permalink
Refactor HTML clipboard code. See https://www.heidisql.com/forum.php?…
Browse files Browse the repository at this point in the history
  • Loading branch information
ansgarbecker committed Mar 30, 2023
1 parent a7d76c0 commit 8592852
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 37 deletions.
53 changes: 21 additions & 32 deletions source/apphelpers.pas
Expand Up @@ -1318,10 +1318,15 @@ procedure StreamToClipboard(Text, HTML: TStream; CreateHTMLHeader: Boolean);
lp: PChar;
ClpLen: Integer;
CF_HTML: Word;
StartHTML, EndHTML, StartFragment, EndFragment: Integer;
const
PosFormat: AnsiString = '%.10d';

function FormatPos(Num: Integer): String;
procedure ReplacePos(Name: AnsiString; Value: Integer);
var NewPos: AnsiString;
begin
Result := System.AnsiStrings.Format('%.10d', [Num]);
NewPos := Format(PosFormat, [Value]);
HTMLContent := StringReplace(HTMLContent, Name+':'+NullPos, Name+':'+NewPos, []);
end;
begin
// Copy unicode text to clipboard
Expand All @@ -1344,37 +1349,21 @@ procedure StreamToClipboard(Text, HTML: TStream; CreateHTMLHeader: Boolean);
HTML.Position := 0;
HTML.Read(PAnsiChar(HTMLContent)^, HTML.Size);
if CreateHTMLHeader then begin
NullPos := FormatPos(0);
HTMLHeader := 'Version:0.9' + CRLF +
'StartHTML:' + NullPos + CRLF +
'EndHTML:' + NullPos + CRLF +
'StartFragment:' + NullPos + CRLF +
'EndFragment:' + NullPos + CRLF;
HTMLHeader := System.AnsiStrings.StringReplace(
HTMLHeader,
'StartHTML:' + NullPos,
'StartHTML:' + FormatPos(Length(HTMLHeader)),
[]
);
NullPos := Format(PosFormat, [0]);
HTMLHeader := 'Version:0.9' + sLineBreak +
'StartHTML:' + NullPos + sLineBreak +
'EndHTML:' + NullPos + sLineBreak +
'StartFragment:' + NullPos + sLineBreak +
'EndFragment:' + NullPos + sLineBreak;
StartHTML := Length(HTMLHeader);
HTMLContent := HTMLHeader + HTMLContent;
HTMLContent := System.AnsiStrings.StringReplace(
HTMLContent,
'EndHTML:' + NullPos,
'EndHTML:' + FormatPos(Length(HTMLContent)),
[]
);
HTMLContent := System.AnsiStrings.StringReplace(
HTMLContent,
'StartFragment:' + NullPos,
'StartFragment:' + FormatPos(Pos('<body>', HTMLContent) + 6),
[]
);
HTMLContent := System.AnsiStrings.StringReplace(
HTMLContent,
'EndFragment:' + NullPos,
'EndFragment:' + FormatPos(Length(HTMLContent)),
[]
);
EndHTML := Length(HTMLContent);
StartFragment := Pos(AnsiString('<body>'), HTMLContent) + 6;
EndFragment := Pos(AnsiString('</body'), HTMLContent)-1;
ReplacePos('StartHTML', StartHTML);
ReplacePos('EndHTML', EndHTML);
ReplacePos('StartFragment', StartFragment);
ReplacePos('EndFragment', EndFragment);
end;
ClpLen := Length(HTMLContent) + 1;
GlobalMem := GlobalAlloc(GMEM_DDESHARE + GMEM_MOVEABLE, ClpLen);
Expand Down
7 changes: 2 additions & 5 deletions source/exportgrid.pas
Expand Up @@ -623,14 +623,11 @@ procedure TfrmExportGrid.btnOKClick(Sender: TObject);
' <meta name="GENERATOR" content="'+ APPNAME+' '+Mainform.AppVersion + '">' + CRLF +
' <meta http-equiv="Content-Type" content="text/html; charset='+GetHTMLCharsetByEncoding(Encoding)+'" />' + CRLF +
' <style type="text/css">' + CRLF +
' th, td {vertical-align: top; font-family: "'+Grid.Font.Name+'", Arial, Helvetica, sans-serif; font-size: '+IntToStr(Grid.Font.Size)+'pt; padding: '+IntToStr(Grid.TextMargin-1)+'px; }' + CRLF +
' table, td {border: 1px solid silver;}' + CRLF +
' th, td {vertical-align: top;}' + CRLF +
' table, td {border: 1px solid silver; padding: 2px;}' + CRLF +
' table {border-collapse: collapse;}' + CRLF;
Col := Grid.Header.Columns.GetFirstVisibleColumn;
while Col > NoColumn do begin
// Adjust preferred width of columns.
Header := Header +
' thead .col' + IntToStr(Col) + ' {width: ' + IntToStr(Grid.Header.Columns[Col].Width) + 'px;}' + CRLF;
// Right-justify all cells to match the grid on screen.
if Grid.Header.Columns[Col].Alignment = taRightJustify then
Header := Header + ' .col' + IntToStr(Col) + ' {text-align: right;}' + CRLF;
Expand Down

0 comments on commit 8592852

Please sign in to comment.