Delphi里有没有C++中的引用这种类型?我想使用链表,找了半天找到一个TList类,不知这个类是否可以用做链表?如果可以,但是找到的资料上说它的元素类型是Pointer,可是我希望元素是Longword类型的,应该怎么办啊?还有如果使用TList,能不能将里面的元素转成Longword?即能否如下书写?
Inc( m_List.Items[1] as Longword );
实际中它总是报错,那又如何才能转换过来?for语句里指定的记数参数,是否不能在循环体里修改?即
for index := 0 to count do
begin
    Dec( index );
end;
上面的Dec( index );就总是报错,那是否就只能用while自己来实现记数了?最后问下变量定义一定得放在代码的开头吗?

解决方案 »

  1.   

    局部变量定义一定要放在代码开头var后面
      

  2.   

    1、具体需要什么链表不清楚,最好还是自己用指针、纪录实现吧;
    2、Pointer与Longword可以强制转换,只是要注意一个问题,0与nil(出现零值时可能会中断一些处理);
    3、Inc(Longword(m_List.Items[1]));
    4、Delphi不允许在for循环中修改循环控制变量,可这永远也不会是什么缺陷啊,不用for(用while 或repeat)或使用另外的变量不就行了。例:
    for i := 0 to count do
    begin
        index := i;
        Dec( index );
    end;
      

  3.   

    Delphi里有没有C++中的引用这种类型?
    函数参数可以用 Var 我想使用链表,找了半天找到一个TList类,不知这个类是否可以用做链表?如果可以,但是找到的资料上说它的元素类型是Pointer,可是我希望元素是Longword类型的,应该怎么办啊?
    TList是链表,但它是一个指针链表,如果你希望元素是Longword类型的,那应该声明一个指向Longword的指针类型,用new创始它,然后把元素填进去,再保存到链表里还有如果使用TList,能不能将里面的元素转成Longword?即能否如下书写?
    Inc( m_List.Items[1] as Longword );
    实际中它总是报错,那又如何才能转换过来?这样做肯定不行,参考这样写
    type
    PLongWord=^LongWord;var
      plw:PLongWord;
    begin
      new(plw);
      plw^:=11;
      m_List.add(plw);
      m_List[1]^:=12;
      //现在plw^的值也成12了.
    end;
      

  4.   

    变量定义一定要写在开头的.在Var后面
      

  5.   

    or语句里指定的记数参数,是否不能在循环体里修改?即
    for index := 0 to count do
    begin
        Dec( index );
    end;
    循环变量是不能改变的.
      

  6.   

    for index := 0 to count do
    begin
        Dec( index );
    end;
    你用了for的话这个index是自己增长的,可以用do while来变向实现
    tLIST里面的是存放数据的指针的,如果你一定要放数据,你可以用tstringlist试试,但这是个字符串队列,不知道能不能符合你的要求
      

  7.   

    补充一下
    全局变量放在
    var
      Form1: TForm1;
      userid:string='019';
      username:string='aaa';
    implementation(这个上面的var里面)
    局部变量放在
    function TForm1.cxbh(mc, tablename, fieldname, fname: string): string;
    var 
    str:string;//放在函数的begin上面,用var声明
    begin
    end;
      

  8.   

    非常感谢各位的回答,多谢!!
    最后再问个小问题就完了,如何类型转换啊?
    const MAXLENGTH : Longword = 100;
    var i : Longword;
    然后我
    i := MAXLENGTH / 3;
    它报错。
    还有就是如何将Extended类型的转成Longword类型的?
      

  9.   

    真的请帮帮忙,我也知道这写问题很弱,可是它就是出错啊!!
    上面的总说类型不适合,那我要怎么才能进行整数除法啊??还有就是
    i := Longword( 12.3 );
    竟然是错的????说无效的类型转换!那类型转换有什么用?难道就只是进行类对象指针的继承转换???难道要使用数学函数来进行?如果是,能不能说一下是什么函数?我急用的。To Cipherliu(孤鹰):
        多谢你的回答,其实我之前都不知道原来^表示指针及取地址的:)。但是Delphi提供的类库的功能就那么差吗?我只是想要一个以Longword为元素的链表而已啊,不是这么惨吧!!
        你说的记录指针也太夸张了,整个存储空间增加了一倍啊,而且好多多余的操作(如取地址内容)。我并没有要求使用TList的,如果你知道有哪个链表类可以满足我的要求,能否说明一下。To  ImFool(搞技术的都是傻瓜):
        Inc(Longword(m_List.Items[1]));这个没效果啊?它总是报错,说无效的类型转换。
        而“Pointer与Longword可以强制转换,只是要注意一个问题,0与nil(出现零值时可能会中断一些处理);”中怎么进行强制转换,我上面只是浮点变整数而已它都不准,能否麻烦给个简易的代码?    抱歉上面的问题很弱,我急着要将一段VC代码转成Delphi,今天才开始了解Delphi的,多谢各位帮忙。
      

  10.   

    i := MAXLENGTH / 3;
    delphi会自动将longword格式转为Extended
    用Trunc 可以将其去尾返回整数值
    用Round 则四舍五入返回整数值
      

  11.   

    整数除用 div
     i:=MAXLENGTH div 3;
      

  12.   

    楼主: long(12.3)当然没法转,大小都不一样,跟c是不同的哲学;
    要转就得trunc or round;
    TList是用指针来存储数据的,或者说存的仅仅是对象的指针而已;用它来实现longword的存储,太浪费(至于直接将指针强制转型为longword,或可一试);
    但Tlist没记错的话,内部实现机制就是个array;就数组本身的特性而言跟链表比,插入、删除性能似乎并不理想;
    VCL库在数据结构方面是比较弱,去找点free的库吧,好比SDL;要不就照着数据结构的书抄吧;
      

  13.   

    虽然还不是很清楚如何使用TList来存储Longword,但类型转换解决了,非常感谢各位的回答!!结帖
      

  14.   

    RamjetZhang(王小桃):“VCL库在数据结构方面”绝对不“弱”!、、、、、、lop5712 (LOP) :其实,Delphi的强制类型转换确实就是什么都没做(对目标代码来说),只是在源代码级让表达式符合表达式或函数的参数类型要求而已(因为Delphi是强类型检查的,比如,C中char字符可以直接赋值给byte类型,在Delphi中这就要“转换”)。