请问高手,俺有一段串口程序,在implementation   uses {$R *.dfm}后定义的,在form1里可以调用函数SendData,在别的form里就不能调用了,请问如何解决,焦急等待中...?function Hex(c: char): Integer;
var
  x: Integer;
begin
  if (Ord(c) >= Ord('0')) and (Ord(c) <= Ord('9')) then
    x:= Ord(c) - Ord('0')
  else if (Ord(c) >= Ord('a')) and (Ord(c) <= Ord('f')) then
    x:= Ord(c) - Ord('a') + 10
  else if (Ord(c) >= Ord('A')) and (Ord(c) <= Ord('F')) then
    x:= Ord(c) - Ord('A') + 10
  else
    x:= -1;                     //输入错误
  Result:= x;
end;//*******************************************************************
//该函数接收1~2个,字符转换成功后输出对应16进制数的值,否则输出-1
//*******************************************************************
function HexToInt(Str: string): Integer;
var
  tmpInt1, tmpInt2: Integer;
begin
  if Length(Str) = 1 then
  begin
    Result:= Hex(Str[1]);
  end
  else if Length(Str) = 2 then
  begin
    tmpInt1:= Hex(Str[1]);
    tmpInt2:= Hex(Str[2]);
    if (tmpInt1 = -1) or (tmpInt2 = -1) then
      Result:= -1
    else
      Result:= tmpInt1 * 16 + tmpInt2;
  end
  else
    Result:= -1;                                  //输入错误,转换失败
end;//***********************
//该函数发送数据
//***********************
function SendData(v: string): string;
var
  Len: Integer;
  i, Count, MaxCount, tmpInt: Integer;
  tmpvar: Variant;
  tmpStr, Output: string;
begin
  Len:= 0;
  Count:= 1;
  MaxCount:= 1;
    //发送二进制数,需要使用Variant变量矩阵,矩阵大小自动调节
    if HexSend then
    begin
      Output:=v;
      Len:= Length(Output);
      if Len > 0 then
      begin
        i:= 1;
        //创建一个Variant数组
        tmpvar:= VarArrayCreate([1, 1], varByte);
        while (i < Len) do
        begin
          //转换为16进制
          tmpStr:= Copy(Output, i, 2);
          tmpStr:= LowerCase(tmpStr);
          tmpInt:= HexToInt(tmpStr);
          if tmpInt = -1 then
          begin
            ShowMessage('发送的数据格式有问题!');
            Exit;
          end
          else
          begin
            if Count = (MaxCount+1) then
            begin
              Inc(MaxCount);     //增大Variant数组
              VarArrayRedim(tmpvar, MaxCount);    //Resizes a Variant Array
            end;
           tmpvar[Count]:= tmpInt;
           Inc(Count);
          end;
          i:= i + 2;
        end;
      // MSComm.Output:= tmpvar;
        Result:=tmpvar;
      end
    end
    else
    Result:=v;
end;

解决方案 »

  1.   

    只能用于本单元你可以在本单元中声明这个过程,并public,然后在其他地方使用 实例(如Form1).Hex()来调用
      

  2.   

    放到
    implementation  前面先声明。
      

  3.   

    function SendData(v: string): string; implementation{$R *.dfm}function SendData(v: string): string; 
    var 
      Len: Integer; 
      i, Count, MaxCount, tmpInt: Integer; 
      tmpvar: Variant; 
      tmpStr, Output: string; 
    begin 
      Len:= 0; 
      Count:= 1; 
    ...............
      

  4.   

    俺调用'senddata',为什么有下面的提示?
    Undeclared identifier: 'senddata'
      

  5.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  //  在這裏聲明下
      function Hex(c: char): Integer;
      function HexToInt(Str: string): Integer;
      function SendData(v: string): string;
    var
      Form1: TForm1;implementation{$R *.dfm}function Hex(c: char): Integer;
    var
      x: Integer;
    begin
      if (Ord(c) >= Ord('0')) and (Ord(c) <= Ord('9')) then
        x:= Ord(c) - Ord('0')
      else if (Ord(c) >= Ord('a')) and (Ord(c) <= Ord('f')) then
        x:= Ord(c) - Ord('a') + 10
      else if (Ord(c) >= Ord('A')) and (Ord(c) <= Ord('F')) then
        x:= Ord(c) - Ord('A') + 10
      else
        x:= -1;                    //输入错误
      Result:= x;
    end;//*******************************************************************
    //该函数接收1~2个,字符转换成功后输出对应16进制数的值,否则输出-1
    //*******************************************************************
    function HexToInt(Str: string): Integer;
    var
      tmpInt1, tmpInt2: Integer;
    begin
      if Length(Str) = 1 then
      begin
        Result:= Hex(Str[1]);
      end
      else if Length(Str) = 2 then
      begin
        tmpInt1:= Hex(Str[1]);
        tmpInt2:= Hex(Str[2]);
        if (tmpInt1 = -1) or (tmpInt2 = -1) then
          Result:= -1
        else
          Result:= tmpInt1 * 16 + tmpInt2;
      end
      else
        Result:= -1;                                  //输入错误,转换失败
    end;//***********************
    //该函数发送数据
    //***********************
    function SendData(v: string): string;
    var
      Len: Integer;
      i, Count, MaxCount, tmpInt: Integer;
      tmpvar: Variant;
      tmpStr, Output: string;
    begin
      Len:= 0;
      Count:= 1;
      MaxCount:= 1;
        //发送二进制数,需要使用Variant变量矩阵,矩阵大小自动调节
        if HexSend then
        begin
          Output:=v;
          Len:= Length(Output);
          if Len > 0 then
          begin
            i:= 1;
            //创建一个Variant数组
            tmpvar:= VarArrayCreate([1, 1], varByte);
            while (i < Len) do
            begin
              //转换为16进制
              tmpStr:= Copy(Output, i, 2);
              tmpStr:= LowerCase(tmpStr);
              tmpInt:= HexToInt(tmpStr);
              if tmpInt = -1 then
              begin
                ShowMessage('发送的数据格式有问题!');
                Exit;
              end
              else
              begin
                if Count = (MaxCount+1) then
                begin
                  Inc(MaxCount);    //增大Variant数组
                  VarArrayRedim(tmpvar, MaxCount);    //Resizes a Variant Array
                end;
              tmpvar[Count]:= tmpInt;
              Inc(Count);
              end;
              i:= i + 2;
            end;
          // MSComm.Output:= tmpvar;
            Result:=tmpvar;
          end
        end
        else
        Result:=v;
    end;procedure TForm1.FormCreate(Sender: TObject);
    beginend;end.
      

  6.   

    在调用处的单元中要use 包含function SendData(v: string): string; 
    的单元名
      

  7.   

    不让在implementation 之前声明
      

  8.   

    要public出来,然后再引用函数所在单元即可