

常用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;