2013-04-02 29 views
7

Tôi vừa nhìn thấy một chút mã (D5), nơi họ đã sử dụng ...Sử dụng .AsString hoặc .Text?

aStr:=tblAcct.FieldByName('Name').Text; 

Có vẻ như để làm việc tốt nhưng tôi đã luôn luôn được sử dụng ...

aStr:=tblAcct.FieldByName('Name').AsString; 

Tôi đã sử dụng cả khi tải một TMemo và một lần nữa có vẻ như không có sự khác biệt.

aMemo.Lines.Text:=tblAcct.FieldByName('History').Text; 
aMemo.Lines.Text:=tblAcct.FieldByName('History').AsString; 

Có lý do gì để tôi nên sử dụng cái kia không? Nếu có, cái nào?

Trên thực tế cho TMemo, tôi thường sử dụng ...

aMemo.Lines.Assign(tblAcct.FieldByName('History')) 

mà dường như làm việc tốt quá.

Cảm ơn

Trả lời

19

Thuộc tính Text có nghĩa là để được sử dụng để có được những đại diện văn bản của một lĩnh vực đang được chỉnh sửa trong một điều khiển DataAware, trái ngược với DisplayText bất động sản cung cấp cho bạn một chuỗi đại diện cho giá trị cho người sử dụng (nó có thể chứa dấu chấm câu hoặc khác trang trí cho giá trị đơn giản).

Chứa các chuỗi để hiển thị trong một điều khiển dữ liệu-aware khi lĩnh vực này đang trong chế độ chỉnh sửa

Một ví dụ điển hình là một TFloatField với Currency bất động sản thiết lập để True. DisplayText cung cấp cho bạn một chuỗi có số chứa dấu phẩy (nếu cần), dấu tách thập phân và ký hiệu tiền tệ. Thuộc tính Text cung cấp cho bạn một chuỗi không có dấu phẩy hoặc ký hiệu tiền tệ.

begin 
    MyFloatField.Currency := True; 
    MyFloatField.AsFloat := 1234.56; 
    A := MyFloatField.Text; //'1234.56' 
    B := MyFloatField.DisplayText; //'$1,234.56', depends on your locale 
end; 

Cả hai tính chất trên có thể được tùy chỉnh bằng văn bản một handler OnGetText sự kiện mà bạn có thể viết logic tùy chỉnh để chuyển đổi các giá trị cho một chuỗi đại diện. Tham số DisplayText cho biết chuỗi muốn có có nghĩa là đại diện cho giá trị để chỉnh sửa hay không.

Mặt khác, thuộc tính AsString sử dụng chuyển đổi đơn giản hơn giữa loại dữ liệu cơ sở và chuỗi. Mỗi hậu duệ của TField triển khai phương thức GetAsString ảo bằng cách sử dụng các hàm từ RTL để thực hiện biểu diễn đó. Theo ví dụ về TFloatField, lớp này gọi số FloatToStr() cho mục đích đó.

Tất cả điều này cho biết, các câu trả lời cho câu hỏi của bạn là: AsString trả về chuỗi giống như Text bất động sản nếu không có xử lý sự kiện OnGetText, nhưng nó có thể khác nhau nếu có một xử lý sự kiện hoặc một TField hậu duệ phi tiêu chuẩn .

Tôi không thể biết điều gì phù hợp hơn với bạn, vì nó phụ thuộc vào mục đích sử dụng cho giá trị trả về, nhưng nếu bạn đang sử dụng nó để hiển thị giá trị cho người dùng trong giao diện người dùng (làm mã của bạn ví dụ), tôi khuyên bạn nên sử dụng thuộc tính DisplayText.

+3

+1 Câu trả lời rất toàn diện –

+0

@jachguate Cảm ơn bạn đã trả lời rất chi tiết. OK, bây giờ tôi biết rằng có một sự khác biệt đáng kể nó có thể giải thích lý do tại sao tôi đã có một vấn đề với một cuộc gọi định vị cho tôi kết quả dường như không chính xác. Không phải lý do tại sao tôi hỏi câu hỏi, nhưng chi tiết của bạn đã cho tôi quay trở lại vấn đề Xác định vị trí và xem xét lại cách tiếp cận đó. Đó là một cơn gió yếu ... – user2175495

+0

Vui mừng được giúp đỡ;) – jachguate

2

AsString chứa giá trị của trường dưới dạng chuỗi.

Text chứa chuỗi hiển thị trong điều khiển nhận thức dữ liệu khi trường ở chế độ chỉnh sửa.

Vì vậy, trong trường hợp của bạn, tôi nghĩ bạn nên sử dụng AsString.

+0

Cảm ơn @Riho, điều đó đơn giản hóa một vấn đề khác mà tôi gặp phải, cũng không liên quan đến câu hỏi này, nhưng nhận xét của bạn cũng đã xóa mọi thứ. – user2175495