小弟的BCB程序中用到了部分Delphi代码,在BCB6和BCB2007中都编译运行正常,但在2009中报错了,小弟对Delphi不熟,看哪位能帮忙看一下是什么原因,代码如下: Delphi(Pascal) code
function Find_Codabar(c:char):integer;
var
    i:integer;
begin
    for i:=0 to High(tabelle_cb) do
    begin
        if c = tabelle_cb[i].c then
        begin
            result := i;
            exit;
        end;
    end;
    result := -1;
end;var
    i, idx : integer;
begin
    result := tabelle_cb[Find_Codabar('A')].data + '0';    -->这条语句在RAD2009中报[DCC Error](1048): E2008 Incompatible types错误,BCB6和2007都没有问题   
        for i:=1 to Length(FText) do
    begin
        idx := Find_Codabar(FText[i]);
        result := result + tabelle_cb[idx].data + '0';
    end;
    result := result + tabelle_cb[Find_Codabar('B')].data;
end;

解决方案 »

  1.   

    加个类型转换?都没有看到result和 tabelle_cb[Find_Codabar('A')].data 是什么类型的
      

  2.   

    tabelle_cb[Find_Codabar('A')].data
    是字符串类型嘛?
      

  3.   


    function T1DBarcodes.Code_Codabar:string;
    type TCodabar =
    record
    c : char;
    data : array[0..6] of char;
    end;const tabelle_cb: array[0..19] of TCodabar = (
    ( c:'1'; data:'5050615'  ),
    ( c:'2'; data:'5051506'  ),
    ( c:'3'; data:'6150505'  ),
    ( c:'4'; data:'5060515'  ),
    ( c:'5'; data:'6050515'  ),
    ( c:'6'; data:'5150506'  ),
    ( c:'7'; data:'5150605'  ),
    ( c:'8'; data:'5160505'  ),
    ( c:'9'; data:'6051505'  ),
    ( c:'0'; data:'5050516'  ),
    ( c:'-'; data:'5051605'  ),
    ( c:'$'; data:'5061505'  ),
    ( c:':'; data:'6050606'  ),
    ( c:'/'; data:'6060506'  ),
    ( c:'.'; data:'6060605'  ),
    ( c:'+'; data:'5060606'  ),
    ( c:'A'; data:'5061515'  ),
    ( c:'B'; data:'5151506'  ),
    ( c:'C'; data:'5051516'  ),
    ( c:'D'; data:'5051615'  )
    );
    这是tabelle_cb的定义
      

  4.   

    Char 改 AnsiChar 看看
      

  5.   

    好像Delphi2009的char和string等严格了很多.
    用如string()之类的转换试试.
      

  6.   

    data是数组,你没有加下标导致的吧,试试data[i] i是你数组的下标
      

  7.   

    我试了下,问题不是出在tabelle_cb[Find_Codabar('A')].data,而是后面的'0'。
      

  8.   

    Char 改 AnsiChar 看看
      

  9.   

    如果你的代码今后不会回到6、7、2007之类的旧IDE,那么可以考虑用TStringBuilder类型来处理字符串的建立。从你的代码看,Result一直都是用来存储不断变长的字符串,效率很低。如果用TStringBuilder来做,效率高不说,通过Append方法来添加后续字符,原来 + 操作带来的类型隐式类型转换都可以被避免。这样把TStringBuilder的最后结果赋值给Result就好了。
      

  10.   

    这段代码其实不是我写的,我只是在BCB的代码里调用了一下这里头的几个函数,原来这些函数在BCB6,2007里头都没有问题,改成2009后,就出现了这个错误,这只是其中的一个函数,还有一个函数也是同样的问题,我对DELPHI又不太熟,所以来请教这里路过的各位高手。因此我希望能就改动这一条语句就排除这个错误就好了,不要动太多的地方。
      

  11.   

    没装2009,不清楚。 
    你的tabelle_cb[Find_Codabar('A')].data 返回的是array of char类型,在2009中,听说字符串都是UniCode,应该不能与array of char连接吧。
    建议将tabelle_cb[Find_Codabar('A')].data 做个转换,再连接看看。 没环境,没2009资料。纯推理。
      

  12.   

      你用一个数组加一个字符这个做法本来就研格,什么时候报错都不知道,哪天出了错查死你,
    D2009能在编译的时候就不通过,我觉得这个非常好。Delphi原来编译提示功能就是不太强举例:在D里面下面的代码是正常,程序跑的也很好.function Hello(const s:string):Boolean;
    begin
       showmessage(s);
    end;如果哪天有人调用这句就死定了,永远成立不了 if Hello('ddd') then 我感得这样D还应该加强这方面
    以下代码在C#编译通不过,将会提示没有返回值,我想没人会喜欢上面那种不提示的,如果有人说喜欢的话,那就无语了...public bool Hello(string s)
    {
       MessageBox.Show(s);}
      

  13.   

    类似与下面这种定义
    function Hello(const s:string):Boolean; 
    begin 
      showmessage(s); 
    end; Delphi是有警告的,你视而不见罢了。
      

  14.   

      楼上的兄弟说的没错,Delphi在编译时在Message view里会有warning,hint里会有这个提示,但程序依然编译通过,
    但是这下面的提示又有几个人会真正的去注意呢.但这个带来的结果是,有可能程序查了两天了,结果才发现原来这里少了个
    返值,D2009这个依然没有加强,真希望下一版有所改变
      

  15.   

    result := tabelle_cb[Find_Codabar('A')].data + '0';
    这句话的功能是求两个字符ascll值的和吗?
      

  16.   

    函数的返回值是Integerresult := StrToInt(tabelle_cb[Find_Codabar('A')].data + '0');
      

  17.   

    function T1DBarcodes.Code_Codabar:string;
    type TCodabar =
    改成
    function T1DBarcodes.Code_Codabar:Ansistring;
    type TCodabar =