2012-04-20 34 views
5

Tôi mới ở Delphi và tôi đã di chuyển một dự án Delphi rất cũ sang Embarcadero RAD Studio 2010. Tôi đã tìm thấy một vấn đề khi sử dụng chuỗi. Đây là mã:Vô hiệu hóa các chuỗi lớn ở Delphi 2010

ProgramaResultadosType = record 
    Version: string; 
    TituloPrincipal : string; 
    BloquesResultados : VectorBloquesResultadosType; 
end; 

FileOfProgramaResultadosType = file of ProgramaResultadosType; 

Và lỗi ...

"E2155 Loại '% s' cần quyết toán - không được phép vào loại tập tin"

Tôi biết đó là một lỗi nổi tiếng đối với nhiều nhà phát triển delphi khi bạn không chỉ định kích thước chuỗi.

Về cơ bản tôi muốn hủy kích hoạt Chỉ thị chuỗi lớn như các phiên bản cũ hơn của RAD Studio, nhưng tôi không thể tìm thấy trong phiên bản 2010.

+2

Bạn đã thử sử dụng lời khuyên embarcadero [E2155: Loại '% s' cần hoàn thành - không được phép trong loại tệp (Delphi)] (http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2 /EN/html/devcommon/cm_finit_in_file_xml.html) và sử dụng một mảng char thay thế? – RRUZ

+0

D2010 không thể "hủy kích hoạt" chuỗi lớn nữa vì loại chuỗi đã trở thành Unicode. Hỗ trợ Unicode được nhúng sâu, do đó nó không thể chuyển về bất kỳ kiểu chuỗi ANSI cũ nào. Bạn nên bắt đầu xóa tất cả các loại "tệp". Họ thực sự lỗi thời. –

Trả lời

10

Chỉ cần sử dụng thay vì:

ProgramaResultadosType = record 
    Version: shortstring; 
    TituloPrincipal : shortstring; 
    BloquesResultados : VectorBloquesResultadosType; 
end; 

Nhưng lưu ý rằng:

  • Hầu hết các cuộc gọi đến một hàm RTL sẽ lần đầu tiên thực hiện một chuyển đổi vô hình mới string loại: bạn nên sử dụng tốt hơn nữa rõ ràng string chỉ sau khi đọc nội dung shortstring;
  • Trong phiên bản mới hơn của Delphi (bắt đầu với Delphi 2009), string là một chuỗi Unicode: vì vậy bạn có thể mất một số dữ liệu khi viết vào một shortstring (là một chuỗi Ansi) từ UnicodeString;
  • Có thể thêm ProgramaResultadosType = packed record có thể cần thiết nếu ứng dụng của bạn rất cũ (liên kết mặc định thay đổi xung quanh Delphi 4, AFAIR).

Vì vậy, bạn có thể phải:

  • Đọc nội dung hiện có sử dụng các cấu trúc như trên;
  • Viết bằng cách sử dụng một mô hình mới, sẵn sàng Unicode (ví dụ: một DB được nhúng như Midas, SQLite3 hoặc bất kỳ khác).

Worth reading khi chuyển đổi một ứng dụng hiện có để mới hơn phiên bản Unicode của Delphi:

+0

@David Làm thế nào để bạn biết tôi là một chiếc răng lỏng lẻo? Cảm ơn bạn đã chỉnh sửa - Tôi luôn mắc lỗi này, mà không biết ...:) –

+0

có một sự ghi nhớ: chọn có 2 "o" mà bạn có thể * chọn * từ, nhưng mất chỉ có 1 vì nếu bạn * mất * 1 bạn chỉ còn 1. –

Các vấn đề liên quan