我得到这个错误:
[dcc32警告] xcalndr3.pas(733):W1058隐式字符串转换,从“string”到“ShortString”可能会丢失数据
我来自 Delphi 2010,在那里工作没有问题。我是一个初学者。
function TXBaseCalendar.GetCellText(ACol, ARow: Integer):string;
const
LongDayNameArray: ARRAY[1..7] OF STRING[9]=
('Sunday',
'Monday',
'Tuesday'
'Wednesday',
'Thursday',
'Friday',
'Saturday');
var
DayNum: Integer;
begin
if ARow = 0 then { day names at tops of columns }
begin
if FUseShortDayNames Then
Result := ShortDayNames[(StartOfWeek + ACol) mod 7 + 1]
else
Result := LongDayNameArray[(StartOfWeek + ACol) mod 7 + 1];
end
else
begin
DayNum := FMonthOffset + ACol + (ARow - 1) * 7;
if (DayNum < 1) or (DayNum > DaysThisMonth) then Result := ''
else Result := IntToStr(DayNum);
end;
end;
{ SelectCell override - returns false for cells that shouldn't be selected }
function TXBaseCalendar.SelectCell(ACol, ARow: Longint): Boolean;
begin
Result := inherited SelectCell(ACol, ARow);
if ((not FUpdating) and FReadOnly) or (CellText[ACol, ARow] = '') then
Result := False;
if FBlockWeekends and ((ACol = 0) or (ACol = 6)) then
Result := False;
end;
{ SetCalendarDate - property access method to set calendar focused date }
procedure TXBaseCalendar.SetCalendarDate(Value: TDateTime);
begin
if Value <> FDate then
begin
FDate := Value;
UpdateCalendar;
end;
end;
如果省略ShortDayNames
数组和LongDayNameArray
,我可以构建、编译并将其安装到我的VCL组件中。
请善良,因为我不是一个专业的,也不是一个训练有素的程序员。
1条答案
按热度按时间wz3gfoph1#
该消息是一个警告,而不是错误。它不会阻止您编译和安装组件。
您正在声明一个
ShortString
值的数组,而不是String
值的数组。ShortString
是一个string
类型,在编译时有一个显式的长度,即String[9]
。ShortString
使用8位AnsiChar
字符,与AnsiString
相同,但限制为最多255个字符。String
是AnsiString
在 Delphi 2009之前的别名,但现在是UnicodeString
在Delphi 2009之后的别名,其中UnicodeString
使用16位WideChar
字符。参见 Delphi 文档中的String Types。
将
(Unicode)String
分配给ShortString
需要在运行时进行数据转换,而该转换对于非ASCII字符> #127
是有损的。这就是编译器警告您的内容。在您的特定示例中,您使用的是ASCII字符,因此在运行时不会遇到任何数据丢失,但编译器不会验证实际字符,它只查看字符串类型。只需将数组更改为使用
String
而不是String[9]
,特别是当将ShortString
值赋值给函数的Result
时,无论如何都要将它们转换为String
。在现代 Delphi 编码中很少有使用
ShortString
的好理由。顺便说一句,你声称你的原始代码在 Delphi 2010中工作。
UnicodeString
是在Delphi 2009中添加的。所以,我上面描述的一切都适用于Delphi 2010,就像它适用于Delphi 10.2一样。