用ClientDataSet编程,代码如下:
with ClientDataSet1 do
begin
title:='进入液压缸油液压力不足';
showmessage(title);//此处显示'进入液压缸油液压力不足'
FieldByName('title').AsString:=title;
showmessage(FieldByName('title').AsString);//此处却显示'进入液压缸油液压力不',少了个'不'
end;
又试了其它字串,发现只要字符串长度超过20,后面的字符就全没了。
这个问题怎么解决?什么原因?
with ClientDataSet1 do
begin
title:='进入液压缸油液压力不足';
showmessage(title);//此处显示'进入液压缸油液压力不足'
FieldByName('title').AsString:=title;
showmessage(FieldByName('title').AsString);//此处却显示'进入液压缸油液压力不',少了个'不'
end;
又试了其它字串,发现只要字符串长度超过20,后面的字符就全没了。
这个问题怎么解决?什么原因?
TDataSet如果连这基本的都完成不了,那别人还怎么用.
即便不是BUG,为什么超过20就不行了呢?DELPHI不应该限制这么短的长度吧?不是BUG,那该具体怎么解决呢?赋值后再读出就变了,难道是我代码的问题吗?肯定是DELPHI的问题,或是它有什么机制我不清楚,但为什么就限制到20呢?
谁能解决???????????
但现在我用DELPHI 好象没有这种情况出现,
用DELPHI 7遇到这种情况也没有什么大不了,
解决方法有两种,
1是在字符串后面多加几个空格,
2是用#13换行例如
showmessage('进入液压缸油'+#13+'液压力不足');
如果你在定义表时用以下Script:
Create Table Test
(...
Title Varchar(20),
...)
这样用DELPHI连过去的时候肯定是只能存20个字符的,如果可以存20个以后字符那才叫BUG,所以此处请检查你的表结构定义。其次就是在DataSet 你有没有拉成固定字段,如果拉成了固定字段还要修改字段的Size属性。回去再看看吧。这个问题很低级的。
如果你先取固定字段,后又修改数据库中字段长度,面客户端clientdataset没改就会出现这种问题。
FieldByName('title').Value;//.AsString 之类的总是出错。
FieldByName('title').asstring
好像做过三层的人不多啊:)
这年头,自己不行,就要不要说是Delphi 有BUG
什么意思嘛
getit911(Windows转Linux中) 说的FieldByName('title').asmemo,DELPHI里没这个类型呀
用#13 换行.
不过你所说的BUG 我没遇见过
另在程序中判断.若字符超长的话.做的提示.
全英文时没有这个现象
MessageBox(Self.Handle, PChar(FieldByName('title').AsString), '提示',0);其实这个Bug很容易找出来的,你看看Delphi的ShowMessage的源码就可以知道其原因了
其实问题已解决了,你只要修改一下表的定义就OK了,根本就不是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下存在。看看代码,比在这里讨论要强得多!!!
其实方法很简单自己写一个ShowMessage,把那个Label长度调就OK,顺便也可以测试一下自己D的水平呀。我就在公司写了一个MessageDlg类似的函数,就没有你说的问题,花了一个上午时间
这是一个非常著名的Bug,只要做过三层的人一定遇到过这样的问题,不知道为什么楼上有一些朋友不分青红皂白,就胡乱批评楼主一通。解决方法如下,修改Delphi源代码重新编译一下就可以了。adodb.pas 1227行
Result := Length(PWideString(@TVarData(Value),VOleStr)^);
将PWideString改为PAnsiString
确实,只要做过三层的人就知道这是一个Bug
windows那么多bug,用的人还是只增不减。