用户名:  密码:   
您当前的位置:首页 > 程序设计 >  Delphi > 

常用Memo与Stringlist中自定义函数

上次修改时间: 2024-10-11 14:12:37      来源:网络总结      作者:钢铁长陈
上一页      路径:DSD\Learn\Delphi语言\常用控件使用说明\      下一页

常用Memo与Stringlist中自定义函数

function MsgCounter(str: string): string; //统计字数,统计汉字+字母+符号的个数,调用:MsgCounter(memo.text)或msgcounter(stringlist.txt)
function SplitString(const Input:string; Delimiter: Char): TStringList; //分割字串,例SplitString('111;222;333,444', ';')
  SourceStr := StringReplace(SourceStr, ',', '', [rfReplaceAll]);   //删除中间的逗号,如16,109MB
  SourceStr := trim(copy(SourceStr, 0, length(SourceStr) - 2));  //删除末尾的MB
function getStrToEnd(str: string; StringList: TStringList): string;//循环搜索Stringlist每行查找指定字符串,并返回该行中冒号后的内容
function GetSubstrToEnd(const SourceStr, subStr: string): string;//获取字串中指定子字串到字串尾的内容
function ExtractFromSubstringToEnd(const AText, ASubString: string): string; //获取字串中指定子字串到字串尾的内容,含子串
function getStrNum(str: string; StringList: TStringList): integer;//循环搜索Stringlist每行查找指定字符串,并返回该行中冒号后的内容判断其若不为空则返回行号
function getStr2(str1, str2: string; StringList: TStringList): string;//循环从Stringlist中str1字串往上15行中有字串str2的行冒号后的内容
function SEmptyRow(memo:TMemo; str: string): Integer;//在Memo中搜索指定字符串下面第一个空行
function FindLineStrStart(str: string; Memo: TMemo): Integer;//在Memo中查找以指定字串开头的行,返回行号
function After(Src: string; S: string): string; //返回字串Src中S字串之后的内容
function Before(Src, S: string): string; //在源字符串Src中查找子串S,返回Src中S之前的部分
function ExtractBetween(const AText, AStartString, AEndString: string): string; //复制两个字串之间的内容
function LastPos(SearchStr, Str: string): Integer;  //用以从右边开始查找第一个斜杠/的序号
//将Memo中包含指定字串的行剪切插入到指定字串后的空白行,原空白行下移,剪切行原位置删除
procedure CutLineto(memo: TMemo; Startstr, CopylineStr, EmptyStr: string);     //CutLineto(memo1,'2024','打印','一、')

procedure AddSlToMemo(Memo: TMemo; StringList: TStringList);  //将Stringlist中内容加到Memo的末尾


function IsSubstringInList(const SubStr: string; const List: TStringList): Boolean;   //判断指定字符串是否属于另一个字符串列表中某一行的子字符串

=================================================================================================================================================
function MsgCounter(str: string): string; //统计字数,统计汉字+字母+符号的个数,调用:MsgCounter(memo.text)或msgcounter(stringlist.txt)
var
  s: string; //保存字符串
  i, e, c: integer; //保存变量
begin
  s := str;
  e := 0;
  c := 0;
  for i := 1 to length(s) do
  begin
    if (ord(s[i]) >= 33) and (ord(s[i]) <= 126) then
//判断字符的顺序号
    begin
      inc(e);
    end
    else if (ord(s[i]) >= 127) then
//判断字符的顺序号
    begin
      inc(c);
    end;
  end;

  Result := IntToStr(e + (c div 2));
end;

//将字符串分割为字符串列表
function SplitString(const Input:string; Delimiter: Char): TStringList; //分割字串,例SplitString('111;222;333,444', ';')
begin
  Result := TStringList.Create;
  Result.Delimiter := Delimiter; //TStringList本身有Delimiter和DelimitedText两个属性,将参数Delimiter赋给字串列表的Delimiter
  Result.StrictDelimiter := True; // 避免将空格作为分隔符
  Result.DelimitedText := Input;
end;
//调用
 mylist := SplitString('111;222;333,444', ';');   //SplitString创建了Tstringlist,调用该函数就要释放
 
//将字符串分割为数组元素
function SplitString(const S: string; Delimiter: Char): TArray<string>;
var
  StringList: TStringList;
  i: Integer;
begin
  StringList := TStringList.Create;
  try
    StringList.Delimiter := Delimiter;
    StringList.StrictDelimiter := True;
    StringList.DelimitedText := S;
    Result := StringList.ToStringArray;   //该行可改为 Result := StringList[I]也可以返回指定数组元素
  finally
    StringList.Free;
  end;
end;

 

function getStrToEnd(str: string; StringList: TStringList): string;//循环搜索Stringlist每行查找指定字符串,并返回该行中冒号后的内容
var
  i, rowCount: Integer;
begin
  Result := '0';
  rowCount := StringList.Count;
  for i := 0 to rowCount - 1 do
  begin
    if Pos(str, StringList[i]) > 0 then
    begin
      Result := GetSubstrToEnd(StringList[i], ':');
      Break;
    end;
  end;
end;

function GetSubstrToEnd(const SourceStr, subStr: string): string;//获取字串中指定子字串到字串尾的内容,不含子串
var
  i: Integer;
begin
  i := Pos(subStr, SourceStr);
  if i > 0 then
    Result := Trim(Copy(SourceStr, i + Length(subStr), Length(SourceStr) - i + 1))
  else
    Result := '';
end;

function ExtractFromSubstringToEnd(const AText, ASubString: string): string; //获取字串中指定子字串到字串尾的内容,含子串
var
  StartPos: Integer;
begin
  Result := '';
 
  StartPos := Pos(ASubString, AText);
  if StartPos > 0 then
  begin
    Result := Copy(AText, StartPos, Length(AText) - StartPos + 1);
  end;
end;

//用于查找网关不为空的行号
function getStrNum(str: string; StringList: TStringList): integer;//循环搜索Stringlist每行查找指定字符串,并返回该行中冒号后的内容判断其若不为空则返回行号
var
  i, rowCount: Integer;
begin
  Result := 0;
  rowCount := StringList.Count;
  for i := 0 to rowCount - 1 do
  begin
    if Pos(str, StringList[i]) > 0 then
    begin
      if GetSubstrToEnd(StringList[i], ':') <> '' then
      begin
        Result := i;
        break;
      end;
    end;
  end;
end;

function getStr2(str1, str2: string; StringList: TStringList): string;//循环从Stringlist中str1字串往上15行中有字串str2的行冒号后的内容
var
  i, sline: Integer;
begin
  Result := '0';
  sline := getStrNum(str1, StringList);
  for i := sline downto sline - 15 do
  begin
    if Pos(str2, StringList[i]) > 0 then
    begin
      Result := GetSubstrToEnd(StringList[i], ':');
      break
    end;
  end;
end;

function TWeeklyFr.SEmptyRow(memo:TMemo; str: string): Integer;//在Memo中搜索指定字符串下面第一个空行
var
  i,j,LinePos:Integer;
begin
      for i := 0 to memo.Lines.Count-1 do
      begin
        if Pos(str, memo.Lines[i])>0 then
        begin
         LinePos := i;
        for j:= LinePos to LinePos+20 do
        begin
          if memo.Lines[j]='' then
          begin
            Result:= j;
            Exit;
          end;
        end;
        end;
      end;
end;

function TWeeklyFr.FindLineStrStart(str: string; Memo: TMemo): Integer;//在Memo中查找以指定字串开头的行,返回行号
var
  i:integer;
begin
  for i:= 0 to Memo.Lines.Count-1 do
  begin
    if Copy(Memo.Lines[i], 1, Length(str))=str then
    begin
     Result:=i;
     Break;
    end;
  end;
end;

//将Memo中包含指定字串的行剪切插入到指定字串后的空白行,原空白行下移,剪切行原位置删除
procedure TWeeklyFr.CutLineto(memo: TMemo; Startstr, CopylineStr, EmptyStr: string);     //CutLineto(memo1,'2024','打印','一、')
var
  i,Starta,line:Integer;
  str:string;
begin
  Starta:= FindLineStrStart(Startstr,Memo);
  for i := Starta to Memo.Lines.Count-1 do
  begin
    if Pos(CopylineStr, Memo.Lines[i])>0 then
     begin
      str := Memo.Lines[i];    //复制当前行
      Memo.Lines.Delete(i);   //删除当前行
      Memo.Lines.Insert(SEmptyRow(Memo,EmptyStr), str);
     end;
  end;
end;

function After(Src: string; S: string): string; //返回字串Src中S字串之后的内容
var
  F: Word;
begin
  if Src = '' then
    After := '';
  F := Pos(S, Src);
  if F = 0 then
    After := ''
  else
    After := Copy(Src, F + Length(S), Length(Src));
end;

function Before(Src, S: string): string; //在源字符串Src中查找子串S,返回Src中S之前的部分
var
  F: Word;
begin
  if Src = '' then
    Before := '';
  F := Pos(S, Src);
  if F = 0 then
    Before := S
  else
    Before := Copy(Src, 1, F - 1);
end;

function ExtractBetween(const AText, AStartString, AEndString: string): string; //复制两个字串之间的内容
var
  StartPos, EndPos: Integer;
begin
  Result := '';

  StartPos := Pos(AStartString, AText);
  if StartPos > 0 then
  begin
    StartPos := StartPos + Length(AStartString);
    EndPos := Pos(AEndString, AText, StartPos);
    if EndPos > StartPos then
    begin
      Result := Copy(AText, StartPos, EndPos - StartPos);
    end;
  end;
end;

function LastPos(SearchStr, Str: string): Integer; ////找到SearchStr在Str中最后出现的位置
var
  i: Integer;
  TempStr: string;
begin
  Result := Pos(SearchStr, Str);
  if Result = 0 then
    Exit;
  if (Length(Str) > 0) and (Length(SearchStr) > 0) then
  begin
    for i := Length(Str) + Length(SearchStr) - 1 downto Result do
    begin
      TempStr := Copy(Str, i, Length(Str));
      if Pos(SearchStr, TempStr) > 0 then
      begin
        Result := i;
        break;
      end;
    end;
  end;
end;

function LastPos(const SearchStr, Str: string): Integer; //找到SearchStr在Str中最后出现的位置
begin
  Result := LastIndexOf(Str, SearchStr, Length(Str));
end;

//判断指定字符串是否属于另一个字符串列表中某一行的子字符串
function IsSubstringInList(const SubStr: string; const List: TStringList): Boolean;
var
  i: Integer;
begin
  Result := False; // 默认未找到
  for i := 0 to List.Count - 1 do
  begin
    if Pos(SubStr, List[i]) > 0 then
    begin
      Result := True; // 找到匹配项
      Exit; // 退出函数
    end;
  end;
end;

将Stringlist中内容加到Memo的末尾
procedure AddSlToMemo(Memo: TMemo; StringList: TStringList);
begin
  // 确保 Memo 和 StringList 都不为空
  if (Memo <> nil) and (StringList <> nil) then
  begin
    // 将 StringList 的内容追加到 Memo 的末尾
    Memo.Lines.BeginUpdate; // 开始批量更新,避免频繁重绘
    try
      Memo.Lines.AddStrings(StringList);
    finally
      Memo.Lines.EndUpdate; // 结束批量更新
    end;
  end;
end;