function GetNumFromStr(const str: String ):pchar;stdcall ;
var
 i:integer;
 charset:Set of char;
 temp : string ;
begin charset:=['0'..'9','a'..'f','.'] ;for i := 1 to Length(str) do
  begin
    if (str[i] in charset) then
      temp:=temp+uppercase(str[i]);
  end;
  result:=@temp;
end;procedure TForm1.Button1Click(Sender: TObject);
var
p : pchar;
temp : string;
begin
   p:=GetNumFromStr(self.Edit1.Text);
   temp:=p^;
   showmessage(temp);
end;
没有提取到值,temp为空。怎么修改以上的GetNumFromStr函数?

解决方案 »

  1.   

    function GetNumFromStr(const str: String ):string;stdcall ;
    var
     i:integer;
     charset:Set of char;
     temp : string ;
    begin charset:=['0'..'9','a'..'f','.'] ;for i := 1 to Length(str) do
      begin
        if (str[i] in charset) then
          temp:=temp+uppercase(str[i]);
      end;
      result:=temp;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      temp : string;
    begin
       temp:=GetNumFromStr(self.Edit1.Text);
       showmessage(temp);
    end;
      

  2.   

    用STRING代替PCHAR
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        function GetNumFromStr(const str: String ):string;stdcall ;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
    p : string;
    temp : string;
    begin
       p:=GetNumFromStr(self.Edit1.Text);
       temp:=p;
       showmessage(temp);
    end;function TForm1.GetNumFromStr(const str: String ):string;stdcall ;
    var
     i:integer;
     charset:Set of char;
     temp : string ;
    begin charset:=['0'..'9','a'..'f','.'] ;for i := 1 to Length(str) do
      begin
        if (str[i] in charset) then
          temp:=temp+uppercase(str[i]);
      end;
      result:=temp;
    end;
    end.
      

  3.   

    // 保持PChar类型返回值不变
    function GetNumFromStr(const str: String ):pchar; stdcall;
    var
     i:integer;
     charset:Set of char;
     temp : string ;
    begin charset:=['0'..'9','a'..'f','.']; temp:= ''; // 这里可以加上
      for i := 0 to Length(str) do
      begin
        if (str[i] in charset) then
          temp:= temp + uppercase(str[i]);
      end;
      result:= @temp[1]; // 改这里
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
    p : pchar;
    temp : string;
    begin
       temp:= GetNumFromStr(self.Edit1.Text); // 和这里 直接类型转换就可以 
       //temp:=p;   
       showmessage(temp);
    end;
      

  4.   

    你是否想写动态链接库!!返回为Pchar类型的要分配内存!
    改为:
    function GetNumFromStr(const str: String ):pchar;stdcall ;
    var
     i:integer;
     charset:Set of char;
     temp : string ;
     ptemp:pchar;
    begin charset:=['0'..'9','a'..'f','.'] ;for i := 1 to Length(str) do
      begin
        if (str[i] in charset) then
          temp:=temp+uppercase(str[i]);
      end;
      Getmem(ptemp,sizeof(temp));
      copy(ptemp,temp,sizeof(temp));
      result:=ptemp;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
    p : pchar;
    temp : string;
    begin
       p:=GetNumFromStr(self.Edit1.Text);
       //temp:=p^;
       strpcopy(temp,p);
       showmessage(temp);
    end;