DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: cdk19821
今日帖子: 32
在线用户: 15
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 bird13 (13) ★☆☆☆☆ -
普通会员
2023/11/24 15:19:31
标题:
大佬们,有没有办法把图片和文字一起放进剪切板 浏览:1033
加入我的收藏
楼主: 如题 ,用Clipboard实现单文字或者图片都很容易,但是如果要放在一起该如何做?
----------------------------------------------
-QQ:1379585
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2023/11/24 15:41:50
1楼: 走标准的 html 或 rtf 格式;或者自定义
----------------------------------------------
-
作者:
男 bird13 (13) ★☆☆☆☆ -
普通会员
2023/11/24 15:47:47
2楼: 居然引来了大神回贴,十万分感谢!!!
用web控件把图片和文字写到里面,然后全选,调用windows功能键Ctrl+C,是这个思路吗?
----------------------------------------------
-QQ:1379585
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2023/11/24 17:03:24
3楼: 使用 HTML 有两种方法:

1. 内容其实对应的是一个 http 的地址。剪贴地址。

2. 把文字和图片,打包到一个 HTML 文件里面。也就是说,HTML 文件里面包含图片数据,而不是简单的图片链接。这个图片数据如果是 MIME 编码的,那也就是一堆 ASCII 字符了。当然,接收方如果能处理 HTML 比如是一个浏览器,也无需考虑如何去解码图片,直接就能显示出来。
----------------------------------------------
-
作者:
男 bird13 (13) ★☆☆☆☆ -
普通会员
2023/11/25 9:24:18
4楼: 主要用途是粘贴到微信或者foxmail等邮件客户端
----------------------------------------------
-QQ:1379585
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2023/11/26 0:43:35
5楼: 邮件客户端都支持 HTML 的。

邮件的内容本身就是图片文字混合在一起的。这个 Indy 都支持的。你直接使用 Indy 的控件就能完成。
----------------------------------------------
-
作者:
男 bird13 (13) ★☆☆☆☆ -
普通会员
2023/11/28 11:29:57
6楼: 我周末尝试用delphi自带的WebBrowser,没弄好,后面又百度了一下,试着把图片转成base64,也没成功。我再慢慢试吧,至少有方同了,感谢楼上的大大们。
----------------------------------------------
-QQ:1379585
作者:
男 ying32 (唯有此生) ▲▲▲▲▲ -
普通会员
2023/11/28 13:20:07
7楼: 这是很多年前做的一个剪切板html格式的,用来复制了图片的,可以参考下。找了很久才找到哈,都忘了扔哪里的

FCF_HTML := RegisterClipboardFormat('HTML Format');


procedure TClipboardEx.SetClipboardHTML(ASrcFileName: string; ABmpStream: TStream);
var
  Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  try
    ABmpStream.Position := 0;
    Bmp.LoadFromStream(ABmpStream);
    SetClipboardHTML(ASrcFileName, Bmp);
  finally
    Bmp.Free;
  end;
end;

procedure TClipboardEx.SetClipboardHTML(ASrcFileName: string; ABitmap: TBitmap);
var
  LSrcURL: string;
begin
  if ABitmap <> nil then
  begin
    LSrcURL := 'file :///' + ASrcFileName.Replace('\', '/');
    Clear;
    SetClipboardBitmap(ABitmap);
    SetClipboardHTML(LSrcURL, ABitmap.Width, ABitmap.Height, False);
    SetBuffer(CF_UNICODETEXT, PChar(LSrcURL)^, ByteLength(LSrcURL) + SizeOf(Char));
    SetClipboardFile(ASrcFileName);
  end;
end;

procedure TClipboardEx.SetClipboardHTML(ASourceURL: string; AWidth, AHeight: Integer; AClear: Boolean = True);
var
  LUTF8Buffer, LSourceURLUTF8: UTF8String;
  LImgLabel: UTF8String;
  LSrcLen: Integer;
  sss: string;
begin
  if AClear then Clear;
  LSourceURLUTF8 := UTF8String(StringOf(TEncoding.Convert(TEncoding.Default, TEncoding.UTF8, BytesOf(ASourceURL))));
  LSrcLen := Length(LSourceURLUTF8);

  LImgLabel := Format('<IMG width="%d" height="%d" src="%s">', [AWidth, AHeight, ASourceURL]);

  // 格式CF_HTML格式说明
  // https://learn.microsoft.com/zh-cn/windows/win32/dataxchg/html-clipboard-format
  LUTF8Buffer := Format(
          'Version:1.0'#13#10 +
          'StartHTML:%.8d'#13#10 +
          'EndHTML:%.8d'#13#10 +
          'StartFragment:%.8d'#13#10 +
          'EndFragment:%.8d'#13#10 +
          'StartSelection:%.8d'#13#10 +
          'EndSelection:%.8d'#13#10 +
          'SourceURL:%s'#13#10 +
          '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">'#13#10 +
          '<HTML><HEAD></HEAD>'#13#10 +
          '<BODY><!--StartFragment-->%s<!--EndFragment--></BODY></HTML>',
          [
          155 + 1 + LSrcLen,          // StartHTML
          300 + LSrcLen + Length(LImgLabel),    // EndHTML
          248 + LSrcLen + 20,          // StartFragment
          268 + LSrcLen + Length(LImgLabel),    // EndFragment
          248 + LSrcLen + 20,          // StartSelection
          268 + LSrcLen + Length(LImgLabel),    // EndSelection
          LSourceURLUTF8,          // SourceURL
          LImgLabel]);


  OutputDebugString(PChar(sss));
 { LHTMLBuffer := Format(
          'Version:0.9'#13#10 +
          'StartHTML:%.8d'#13#10 +
          'EndHTML:%.8d'#13#10 +
          'StartFragment:%.8d'#13#10 +
          'EndFragment:%.8d'#13#10 +
          '<html><body>'#13#10 +
          '<!--StartFragment -->'#13#10 +
          '%s'#13#10 +
          '<!--EndFragment-->'#13#10 +
          '</body></html>',
          [97, 172 + Length(LUTF8Buffer), 111, 136 + Length(LUTF8Buffer), LUTF8Buffer]);   }

   SetBuffer(FCF_HTML, PUTF8String(LUTF8Buffer)^, Length(LUTF8Buffer) + 1);
end;
----------------------------------------------
一个热爱delphi的人,Golang GUI库。 --我的博客--
作者:
男 delphiteacher (delphiteacher) ▲▲▲▲▲ -
普通会员
2023/11/28 16:54:08
8楼: 还有人在写邮件客户端吗?做外贸软件的吧。
----------------------------------------------
欢迎加入OrangeUI的app开发阵营:http://www.orangeui.cn/,联系QQ452330643
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2023/11/29 21:56:41
9楼: 在 HTML 中把图片用 Base64 编码插入,翻了一下我的代码:

function TForm1.GetFileBase64(var FileType: string): string;
var
  StrStream: TStringStream;
  FileStream: TFileStream;
begin
{----------
    关于 Delphi 官方的编码函数编码完后有回车换行符
    Result := EncodeBase64(MemoryStream.Memory, MemoryStream.Size);
    //base64默认有一个77字符后换行一次,用TCP发送时不方便,就去掉了回车换行。
    Result := StringReplace(Result, #13, '', [rfReplaceAll]);
    Result := StringReplace(Result, #10, '', [rfReplaceAll]);

    //TNetEncoding.Base64.Encode(FileStream, StrStream);
    // TNetEncoding 编码的结果,在中间加了很多回车换行符号,作为图片数据,浏览器无法显示。
----------}
  Result := '';
  if OpenDialog1.Execute then
  begin
    FileType := TPath.GetExtension(OpenDialog1.FileName);
    FileType := FileType.Remove(1, 1); //去掉前面的点
    FileStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
    StrStream := TStringStream.Create;
    try
      FileStream.Position := 0;
      IdEncoderMIME1.Encode(FileStream, StrStream); //IdEncodeMiMe 编码的数据,浏览器能够正常显示。
      Result := StrStream.DataString;
    finally
      FileStream.Free;
      StrStream.Free;
    end;
  end;
end;


以下是插入代码,其实这里是用 JS 来实现的:

procedure TForm1.AcAddPicExecute(Sender: TObject);
var
  S, FileType: string;
  i: Integer;
begin
  //插入本地图片,成功。
  S := Self.GetFileBase64(FileType);
  S := 'data:image/' + FileType + ';base64,' + S;

  S := 'document.execCommand("InsertImage", false, '+ QuotedStr(S) + ')';

  EdgeBrowser1.ExecuteScript(S);
end;
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2023/11/29 22:00:42
10楼: 如果你不想用 WebBrowser 来做,可以直接采用字符串操作的方式把图片的 Base64 编码写入 HTML 文本里面。

具体的 HTML 的语法格式,你可以上网查一下,我以前做过,不过细节不记得了。
----------------------------------------------
-
作者:
男 powerpcer (大强) ★☆☆☆☆ -
禁用账号
2023/11/30 0:50:21
11楼: ……
被禁用帐号,帖子内容自动屏蔽!
……

----------------------------------------------
呆湾傻冒
作者:
男 bird13 (13) ★☆☆☆☆ -
普通会员
2023/11/30 14:25:32
12楼: 感谢各位前辈,周末我会逐一测试,不过本人水平很有限,如有不懂的地方再来请教,再次感谢!
----------------------------------------------
-QQ:1379585
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行117.1875毫秒 RSS