首页 > 其他分享 >DBGridEh 在粘贴中文时出现乱码和错位

DBGridEh 在粘贴中文时出现乱码和错位

时间:2024-04-12 10:11:36浏览次数:18  
标签:begin AColumn DBGridEh SelStart Text 乱码 Grid end 粘贴

unit DBGridEh; 

把下面这个函数替换成这样

procedure TDBGridInplaceEdit.WMPaste(var Message: TMessage);
var
  ClipboardText: WideString;
  FSearchText, AText, tmpText: WideString;
  AColumn: TColumnEh;
  Idx: Integer;
  CanChange, TextLocated, CanTryEdit: Boolean;
  EditKeyValue: Variant;
  NewSelStart: Integer;
begin
  if Grid.AllowedOperationUpdate and Column.CanModify(False) then
    if ((EditStyle = esDataList) or (Column.GetColumnType = ctKeyPickList)) then
    begin
      if Clipboard.HasFormat(CF_TEXT)
        then ClipboardText := Clipboard.AsText
        else Exit;
      with Grid do AColumn := Columns[SelectedIndex];
      FSearchText := Copy(Text, 1, SelStart) + ClipboardText + Copy(Text, SelStart + SelLength + 1, MAXINT);
      CanTryEdit := False;
      TextLocated := False;
      AText := FSearchText;
      if (EditStyle = esDataList) and (AColumn.UsedLookupDataSet <> nil) then //lookup
      begin
        EditKeyValue := Null;
        if AColumn.UsedLookupDataSet.Locate(AColumn.Field.LookupResultField, FSearchText,
          [loCaseInsensitive, loPartialKey]) then
        begin
          AText := AColumn.UsedLookupDataSet.FieldByName(AColumn.Field.LookupResultField).Text;
          EditKeyValue := AColumn.UsedLookupDataSet.FieldValues[AColumn.Field.LookupKeyFields];
          TextLocated := True;
          CanTryEdit := True;
        end
        else if Assigned(AColumn.OnNotInList) then
          CanTryEdit := True;

        if CanTryEdit then
        begin
          Grid.DataLink.Edit;
          CanChange := Grid.Datalink.Editing;
          if CanChange then
          begin
            Grid.Datalink.Modified;
            Text := AText;
            SelStart := Length(Text);
            if TextLocated
              then SelLength := Length(FSearchText) - SelStart
              else SelLength := 0;
            Grid.FEditKeyValue := EditKeyValue;
            Grid.FEditText := Text;
            if Assigned(FDataList) then FDataList.KeyValue := Grid.FEditKeyValue;
          end;
        end;
      end else //keypicklist
      begin
        Idx := StringsLocate(AColumn.PickList, FSearchText, [loCaseInsensitive, loPartialKey]);
        if (Idx <> -1) and Grid.CanEditModifyText then
        begin
          AText := AColumn.PickList[Idx];
          TextLocated := True;
          CanTryEdit := True;
        end
        else if Assigned(AColumn.OnNotInList) then
          CanTryEdit := True;

        if CanTryEdit then
        begin
          SelStart := Length(AText);
          if TextLocated
            then SelLength := Length(FSearchText) - SelStart
            else SelLength := 0;

          Grid.DataLink.Edit;
          CanChange := Grid.Datalink.Editing;
          if CanChange then Grid.Datalink.Modified;
          Text := AText;

          Grid.FEditText := Text;
          if Assigned(FPickList) then FPickList.ItemIndex := Idx;
        end;
      end;
    end else
    begin
      if EditCanModify and
          ( Clipboard.HasFormat(CF_TEXT) or
            Clipboard.HasFormat(CF_OEMTEXT) or
            Clipboard.HasFormat(CF_UNICODETEXT)
          )  then
      begin
        with Grid do AColumn := Columns[SelectedIndex];
        ClipboardText := Clipboard.AsText;
        AText := AColumn.GetAcceptableEditText(ClipboardText);

        tmpText := Text;
        FSearchText := Copy(tmpText, 1, SelStart) + AText + Copy(tmpText, SelStart + SelLength + 1, MAXINT);
        NewSelStart := Length(Copy(tmpText, 1, SelStart) + AText);
        Grid.DataLink.Edit;
        if Grid.Datalink.Editing then
        begin
          Grid.Datalink.Modified;
          Text := FSearchText;
          SelStart := NewSelStart;
          Grid.FEditText := Text;
          SendMessage(Handle, EM_SCROLLCARET, 0,0);
        end;
      end else
        inherited;
    end;
end;

 

转载于:https://www.cnblogs.com/CodeGear/p/4480440.html

标签:begin,AColumn,DBGridEh,SelStart,Text,乱码,Grid,end,粘贴
From: https://www.cnblogs.com/0n355/p/18130600

相关文章

  • 文件下载时中文文件名乱码及链接失效问题解决
    问题:报错提示11-Apr-202415:38:43.792信息[Catalina-utility-2]org.apache.catalina.startup.HostConfig.deployDirectoryWeb应用程序目录[G:\开发工作用软件\Java开发用\apache-tomcat-10.1.7\webapps\manager]的部署已在[293]毫秒内完成11-Apr-202415:38:44.573信息......
  • 复制粘贴中的隐藏字符
    pdf电子书上的代码往往带有1234等行号,这些行号就实用上说很没必要,要说讲解说明这是说的第几行,可以下文照例引用多一次,看的更清楚还不用回头按着行号找,度一下君子之心,是在给复制代码制造障碍,前缀行号得一个个删多痛苦,那就编写一个脚本自动来删了。python语法迥异于C系列,写着写着就......
  • windows MYSQL解决中文乱码问题
    windowsMYSQL解决中文乱码问题1.首先确保你已经把mysql配置了环境变量2.打开window终端3.输入mysql-uroot-p4.输入密码,就是安装的时候设置的root超级管理员权限密码5.输入:SHOWVARIABLESLIKE‘character%’; 出现上图,说明就会出现中文乱码问题。6.该怎么办呢,接......
  • VS Code 中设置 Markdown 粘贴图片的位置
    1.在VSCode中,按下Ctrl+,,打开设置界面。2.在搜索框中输入markdown.copy,找到Markdown>CopyFiles:Destination3. 新增配置项key为"**/*.md",value为你的目标路径。比如我想将图片放在assets 目录下markdown文件同名的目录下,那么我就可以设置为 assets/${docu......
  • 解决idea中Terminal终端无法执行GIT命令+Terminal 中文乱码
    参考文档:https://blog.csdn.net/qq_44830363/article/details/107096825 在使用IDEA进行开发的时候,经常会用到Git进行代码管理,如果再开一个Docker窗口的话,窗口切换来切换去的很不方便为了简单方便,我们可以直接在IDEA中使用自带的Terminal,这样就可以达到在IDEA主界......
  • dotnet8中控制台应用中文乱码问题
    也许是因为系统是非中文,也许是LSTC修改版的系统,在dotnet8下开发控制台应用,出现了中文乱码显示问号的问题。经查阅,使用nuget包并设置中文编码,可解决。不知UTF-8编码是否也能正常显示中文,我没试。在项目内引用nuget包。<ItemGroup><PackageReferenceInclude="System.Te......
  • mvn test -Dtest 运行结果中文乱码
    问题:mvntest-Dtest运行结果中文乱码 解决方法:maven-complier-plugin中添加encoding设置 效果: ......
  • 如何避免WordPress中文乱码现象
    在使用WordPress网站的过程中,很多用户都会遇到中文乱码的问题。中文乱码会给用户阅读和浏览网站带来困扰,也可能影响网站的用户体验和搜索引擎优化。在本篇文章中,我们将介绍一些解决WordPress中文乱码问题的方法,并提供具体的代码示例。1、设置数据库字符集:首先,要确保数据库字符集......
  • WordPress网站乱码怎么办?快速解决方案
    在使用WordPress建立网站的过程中,有时候会遇到网站页面出现乱码的情况,这会影响用户体验和网站的可读性。造成网站乱码的原因可能有很多,比如字符编码设置不正确、插件冲突、主题代码问题等。本文将为您介绍一些快速解决WordPress网站乱码问题的具体方法,并提供相应的代码示例。1.......
  • 告别复制粘贴,文件夹名称一键替换
    在数字化发展全面的现代,我们经常使用那些形形色色的电子设备和程序进行文件的管理。然而,在日常使用中,我们常常陷入一种重复劳动的困境——复制粘贴。每当需要修改大量相似文件的名称时,这种重复的操作无疑让人疲惫。好在,现在有了一键替换文件夹名称的方法,它如同神一般降临,让我们......