用ClientDataSet编程,代码如下:
with ClientDataSet1 do
  begin
    title:='进入液压缸油液压力不足';
    showmessage(title);//此处显示'进入液压缸油液压力不足'
    FieldByName('title').AsString:=title;
    showmessage(FieldByName('title').AsString);//此处却显示'进入液压缸油液压力不',少了个'不'
  end;  
又试了其它字串,发现只要字符串长度超过20,后面的字符就全没了。
这个问题怎么解决?什么原因?

解决方案 »

  1.   

    晕,别老是有事没事叫BUG,
    TDataSet如果连这基本的都完成不了,那别人还怎么用.
      

  2.   

    title:String,
    即便不是BUG,为什么超过20就不行了呢?DELPHI不应该限制这么短的长度吧?不是BUG,那该具体怎么解决呢?赋值后再读出就变了,难道是我代码的问题吗?肯定是DELPHI的问题,或是它有什么机制我不清楚,但为什么就限制到20呢?
    谁能解决???????????
      

  3.   

    一楼说的很清楚了,不要看着Delphi查查数据库里的这个表的字段定义是不是只有40字节!!
      

  4.   

    我的这个字段类型是ftString的呀。难道DELPHI就限制ftString为20个?
      

  5.   

    DELPHI7这个问题我也有遇到过,
    但现在我用DELPHI 好象没有这种情况出现,
    用DELPHI 7遇到这种情况也没有什么大不了,
    解决方法有两种,
    1是在字符串后面多加几个空格,
    2是用#13换行例如
      showmessage('进入液压缸油'+#13+'液压力不足');
      

  6.   

    将你的'title'字段的DisplayWidth属性值,默认的20改成其他的,比如40就可以了
      

  7.   

    首先,这位老兄,这根本就不是一个BUG,这是你使用错误。这里以SQL SERVER为例:
    如果你在定义表时用以下Script:
    Create Table Test
    (...
     Title Varchar(20),
     ...)
    这样用DELPHI连过去的时候肯定是只能存20个字符的,如果可以存20个以后字符那才叫BUG,所以此处请检查你的表结构定义。其次就是在DataSet 你有没有拉成固定字段,如果拉成了固定字段还要修改字段的Size属性。回去再看看吧。这个问题很低级的。
      

  8.   

    修改数据库列的长度为varchar,长度为254 OK
      

  9.   

    clientdataset双击后会出现固定字段编辑框。选择你取的字段,在属性里面有个size看看是不是这个size设置太小了!
    如果你先取固定字段,后又修改数据库中字段长度,面客户端clientdataset没改就会出现这种问题。
      

  10.   

    我把字段改成Memo类型的,但怎么读取啊?
    FieldByName('title').Value;//.AsString 之类的总是出错。
      

  11.   

    说实话,D的BUG是多,但先看看是不是自己的问题,与这样的标题,吓死人呀你。
      

  12.   

    FieldByName('title').asmemo
    FieldByName('title').asstring
      

  13.   

    楼上不少兄弟都说楼主大惊小怪,呵呵,其实楼主说得很对,确实是Delphi的Bug,
    好像做过三层的人不多啊:)
      

  14.   


    这年头,自己不行,就要不要说是Delphi 有BUG
    什么意思嘛
      

  15.   

    老实说,这个题目是大了,确实存在长度的问题,但怎样实现无长度设置的问题?
    getit911(Windows转Linux中) 说的FieldByName('title').asmemo,DELPHI里没这个类型呀
      

  16.   

    是FieldByName('title').asstring,应该可以了
      

  17.   

    天呐!!!???@@@###%%^^^&*&^&$%#^%#$#@#@$#@!$#@%!$%$&%(&^*^%$#%@$#!
      

  18.   

    是FieldByName('title').asstring就是用这个不行呀
      

  19.   

    其实你使用XXXX+#13+XXXXX就可以了
    用#13 换行.
    不过你所说的BUG 我没遇见过
      

  20.   

    字段的长度是由你来决定的,VarChar类型的字段最长可以有255个字符.
      

  21.   

    我把DisplayWidth和Size都设为255也不管用。
      

  22.   

    你先看看数据库里的字段长度,改大点然后再用ClientDataSet从数据库中取表结构,然后再试试你所谓的BUG存不存在。
      

  23.   

    把你所操作的数据库表的'title'字段,设长一点.如100
    另在程序中判断.若字符超长的话.做的提示.
      

  24.   

    这确实是showmessage的一个BUG
    全英文时没有这个现象
      

  25.   

    可以在showmessage('XXXXXX'+'   ') 加上一些空格或许能解决
      

  26.   

    用MessageBox把
    MessageBox(Self.Handle, PChar(FieldByName('title').AsString), '提示',0);其实这个Bug很容易找出来的,你看看Delphi的ShowMessage的源码就可以知道其原因了
      

  27.   

    fim(镇江DJ)(DJ=DelphiJava)这位老兄,我用了三年的 Delphi 怎么也没有发现这样的BUG呀。
      

  28.   

    这也叫BUG啊?不要滥用名词好不好?
    其实问题已解决了,你只要修改一下表的定义就OK了,根本就不是DELPHI的问题!
      

  29.   

    不明白就问,不要老是说查到BUG,Borland有哪么多BUG,还有人用吗???
    如今的程序员啊
      

  30.   

    好象是我说得有点不对了。不过你还是看看Delphi的源代码就可以知道了。
    Delphi7中好象是修正了这个Bug:你看看ShowMessage和InputQuery中计算字符串显示长度的函数吧,以下是Delphi中Dialogs单元中求字符平均长度的函数:function GetAveCharSize(Canvas: TCanvas): TPoint;
    var
      I: Integer;
      Buffer: array[0..51] of Char;
    begin
      for I := 0 to 25 do Buffer[I] := Chr(I + Ord('A'));
      for I := 0 to 25 do Buffer[I + 26] := Chr(I + Ord('a'));
      GetTextExtentPoint(Canvas.Handle, Buffer, 52, TSize(Result));
      Result.X := Result.X div 52;
    end;Delphi是用这个函数的值乘上串的长度得到一个数Len来调整Form的宽度,这个本身问题不是很大。但如果是严格的说,这种方法是不精确的!!在Delphi5中,我记不太清楚了,好象Label的AutoSize求宽度就是用到这个函数---其实这个就是问题的所有根源。
    可以看这一段代码片段:
      Form := TForm.Create(Application);
      with Form do
        try
          Canvas.Font := Font;
          DialogUnits := GetAveCharSize(Canvas);
          BorderStyle := bsDialog;
          Caption := ACaption;
          ClientWidth := MulDiv(180, DialogUnits.X, 4);.................至于调那个信息串的长度是集成在TLabel组件内部的,因为他创建的TLabel的AutoSize=True来实现的。
    但Delphi7中的计算宽度的方法不一样了,是这样的
    procedure TCustomLabel.AdjustBounds;
    const
      WordWraps: array[Boolean] of Word = (0, DT_WORDBREAK);
    var
      DC: HDC;
      X: Integer;
      Rect: TRect;
      AAlignment: TAlignment;
    begin
      if not (csReading in ComponentState) and FAutoSize then
      begin
        Rect := ClientRect;
        DC := GetDC(0);
        Canvas.Handle := DC;
        DoDrawText(Rect, (DT_EXPANDTABS or DT_CALCRECT) or WordWraps[FWordWrap]);
        Canvas.Handle := 0;
        ReleaseDC(0, DC);
        X := Left;
        AAlignment := FAlignment;
        if UseRightToLeftAlignment then ChangeBiDiModeAlignment(AAlignment);
        if AAlignment = taRightJustify then Inc(X, Width - Rect.Right);
        SetBounds(X, Top, Rect.Right, Rect.Bottom);
      end;
    end;最终是调
    DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
    来实现的,这个API是没有问题的,我测试(我曾经写了一个InputQuery一样的函数,来支持中文,就用到这个函数---其实说Copy可能要好一点[:)])。所有你说的不应该是不会在D7下存在。看看代码,比在这里讨论要强得多!!!
      

  31.   

    对,你不说要解决问题嘛?
    其实方法很简单自己写一个ShowMessage,把那个Label长度调就OK,顺便也可以测试一下自己D的水平呀。我就在公司写了一个MessageDlg类似的函数,就没有你说的问题,花了一个上午时间
      

  32.   

    to 高天兄:
      这是一个非常著名的Bug,只要做过三层的人一定遇到过这样的问题,不知道为什么楼上有一些朋友不分青红皂白,就胡乱批评楼主一通。解决方法如下,修改Delphi源代码重新编译一下就可以了。adodb.pas 1227行
    Result := Length(PWideString(@TVarData(Value),VOleStr)^);
    将PWideString改为PAnsiString
      

  33.   

    fim(镇江DJ)(DJ=DelphiJava)所说的bug以前是有现在改了,楼主用的是Delphi第几个版本?
      

  34.   

    本来就是Bug,想不到这么多自称"红星"的人却没头没脑,哈哈!真可笑!
    确实,只要做过三层的人就知道这是一个Bug
      

  35.   

    有能力就改,没能力就饶过去。哪个软件没有bug啊。。
    windows那么多bug,用的人还是只增不减。
      

  36.   

    大家都说了,这是你的Title字段长度设为的20,只要在数据库中调整期大小就OK了.