2009-07-13 20 views
15

Sự bình tĩnh kinh doanh của mùa hè đã bắt đầu vì vậy tôi đã chọn di chuyển sang D2009. Tôi gần như xác định cho mọi hệ thống con của chương trình nếu chúng vẫn còn ascii, hoặc có thể là unicode, và bắt đầu porting. Nó đã được khá ok, tất cả các thành phần đã có trong phiên bản D2009 (một số, như VSTView, hơi không tương thích mặc dù) nhưng bây giờ tôi đã chạy vào một vấn đề, trong một số phần đó phải duy trì ansistring, tôi sử dụng rộng rãi TStringList, chủ yếu là một bản đồ cơ bản.D2009 TStringlist ansistring

Đã có điều gì đó dễ dàng thay thế bằng, hay tôi chỉ cần bao gồm một danh sách rút gọn được rút gọn, dựa trên nguồn Delphi hoặc FPC cũ?

Tôi không thể tưởng tượng mình là người đầu tiên gặp phải điều này?

Các thay đổi phải tương đối được bản địa hóa, do đó mã vẫn được kết hợp với BDS2006 trong khi tôi đi qua quỹ đạo xác thực. Một vài ifdefs ở đây và không có vấn đề gì. Tất nhiên string-> ansistring và char -> ansichar vv không được tính là sửa đổi trong nguồn của tôi, vì tôi vẫn phải làm điều đó, và nó hoàn toàn ngược lại.

Chỉnh sửa: Tôi đã có thể giải quyết một số nội dung trong lớp đọc/ghi. Điều này làm cho giải pháp của Mason dễ dàng hơn tôi nghĩ ban đầu. Tôi sẽ lưu ý gợi ý của Gabr là một dự phòng.

Generics là khá nhiều lý do tôi mua D2009. Đáng tiếc là họ đã làm cho FPC không tương thích mặc dù

+1

Bạn có thực hiện nhiều phép tính bao gồm số byte của chuỗi và chiều dài của chuỗi không? Beacause đây là sự hồi sinh thực sự duy nhất cho tôi để hạ cấp. – smok1

+0

Một là có, phiên bản nhị phân tương thích ngược được phiên bản. Một cái khác (mà tôi chưa bắt đầu) là một triển khai thực hiện Sax và DOM tùy chỉnh. Nhưng lý do chính là tôi không muốn giải thích cho khách hàng cách mở các tập tin văn bản unicode vv với notepad và excel, và để nó đồng bằng cũ, đồng bằng cũ. –

+1

Một lần nữa tôi bị bối rối bởi hành vi của người dùng trên SO. Năm người dùng đã cung cấp câu trả lời chu đáo cho câu hỏi này, với ít nhất 14 phiếu bầu cho đến nay từ 71 người xem, nhưng _không ai_ đã bỏ phiếu cho câu hỏi này. Không có câu hỏi nào là hoàn hảo, nhưng tôi thấy hữu ích khi đọc câu hỏi và câu trả lời - vì vậy +1 từ tôi. IMHO, ** hỗ trợ Delphi ** bao gồm hỗ trợ thảo luận thông tin về chủ đề này. – Argalatyr

Trả lời

9

Nếu theo "bản đồ", bạn có nghĩa là "bảng băm", bạn có thể thay thế bằng TDictionary chung. Hãy thử khai báo một cái gì đó như thế này:

uses 
    Generics.Collections; 

type 
    TStringMap<T: class> = TDictionary<ansiString, T>; 

Sau đó, chỉ cần thay thế StringLists của bạn bằng TStringMaps của loại đối tượng phù hợp. Ngoài ra, nếu bạn muốn từ điển sở hữu các đối tượng và giải phóng chúng khi bạn hoàn thành, hãy đổi nó thành TObjectDictionary và khi bạn gọi hàm tạo, chuyển [doOwnsValues] sang thông số thích hợp.

(. BTW nếu bạn đang sử dụng TDictionary, chắc chắn rằng bạn tải D2009 Cập nhật 3. Việc phát hành ban đầu có một số lỗi nghiêm trọng trong TDictionary khiến nó hầu như không sử dụng được)

EDIT: Nếu nó vẫn phải biên dịch theo D2006, sau đó bạn sẽ phải tinh chỉnh mọi thứ một chút. Hãy thử một cái gì đó như thế này:

type 
    TStringMap = 
{$IFDEF UNICODE} 
    class TDictionary<ansiString, TObject> 
    (Add some basic wrapper functions here.) 
    end; 
{$ELSE} 
    TStringList; 
{$ENDIF} 

Trình bao bọc không nên dùng quá nhiều công việc nếu bạn sử dụng nó làm bản đồ ngay từ đầu. Bạn mất an toàn loại bổ sung để đổi lấy tính tương thích ngược, nhưng bạn có được một bảng băm thực hiện tra cứu của nó trong thời gian O (1).

+0

Mã phải tiếp tục biên dịch với D2006 ... Nhưng có lẽ một trình bao bọc nhỏ sẽ làm, afaik Tôi đã cập nhật gần đây nhất bởi vì nó là một phiên bản giao hàng phần mềm điện tử cũ tháng. (ngoại trừ trợ giúp cập nhật 3 mà tôi đã cài đặt bằng tay) –

+0

Trong khi đó chơi nhiều hơn một chút, nhưng TDictionary không hỗ trợ bản sao. –

3

Những hệ thống con này có cần duy trì phân biệt hay chỉ cách chúng giao tiếp với thế giới bên ngoài (RS232, tệp văn bản, v.v ...)? Cũng giống như tôi làm với C#, tôi xử lý các chuỗi trong Delphi 2009 chỉ là các chuỗi và chỉ lo lắng về các chuyển đổi khi ai đó cần chúng.

Điều này cũng sẽ giúp tránh chuyển đổi tiềm ẩn không chủ ý trong mã của bạn và khi gọi các phương pháp API của Windows, cải thiện hiệu suất.

+0

các tệp văn bản, RS232 nằm ngay tại chỗ. Tuy nhiên, sự kiên trì không chỉ đơn giản là stringlist.savetostream hay như vậy, nhưng được mã hóa với các yêu cầu tương thích ngược có phiên bản nghiêm trọng. Tôi gần như làm tương tự như bạn tư vấn tại các toplevel, nhưng tôi muốn giữ hệ thống con mà trong/đầu ra ansistrings và sử dụng chúng rất nhiều nội bộ, ansistring để tránh rắc rối. Sau đó, sau khi di chuyển, tôi cập nhật những cái đã chọn thành ansistring. –

+1

Bạn nên chỉnh sửa câu hỏi của mình để đề cập đến khả năng tương thích với các phiên bản Delphi trước đó. –

+0

... để unicodestring rõ ràng. Khoảng một nửa số loại tệp là btw nhị phân. –

2

Bạn có thể sửa đổi các lớp TStrings và TStringList của Delphi 2007 (hoặc cũ hơn) và đổi tên chúng thành TAnsiStrings và TAnsiStringList. Bạn sẽ thấy rằng đó là một sửa đổi rất dễ dàng, và điều đó sẽ cung cấp cho bạn các lớp bạn cần.

+0

Tôi không thấy một trong số này trong AnsiStrings.pas hoặc trong một tìm kiếm của thư mục nguồn. –

+0

ansistrings dường như không bao gồm tansistringlist. Toàn bộ src/dir không grep vào nó? Đó là những gì tôi đã hy vọng mặc dù –

+0

Xin lỗi, xin lỗi, xin lỗi. Tôi đã sai. Nó là một sửa đổi mà không được bao gồm trong Delphi 2009 nhưng rất dễ dàng để làm. Tôi sẽ cập nhật câu trả lời của mình. – lkessler

12

JCL triển khai TAnsiStrings và TAnsiStringList trong đơn vị JclAnsiStrings.

8

TStringList.LoadFromFile/SaveToFile cũng có một tham số tùy chọn kiểu TEncoding, cho phép bạn sử dụng TStringList để lưu trữ bất kỳ loại chuỗi nào bạn muốn.

procedure LoadFromFile(const FileName: string; Encoding: TEncoding); overload; virtual; 
procedure SaveToFile(const FileName: string; Encoding: TEncoding); overload; virtual; 

Cũng lưu ý rằng theo mặc định, TStringList sử dụng ANSI làm mã để tất cả mã hiện có hoạt động như nó có.

+0

(một số độ trễ trên dòng này) Như đã nói, tôi sử dụng tstringlist làm MAP cơ bản, vì vậy tôi đã không truyền qua các phương thức này, vì tất cả các dòng có đối tượng liên kết [] –

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