2014-08-19 1 views
-1

Ребята Я использую Delphi XE3, и у меня есть эта ошибка, я попытался посмотреть предыдущие вопросы и попытался решить, но ошибка не исчезнет. Любой, кто использовал XE3, пожалуйста, помогите мне, так расстроен. Как еще новичок в программированииНеявная строка, отличная от ShortString до String

кнопку [dcc32 Warning] invoice_u.pas (92): W1057 неявной строка литая из 'ShortString' на 'строка'

Ниже мой код

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; 

конец ,

+3

Какая линия составляет 92? –

+0

Учитывая этот код, единственный возможный способ, по которому я вижу это предупреждение, заключается в том, что 'invoiceNumber' является' ShortString' вместо 'String', в котором строка 92 должна быть либо' dmoSales.cdsInvoice.FieldByName ('InvNumber ') .AsString: = invoiceNumber' или 'lblInvNumber.Caption: = invoiceNumber'. –

ответ

1

Мы не можем определить, к какой строке относится предупреждение, и мы не можем видеть типы всех переменных в коде. Однако предупреждающее сообщение достаточно ясно. Где вы

s := t; 

где s является string, псевдоним для UnicodeString и t является ShortString. Поскольку ShortString всегда кодируется ANSI, компилятор предупреждает вас, что вы делаете неявное преобразование из ANSI в UTF-16. Он предупреждает вас, потому что вы должны знать о таких конверсиях и быть неявным, это не сразу видно из чтения кода.

Лучший способ решить эту проблему - прекратить использование устаревшего типа ShortString. Сегодня нет места этому.

Если вы не можете заставить себя сделать это, то вы можете подавить предупреждение с явным преобразованием.

s := string(t); 

Конечно, это вызывает явное строковое бросание предупреждения W1059, но это предупреждение по умолчанию отключено.