如何修复此代码函数以将此组件编译并安装到 Delphi 10.2中?

ioekq8ef  于 2023-04-20  发布在  其他
关注(0)|答案(1)|浏览(103)

我得到这个错误:
[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组件中。
请善良,因为我不是一个专业的,也不是一个训练有素的程序员。

wz3gfoph

wz3gfoph1#

该消息是一个警告,而不是错误。它不会阻止您编译和安装组件。
您正在声明一个ShortString值的数组,而不是String值的数组。
ShortString是一个string类型,在编译时有一个显式的长度,即String[9]
ShortString使用8位AnsiChar字符,与AnsiString相同,但限制为最多255个字符。
StringAnsiString在 Delphi 2009之前的别名,但现在是UnicodeString在Delphi 2009之后的别名,其中UnicodeString使用16位WideChar字符。
参见 Delphi 文档中的String Types
(Unicode)String分配给ShortString需要在运行时进行数据转换,而该转换对于非ASCII字符> #127是有损的。这就是编译器警告您的内容。在您的特定示例中,您使用的是ASCII字符,因此在运行时不会遇到任何数据丢失,但编译器不会验证实际字符,它只查看字符串类型。
只需将数组更改为使用String而不是String[9],特别是当将ShortString值赋值给函数的Result时,无论如何都要将它们转换为String

const
  LongDayNameArray: array[1..7] of String = 
                                             ('Sunday',
                                              'Monday',                                                 
                                              'Tuesday'
                                              'Wednesday',
                                              'Thursday',
                                              'Friday',
                                              'Saturday');

在现代 Delphi 编码中很少有使用ShortString的好理由。
顺便说一句,你声称你的原始代码在 Delphi 2010中工作。UnicodeString是在Delphi 2009中添加的。所以,我上面描述的一切都适用于Delphi 2010,就像它适用于Delphi 10.2一样。

相关问题