브라우저에서 드래그 한 다음 Ctrl+C를 눌러 클립보드에 저장한 후,
WYSIWYG 에디터에서 Ctrl+V를 눌러 뿌려보면 태그가 그대로 적용된 것이 보인다.
이것은 클립보드의 또 다른 형태를 이용한 버전이다.
기본적인 CF_TEXT와 함께 HTML Format의 데이터도 저장된다.
클립보드 HTML Format에 대한 정보 : http://msdn.microsoft.com/en-us/library/aa767917(VS.85).aspx
클립보드의 HTML Format은 아래와 같은 형태를 지닌다.
아래 전부의 내용이 클립보드 안에 들어간다.
나누자면,
노르스름한게 헤더같은 존재고
나머지 하얀색이 HTML 내용이며,
<!--StartFragment--> 와 <!--EndFragment--> 사이가 뽑아낼 내용이다.
자세한 내용은 위의 링크를 봐도 알 수 있고 숫자로 계산을 때려봐도 대충 감은 온다.
나누자면,
노르스름한게 헤더같은 존재고
나머지 하얀색이 HTML 내용이며,
<!--StartFragment--> 와 <!--EndFragment--> 사이가 뽑아낼 내용이다.
자세한 내용은 위의 링크를 봐도 알 수 있고 숫자로 계산을 때려봐도 대충 감은 온다.
Version:0.9
StartHTML:71
EndHTML:170
StartFragment:140
EndFragment:160
StartSelection:140
EndSelection:160
<!DOCTYPE>
<HTML>
<HEAD>
<TITLE>The HTML Clipboard</TITLE>
<BASE HREF="http://sample/specs">
</HEAD>
<BODY>
<!--StartFragment -->
<P>The Fragment</P>
<!--EndFragment -->
</BODY>
</HTML>
아쉽게도 델파이에서 사용하는 ClipBoard 객체엔 CF_HTML 이 정의되어 있지 않다.
직접 정의해서 사용하는 수 밖에 없다.
아래에 CF_HTML 형태로 클립보드에 저장하고, CF_HTML 형태로 저장된 클립보드 내용을 가져오는 함수를 남긴다.
존내 짜증나는건 브라우저마다 위치계산하기가 애매하다는 것이다.
제대로 돌아가게 만들려면 반드시 다시 보고 연구해야 한다.
Chrome이 제일 편하고 짱인듯...
(함수 두개 달랑 있는 소스파일)
클립보드에 CF_HTML 형태로 저장하기
주의!
일단은 급한 필요에 의해 IE, FireFox, Chrome 브라우저에 <img src="ImagePath"> 형태로 뿌릴 수 있는 것만 구현했다.
다른 긴 태그들의 연속이나,
한글이나 기타 사항을 넣으려면 UTF8 관련된 인코딩 삽질을 해야한다.
-
// 클립보드에 CF_HTML 형태로 입력
-
// _____________________________________________________________________________
-
procedure SetClipBoardHTML(s: String);
-
const
-
START_FRAGMENT='<!--StartFragment-->';
-
END_FRAGMENT ='<!--EndFragment-->';
-
-
var
-
gMem: HGLOBAL;
-
pBytes: PByteArray;
-
i: Integer;
-
tmpStr: String;
-
LBuffer: TBytes;
-
-
begin
-
// HTML Format에 맞게 세팅
-
tmpStr:='Version:1.0'+#13#10;
-
tmpStr:=tmpStr+'StartHTML:~~~~~~~~'+#13#10;
-
tmpStr:=tmpStr+'EndHTML:########'+#13#10;
-
tmpStr:=tmpStr+'StartFragment:~~~~~~~~'+#13#10;
-
tmpStr:=tmpStr+'EndFragment:########'+#13#10;
-
tmpStr:=tmpStr+'<html><body>'+#13#10;
-
tmpStr:=tmpStr+'<!--StartFragment-->'+s+'<!--EndFragment-->'+#13#10;
-
tmpStr:=StringReplace(tmpStr, '~~~~~~~~', Format('%.08d', [Pos('<html', tmpStr)-1]), [rfReplaceAll]);
-
tmpStr:=StringReplace(tmpStr, '########', Format('%.08d', [Pos(END_FRAGMENT, tmpStr)+Length(END_FRAGMENT)]), [rfReplaceAll]);
-
-
// 버퍼에 복사
-
SetLength(LBuffer, Length(tmpStr)+1);
-
for i:=0 to Length(tmpStr) do LBuffer[i]:=Byte(tmpStr[i+1]);
-
-
// 클립보드용 버퍼에 복사
-
gMem:=GlobalAlloc(GHND, Length(LBuffer)*2);
-
pBytes:=GlobalLock(gMem);
-
try
-
for i:=0 to Length(LBuffer)+1 do pBytes[i]:=LBuffer[i];
-
finally
-
GlobalUnlock(gMem);
-
end;
-
-
// 클립보드에 쓰기
-
OpenClipBoard(0);
-
EmptyClipBoard;
-
SetClipBoardData(RegisterClipBoardFormat('HTML Format'), gMem);
-
CloseClipBoard;
-
end;
클립보드에 CF_HTML 형태로 들어있는 데이터를 가져오기
주의!
자동으로 헤더를 자르고 태그만 남기는 로직은 없다.
필요하다면 직접 대가리를 잘라야 한다.
-
// 클립보드의 CF_HTML 포맷데이터 가져오기
-
// _____________________________________________________________________________
-
function GetClipBoardHTML: String;
-
var
-
gMem: HGLOBAL;
-
pBytes: PByteArray;
-
lenBuffer: DWORD;
-
i: Integer;
-
CF_HTML: UINT;
-
-
begin
-
Result:='';
-
-
// CF_HTML 등록
-
CF_HTML:=RegisterClipboardFormat('HTML Format');
-
-
// 클립보드를 열어 CF_HTML 데이터가 있으면 읽어와서 반환
OpenClipBoard(0); -
if ClipBoard.HasFormat(CF_HTML) then begin
-
gMem:=GetClipboardData(CF_HTML);
-
pBytes:=GlobalLock(gMem);
-
try
-
lenBuffer:=Length(PChar(pBytes))*2;
-
SetLength(Result, lenBuffer);
-
for i:=0 to lenBuffer do Result[i+1]:=Chr(pBytes[i]);
-
Result:=TEncoding.UTF8.GetString(TBytes(pBytes), 0, lenBuffer);
-
finally
-
GlobalUnlock(gMem);
-
end;
-
end;
-
CloseClipBoard;
-
end;
'Delphi' 카테고리의 다른 글
[Delphi] 클립보드 이미지 데이터를 JPEG로 저장하기 (0) | 2009.06.21 |
---|---|
[Delphi] Mutex로 중복실행 방지 (0) | 2009.06.21 |
Delphi2009 + IdHTTP (Indy10) 에서 UTF-8 웹페이지 한글 깨짐 (0) | 2009.05.20 |
Delphi&PHP 언어간의 암호화 시스템 호환 (0) | 2009.04.30 |
캡션없는 윈도우 마우스 드래그로 움직이기 (0) | 2009.04.30 |