Bonjour, je souhaite copier dans le clipboard une chaine html, en l'occurrence un tableau.
Je me heurte à un problème, c'est à dire que lorsque je colle ma chaine sur open office, des caractères apparaissent à la fin du tableau alors qu'ils ne devraient pas y être.
J'ai fait des tests simple, au lieu de passer un tableau je passe juste quelques caractères :
si je copie la chaine x, j'obtient y dans openoffice en collant :
x='é' y='é'
x='éé' y='éé'
x='ééé' y='éé'
x='éééé' y='ééé'
x='ééééé' y='ééé'
x='éééééé' y='éééé'
Il semblerait donc que certains caractères aient besoin d'être encodés avant de passer par le clipboard.
J'ai donc cherché et trouvé htmlescape, mais comment gérer les caractères non occidentaux? Ca n'est pas pris en compte par cette fonction.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 function HTMLEscape(const Str: string): string; var i, l : integer; begin l := Length(Str); Result := ''; for i := 1 to l do begin case Str[i] of '<' : Result := Result + '<'; { Do not localize } '>' : Result := Result + '>'; { Do not localize } '&' : Result := Result + '&'; { Do not localize } '"' : Result := Result + '"'; { Do not localize } #92, #160 .. #255 : Result := Result + '&#' + IntToStr(Ord(Str[ i ])) +';'; { Do not localize } else Result := Result + Str[i]; end; end; end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 procedure CopyHTMLDirectToClipBoard(const htmlStr: string = ''); var gMem: HGLOBAL; lp: PChar; Strings: array[0..1] of UTF8String ; Formats: array[0..1] of UINT; i: Integer; begin gMem := 0; {$IFNDEF USEVCLCLIPBOARD} Win32Check(OpenClipBoard(0)); {$ENDIF} try //most descriptive first as per api docs Strings[0] := FormatHTMLClipboardHeader(htmlStr); Strings[1] := htmlStr; Formats[0] := RegisterClipboardFormat('HTML Format'); Formats[1] := CF_TEXT; {$IFNDEF USEVCLCLIPBOARD} Win32Check(EmptyClipBoard); {$ENDIF} for i := 0 to High(Strings) do begin if Strings[i] = '' then Continue; //an extra "1" for the null terminator gMem := GlobalAlloc(GMEM_DDESHARE + GMEM_MOVEABLE, Length(Strings[i]) + 1); {Succeeded, now read the stream contents into the memory the pointer points at} try Win32Check(gmem <> 0); lp := GlobalLock(gMem); Win32Check(lp <> nil); CopyMemory(lp, PChar(Strings[i]), Length(Strings[i]) + 1); finally GlobalUnlock(gMem); end; Win32Check(gmem <> 0); SetClipboardData(Formats[i], gMEm); Win32Check(gmem <> 0); gmem := 0; end; finally {$IFNDEF USEVCLCLIPBOARD} Win32Check(CloseClipBoard); {$ENDIF} end; end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 procedure ClickBoutonCopy(); var html:String; begin html:='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">'; html:=html + '<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" />'; html:=html + '</head><body>'; html:='<table>' + #13#10; html:=html + #9#9 + '<tr>' + #13#10#9#9#9#9 +'<td>' + MonLabel1.Text + '</td>' + #13#10#9#9 + '</tr>' + #13#10; html:=html + #9#9 + '<tr>' + #13#10#9#9#9#9 +'<td>' + MonLabelHTML1.HTMLText.Text + '</td>' + #13#10#9#9 + '</tr>' + #13#10; html:=html + '</table>' + #13#10; html:=html + '</body></html>'; CopyHTMLDirectToClipBoard(html); end;
Partager