我写了一个关于字符串截取的函数,功能要求:对于一个String,其中发现有空格,则将其截为两个String。
代码如下:
function StringCut(Str : String;Num : integer): String;
var
Str1,Str2,StrAll : String;
i : integer;
begin
StrAll := Trim(Str);
For i := 0 to Length(StrAll) - 1 do
begin
if (Ord(StrAll[i]) = 32) then
begin
case Num of
1 : begin
Str1 := LeftStr(StrAll, i-1);
Result := Str1;
end;
2 : begin
Str2 := RightStr(StrAll,Length(StrAll)-i);
Result := Str2;
end;
else ;
end;
end;
end;
end;
但是在调用该函数关闭Form的时候,会出现EInvalidPointer异常,我不晓得是哪里Pointer出的错误,还请各位大侠们指点!
代码如下:
function StringCut(Str : String;Num : integer): String;
var
Str1,Str2,StrAll : String;
i : integer;
begin
StrAll := Trim(Str);
For i := 0 to Length(StrAll) - 1 do
begin
if (Ord(StrAll[i]) = 32) then
begin
case Num of
1 : begin
Str1 := LeftStr(StrAll, i-1);
Result := Str1;
end;
2 : begin
Str2 := RightStr(StrAll,Length(StrAll)-i);
Result := Str2;
end;
else ;
end;
end;
end;
end;
但是在调用该函数关闭Form的时候,会出现EInvalidPointer异常,我不晓得是哪里Pointer出的错误,还请各位大侠们指点!
解决方案 »
- 请问TfcShapeBtn控件有什么好处,我通过另一程序发按键消息到该按钮,没有响应?应该怎么处理?
- TNode的Data能否指向一个TAction??
- ListView 排序问题?
- 代码实现在combobox中显示sql server所有数据库名的问题。求助!
- 怎样通过PID取得进程的路径和所用内存大小,怎样知道登陆系统用户的权限
- 分字符串的问题
- 请问如何解决文字显示的问题。
- Delphi AnimateWindow 窗体淡入时 Invalidate 与BringToFront编写的顺序,为什么会直接影响画面的最终显示
- 一个迫在眉睫的问题,一个来自DELPHI与操作系统打架的问题。请求专家!!
- 我要弹出窗口在windows系统所有窗口的最上面,不会因为切换不同程序的窗口被掩盖?
- 有没有碰到过这样奇怪的问题??
- 登陆之前的LOAD是怎样处理的?
procedure TForm1.Button1Click(Sender: TObject);
var str1,str2,str3:string;
space:integer;
begin
str1:='123234 asdfasdf';
space:=pos(' ',str1);
str2:=copy(str1,1,space);
str3:=copy(str1,space+1,Length(str1)-space);
ShowMessage(str2);
ShowMessage(str3);
我靠,又要回两遍贴,真成了我的风格了!
不过我想知道就我的代码来看为什么在关闭Form窗体的时候会有EInvalidPointer异常发生。
tmplist: TStringList;
tmplist.Delimiter :=' ';
tmplist.DelimitedText := 'asdfasdf asdf werwer werw';
这样试试
另外你在result后应该加个break;(当然不加也是对的)我调用的时候没有出现你说的异常啊
procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(stringcut('1234 abcd',2));
end;
function TForm1.StringCut(Str : String;Num : integer): String;
var
Str1,Str2 : String;
i : integer;
begin
str := Trim(Str);
For i := 0 to Length(str) - 1 do
begin
if (Ord(str[i]) = 32) then
begin
case Num of
1 : begin
Str1 := LeftStr(str, i-1);
Result := Str1;
Break;
end;
2 : begin
Str2 := RightStr(str,Length(str)-i);
Result := Str2;
Break;
end;
else ;
end;
end;
end;
end;
For i := 0 to Length(StrAll) - 1 do ----〉For i := 1 to Length(StrAll) do function StringCut(Str : String;Num : integer): String;
var
Str1,Str2,StrAll : String;
i : integer;
begin
StrAll := Trim(Str);
For i := 0 to Length(StrAll) - 1 do //兄弟,你这里的循环变量有问题,i应该从1开始
begin
if (Ord(StrAll[i]) = 32) then
begin
case Num of
1 : begin
Str1 := LeftStr(StrAll, i-1);
Result := Str1;
end;
2 : begin
Str2 := RightStr(StrAll,Length(StrAll)-i);
Result := Str2;
end;
else ;
end;
end;
end;
end;
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, StrUtils;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}//****************************************************************************//
//**** 源代码测试 ****//
//****************************************************************************//function StringCut(Str : String;Num : integer): String;
var
Str1,Str2 : String;
i : integer;
begin
Str := Trim(Str);
For i := 0 to Length(Str) - 1 do
begin
if (Ord(Str[i]) = 32) then
begin
case Num of
1 : begin
Str1 := LeftStr(Str, i-1);
Result := Str1;
Break;
end;
2 : begin
Str2 := RightStr(Str,Length(Str)-i);
Result := Str2;
Break;
end;
else ;
end;
end;
end;
end;//************************************End!***********************************//procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := StringCut(Edit3.Text,1);
Edit2.Text := StringCut(Edit3.Text,2);
end;end.
谢谢大侠们的赐教。
STRING的索引从1开始,不是从0开始DELPHI有一个特别奇怪的BUG
当进行越界内存访问时,程序当时不会出错,但在关闭的时候会出现各种奇怪的错误
而且如果你的这个程序长时间运行的话,也会出错当时我就这个问题查程序,查了一个星期才发现福克
function PartitionString(StrV,PrtSymbol: string): TStringList;
var
iTemp: integer;
begin
result := TStringList.Create;
iTemp := pos(PrtSymbol,StrV);
while iTemp>0 do begin
if iTemp>1 then result.Append(copy(StrV,1,iTemp-1));
delete(StrV,1,iTemp+length(PrtSymbol)-1);
iTemp := pos(PrtSymbol,StrV);
end;
if Strv<>'' then result.Append(StrV);
end;
调用:
PartitionString(Str,' ');
const str='abc def';
var
SL:TStringList;
i:Integer;
begin
SL:= TStringList.Create;
SL.Clear;
SL.Delimiter:=' ';
SL.DelimitedText:=Str;
showmessage(SL.Text);
for i :=0 to SL.Count-1 do
showmessage(SL.Strings[i]);
SL.Free
end;
const str='abc def';
var
SL:TStringList;
i:Integer;
begin
SL:= TStringList.Create;
SL.Clear;
SL.Delimiter:=' ';
SL.DelimitedText:=Str;
showmessage(SL.Text);
for i :=0 to SL.Count-1 do
showmessage(SL.Strings[i]);
SL.Free
end;
索引0处入其前7个Byte是字符串的长度和引用计数。请修正,并不要再续贴。