Delphi 从短字符串到字符串的隐式字符串转换
伙计们,我使用的是Delphi XE3,我有一个错误,我试着看看前面的问题,并试图解决相应的问题,但错误不会消失。任何使用过XE3的人请帮助我,我很沮丧。还是个编程新手 [dcc32警告]发票u.pas(92):W1057隐式字符串从'ShortString'转换为'string' 下面是我的代码Delphi 从短字符串到字符串的隐式字符串转换,delphi,implicit-conversion,Delphi,Implicit Conversion,伙计们,我使用的是Delphi XE3,我有一个错误,我试着看看前面的问题,并试图解决相应的问题,但错误不会消失。任何使用过XE3的人请帮助我,我很沮丧。还是个编程新手 [dcc32警告]发票u.pas(92):W1057隐式字符串从'ShortString'转换为'string' 下面是我的代码 procedure TfrmInvoice.btnCreateClick(Sender: TObject); begin dmoSales.cdsInvoice.Insert; // insert a
procedure TfrmInvoice.btnCreateClick(Sender: TObject);
begin
dmoSales.cdsInvoice.Insert; // insert a new record
dmoSales.cdsInvoice.FieldByName('InvNumber').AsString := invoiceNumber;
dmoSales.cdsInvoice.FieldByName('CustNumber').AsString :=
dmoSales.cdsCustomer.FieldByName('CustNumber').AsString;
dmoSales.cdsInvoice.FieldByName('InvDate').AsDateTime := Date;
dmoSales.cdsInvoice.FieldByName('InvPaid').AsBoolean := chkInvPaid.Checked;
dmoSales.cdsInvoice.Post; // save new record
end;
procedure TfrmInvoice.FormClose(Sender: TObject; var Action: TCloseAction);
begin
dmoSales.cdsCustomer.Close;
if dmoSales.cdsInvoice.ChangeCount > 0 then
dmoSales.cdsInvoice.ApplyUpdates(0);
dmoSales.cdsInvoice.Close;
end;
procedure TfrmInvoice.FormShow(Sender: TObject);
var
numberOfRecords : integer;
todaysDate : TDateTime;
begin
dmoSales.cdsInvoice.Open;
//get todays date so that the year can be extracted
//add DateUtils to uses clause for YearOf function
todaysDate := Today;
invoiceNumber:= IntToStr(YearOf(todaysDate));
//get the current number of invoices so that it can be added to invoiceNumber
numberOfRecords := dmoSales.cdsInvoice.RecordCount + 1;
//create invoice number
case numberOfRecords of
1..9: invoiceNumber := invoiceNumber + '000' + IntToStr(numberOfRecords);
10.99: invoiceNumber := invoiceNumber + '00' + IntToStr(numberOfRecords);
100..999: invoiceNumber := invoiceNumber + '0' + IntToStr(numberOfRecords);
else
invoiceNumber := invoiceNumber + IntToStr(numberOfRecords);
end;
//display invoice number on form
lblInvNumber.Caption := invoiceNumber;
//get the date and display it on the form
lblDate.Caption := DateToStr(Date);
// get the customers into alphabetic order (using an SQL query)
dmoSales.cdsCustomer.Close; // close the dataset before making changes
dmoSales.sdsCustomer.CommandType := ctQuery; // set dataset up as a query
dmoSales.sdsCustomer.CommandText := 'SELECT*FROM Customer ORDER BY CustName';
dmoSales.cdsCustomer.Open;
dmoSales.cdsCustomer.Refresh;
end;
结束。我们无法判断警告适用于哪一行,也无法看到代码中所有变量的类型。然而,警告信息非常清楚。在你喜欢的地方
s := t;
其中,s
是一个字符串
,UnicodeString的别名
,t
是一个短字符串
。由于ShortString
始终是ANSI编码的,因此编译器警告您正在进行从ANSI到UTF-16的隐式转换。它向您发出警告,因为您应该知道这种转换,并且由于是隐式的,所以阅读代码时不会立即看到它
解决此问题的最佳方法是停止使用已弃用的长ShortString
类型。今天真的没有地方放了
如果您无法做到这一点,则可以通过显式转换来抑制警告
s := string(t);
当然,这会引发显式字符串强制转换警告,但默认情况下该警告处于关闭状态 给定此代码,我看到出现警告的唯一可能方式是,如果
invoiceNumber
是ShortString
,而不是String
,其中第92行必须是dmoSales.cdsInvoice.FieldByName('InvNumber').AsString:=发票编号
或lblInvNumber.Caption:=发票编号
。