Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 从短字符串到字符串的隐式字符串转换_Delphi_Implicit Conversion - Fatal编程技术网

Delphi 从短字符串到字符串的隐式字符串转换

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

伙计们,我使用的是Delphi XE3,我有一个错误,我试着看看前面的问题,并试图解决相应的问题,但错误不会消失。任何使用过XE3的人请帮助我,我很沮丧。还是个编程新手

[dcc32警告]发票u.pas(92):W1057隐式字符串从'ShortString'转换为'string'

下面是我的代码

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:=发票编号