我写了一个关于字符串截取的函数,功能要求:对于一个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出的错误,还请各位大侠们指点!

解决方案 »

  1.   

    何必那么麻烦,用pos就可以了
    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);
      

  2.   

    漏了个end
    我靠,又要回两遍贴,真成了我的风格了!
      

  3.   

    多谢hellolongbin(一个人)指点,让我又学到了简便的算法。
    不过我想知道就我的代码来看为什么在关闭Form窗体的时候会有EInvalidPointer异常发生。
      

  4.   

    var 
      tmplist: TStringList;
    tmplist.Delimiter :=' ';
    tmplist.DelimitedText := 'asdfasdf asdf werwer werw';
    这样试试
      

  5.   

    没必要声明strall这个变量
    另外你在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;
      

  6.   

    字符串的索引是从1开始,而不是从0开始
    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;
      

  7.   

    那我把全部代码贴出来,大侠看看
    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.
      

  8.   

    唉,我也不晓得为什么,在工程文件引用ShareMem单元,问题就解决了。郁闷
    谢谢大侠们的赐教。
      

  9.   

    没引用单元也不能出EInvalidPointer异常吧
      

  10.   

    OK 知道了
    STRING的索引从1开始,不是从0开始DELPHI有一个特别奇怪的BUG
    当进行越界内存访问时,程序当时不会出错,但在关闭的时候会出现各种奇怪的错误
    而且如果你的这个程序长时间运行的话,也会出错当时我就这个问题查程序,查了一个星期才发现福克
      

  11.   

    给你一个更简单的:
    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,' ');
      

  12.   

    procedure TForm1.Button1Click(Sender: TObject);
    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;
      

  13.   

    delphi的字符串强大但有的时候比较难以理解。Delphi的字符串(string)是一个特殊的格式, 在字符串地址的前面4位,保存了字符串的长度。索引要从1开始。而C/C++类型的string类型就是一个以‘/0’结尾的字符串。
      

  14.   

    还是 anbangs(菜鸟邦) 的办法最好,有现成的功能就直接用,用不着再自己写程序
      

  15.   

    ??c/c++有string类型么?孤陋寡闻,我只知道有个AnsiString类型……
      

  16.   

    C++  中的string 是STL中的string吧。。
      

  17.   

    procedure TForm1.Button1Click(Sender: TObject);
    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;
      

  18.   

    String是delphi动态分配、自我消毁、引用计数的“智能”类型,其存储的第一个字符索引从1开始。
    索引0处入其前7个Byte是字符串的长度和引用计数。请修正,并不要再续贴。