首页 > 其他分享 >dev like 函数 widechar 版本

dev like 函数 widechar 版本

时间:2023-11-02 14:22:37浏览次数:32  
标签:AEscapeFlag begin p1 end like dev char widechar l1

function Like(p1: PChar; l1: Integer; p2: PChar; l2: Integer;
  percent_char, underline_char, escape_char: Char): Boolean; overload;
var
  c: Char;
  AEscapeFlag: Boolean;
begin
  AEscapeFlag := False;
  repeat
    Dec(l2);
    if l2 < 0 then Break;
    c := p2^;
    p2 := p2 + 1;
    if (escape_char <> #0) and not AEscapeFlag and (c = escape_char) then
    begin
      AEscapeFlag := True;
      Continue;
    end;
    if not AEscapeFlag and (c = percent_char) then
    begin
      if l2 = 0 then
      begin
        Result := True;
        Exit;
      end;
      while l1 > 0 do
      begin
        if Like(p1, l1, p2, l2, percent_char, underline_char, escape_char) then
        begin
          Result := True;
          Exit;
        end;
        p1 := p1 + 1;
        Dec(l1);
      end;
      Result := False;
      Exit;
    end;
    Dec(l1);
    if l1 < 0 then
    begin
      Result := False;
      Exit;
    end;
    if (AEscapeFlag or (c <> underline_char)) and (c <> p1^) then
    begin
      Result := False;
      Exit;
    end;
    AEscapeFlag := False;
    p1 := p1 + 1;
  until False;
  Result := l1 = 0;
end;

function Like(p1: PWideChar; l1: Integer; p2: PWideChar; l2: Integer;
  percent_char, underline_char, escape_char: WideChar): Boolean; overload;
var
  c: WideChar;
  AEscapeFlag: Boolean;
begin
  AEscapeFlag := False;
  repeat
    Dec(l2);
    if l2 < 0 then Break;
    c := p2^;
    p2 := p2 + 1;
    if (escape_char <> #0) and not AEscapeFlag and (c = escape_char) then
    begin
      AEscapeFlag := True;
      Continue;
    end;
    if not AEscapeFlag and (c = percent_char) then
    begin
      if l2 = 0 then
      begin
        Result := True;
        Exit;
      end;
      while l1 > 0 do
      begin
        if Like(p1, l1, p2, l2, percent_char, underline_char, escape_char) then
        begin
          Result := True;
          Exit;
        end;
        p1 := p1 + 1;
        Dec(l1);
      end;
      Result := False;
      Exit;
    end;
    Dec(l1);
    if l1 < 0 then
    begin
      Result := False;
      Exit;
    end;
    if (AEscapeFlag or (c <> underline_char)) and (c <> p1^) then
    begin
      Result := False;
      Exit;
    end;
    AEscapeFlag := False;
    p1 := p1 + 1;
  until False;
  Result := l1 = 0;
end;

function LikeStr(const AStr, APatternStr: string; APercent, AUnderline: Char): Boolean;
var
  vPatternStr, vStr: WideString;
  vPercent, vUnderline:WideChar;
begin
 //赋值给widechar\widestring 系统自动去转
 vPatternStr := APatternStr;
 vStr := AStr;
 vPercent := WideChar(APercent);
 vUnderline := WideChar(AUnderline);
 //没有开启启自动补全则走原来的功能
 case AutoCompleteLikeSearch of
  False: Result := Like(PChar(AStr), Length(AStr), PChar(APatternStr),
    Length(APatternStr), APercent, AUnderline, #0);
  True:
  begin
   vPatternStr := APatternStr;
   //为了适应filterRow功能不受影响,否则FilterRow会出现左右各多一个%
   if (Pos('%', APatternStr) = 0) and (Pos('_', APatternStr) = 0)then
     vPatternStr := Format('%%%s%%', [APatternStr]);
   Result := Like(PWideChar(vStr), Length(vStr), PWideChar(vPatternStr),
    Length(vPatternStr), vPercent, vUnderline, WideChar(#0));
  end;
 end;
end;

 

经过测试,在低版本DELPHI。如果对接 “纪帅", "退" 这两个是否模糊匹配是返回成功的。这个是因为低版本DELPHI 不是widechar的
所以要多写一个widechar 版本出来。
AutoCompleteLikeSearch  这个是定义的全部变量开关,要不要自动补全%% 这里不开的话,还是走原来的dev 自己的版本。
正确应该是都要走widechar版本才对

标签:AEscapeFlag,begin,p1,end,like,dev,char,widechar,l1
From: https://www.cnblogs.com/BTag/p/17805300.html

相关文章

  • Not creating XLA devices, tf_xla_enable_xla_devices not set TypeError: 'mod
     2021-02-2622:54:13.146272:Itensorflow/core/common_runtime/gpu/gpu_device.cc:1406]CreatedTensorFlowdevice(/job:localhost/replica:0/task:0/device:GPU:0with2989MBmemory)->physicalGPU(device:0,name:GeForceGTX1050,pcibusid:0000:01:0......
  • 【虹科干货】Redis企业版给DevOps团队带来了哪些价值?
    内存太贵?现代化转型太难?还在花费精力维护数据库基础设施?RedisEnterprise在开源版的基础上增加了一整套包含管理、自动化、弹性以及安全等方面的功能,使其更适合企业级的应用场景。那么,RedisEnterprise如何能成为为您节约成本的选择? 文章速览:发现1:为应用程序和数据库提供更......
  • Learn DevOps-第一章:Introduction
    IntroductionDevOps的定义有很多种,AWS对其定义如下:“DevOpsisthecombinationofcuturalphilosophies,practices,andtoolsthatincreasesanorganization'sabilitytodeliverapplicationsandservicesathighvelocity.”即DevOps是一种理念、实践和工具的组合,可......
  • 一文讲透DevOps理论体系的演进
    一、前言当前,我国处于以信息化、数字化、网络化、智能化为特征的科技变革浪潮中,企业数字化转型大势所趋,那么作为支撑企业IT运转的运营体系也在向多元方向发展,比如DevOps(研发运营一体化)、AIOps(智能运维)、DataOps(数据研发运营一体化)、MLOps(机器学习研发运营一体化)、BizDevOps......
  • 一文讲透DevOps理论体系的演进 | 京东云技术团队
    一、前言当前,我国处于以信息化、数字化、网络化、智能化为特征的科技变革浪潮中,企业数字化转型大势所趋,那么作为支撑企业IT运转的运营体系也在向多元方向发展,比如DevOps(研发运营一体化)、AIOps(智能运维)、DataOps(数据研发运营一体化)、MLOps(机器学习研发运营一体化)、BizDevOps(......
  • 界面控件DevExpress WinForms Gauge组件 - 实现更高级别数据可视化
    DevExpressWinForms控件包含了超过150个随时可用的仪表盘预设,包括圆形,数字,线性和状态指示器等,来帮助用户实现更高级的数据可视化。DevExpressWinForms有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。同时能完美构建流畅、美观且易于使用的应用程序,无论是......
  • MySQL的create table as 与create table like区别
    一、区别对于mysql的复制相同表结构方法,有createtableas和createtablelike两种:createtablet2asselect*fromt1;as创建出来的t2表(新表)缺少t1表(源表)的索引信息,只有表结构相同,没有索引。createtablet2liket1;like创建出来的新表包含源表的完整表结构和索引......
  • [Azure Developer]把Azure Function中ILogger对象静态化为静态方法提供日志记录
    问题描述在AzureFunction代码中,有默认的ILogger对象来记录函数的日志,如果函数引用了一些静态对象,是否有办法使用这个默认的ILogger对象来记录日志呢?usingSystem.Net;usingMicrosoft.Azure.Functions.Worker;usingMicrosoft.Azure.Functions.Worker.Http;usingMicrosoft.Ext......
  • [Azure Developer]把Azure Function中ILogger对象静态化为静态方法提供日志记录
    问题描述在AzureFunction代码中,有默认的ILogger对象来记录函数的日志,如果函数引用了一些静态对象,是否有办法使用这个默认的ILogger对象来记录日志呢?usingSystem.Net;usingMicrosoft.Azure.Functions.Worker;usingMicrosoft.Azure.Functions.Worker.Http;usingMicrosoft......
  • Linxu解决systemctl启动服务失败,Error: No space left on device【转】
    查看磁盘空间实际占用情况查看磁盘inodes占用情况这两部发现都没有问题。要是哪里发现被沾满了,直接删除解放空间。此篇是讲另一种情况。查看默认inotify的max_user_watches值[root@VM-4-4-centosnginx]#sysctlfs.inotifyfs.inotify.max_queued_events=16384fs.inotif......