2011-04-21 84 views
5

Tôi đang sử dụng một thanh tra đối tượng TMS tại thời gian chạy, nhưng giả sử câu hỏi của tôi sẽ có giá trị như nhau cho Delphi tại thời điểm thiết kế.Làm cách nào để tạo thuộc tính chỉ đọc?

Tôi muốn có thuộc tính có thể được đặt theo chương trình (tại thời gian chạy) hoặc được mã hóa cứng (tại thời điểm thiết kế). Nó sẽ được hiển thị cho người dùng vì thông tin hữu ích cho anh ta và nó có thể thay đổi theo thời gian chạy bởi chương trình nhưng không phải bởi người dùng thông qua thanh tra đối tượng.

tôi đã cố gắng

published property FileName : String read FFileName; 

và tài sản có thể nhìn thấy, nhưng nó cũng là thay đổi trong thanh tra đối tượng (và ném một chi của địa chỉ Zer0 ngoại lệ khi thay đổi) :-(

+4

Bạn tiếp tục giả định rằng điều khiển TMS hoạt động theo cách tương tự như Trình kiểm tra đối tượng của Delphi. Làm ơn dừng lại. Nó không. Lần này, sự khác biệt là Object Inspector thậm chí không hiển thị các thuộc tính chỉ đọc, do đó, điều này về "đọc địa chỉ 0" đơn giản là không áp dụng và dường như là một lỗi với TMS. –

+0

@Rob, Có một cài đặt mà bạn có thể chuyển đổi để làm cho trình kiểm tra đối tượng Delphi hiển thị các thuộc tính chỉ đọc * (hoặc không) *. Đó là một nơi nào đó trong hộp thoại tools-> options. – Johan

+0

Giải pháp giải pháp nhanh: Thả trình kiểm tra thuộc tính TMS và sử dụng trình JEDI. –

Trả lời

8

này trông giống như một hoàn toàn hợp lệ và chính xác read-only tài sản

published property FileName : String read FFileName; 

nếu bạn thêm một tài sản bổ sung mà công chúng và do đó chỉ settable trong thời gian chạy bạn đang kinh doanh:

public property RuntimeFilename: string read FFileName write FFilename; 
//note that two properties, one published and one public point to the same field. 

Tuy nhiên nếu bạn muốn hack nó và thoát khỏi những ngoại lệ trong thiết tạo mẫu Hiện
thay đổi nó để:

//Only writable during runtime. 
private 
    procedure SetFileName(Value: string); 
published 
    property FileName: string read FFileName write SetFileName; 

.... 
procedure TMyClass.SetFileName(Value: string); 
begin 
    if csDesigning in Componentstate then {do nothing} 
    else FFileName:= Value; 
end; 

Những gì tôi nghĩ cũng có thể xảy ra ...

Ngắt kết nối giữa designtime và mã runtime
Để thay đổi hành vi gian chạy của mã bạn cần chỉ thay đổi mã nguồn và loại bỏ các write ... một phần tài sản.

Điều này sẽ không có hiệu lực khi mã thiết kế mặc dù bạn cần phải cài đặt lại thành phần.
Nếu bạn thay đổi mã nguồn của thành phần đã đăng ký và bạn giữ các thay đổi trong các phần private, protected và/hoặc public của thành phần bạn thường OK.

Tuy nhiên, nếu bạn thay đổi phần published của một thành phần và bạn không cài đặt lại thành phần đó, bạn sẽ có hành vi bất thường khi khởi động.

Điều này là do trong thiết kế thời gian bạn vẫn đang làm việc với phiên bản nhị phân cũ/không thay đổi của thành phần. Phiên bản này có không có phần write bị xóa và cho phép bạn thay đổi chuỗi cơ bản FFilename.

Hãy đến thời gian chạy mã init sẽ đọc tài nguyên biểu mẫu 1) và đánh dấu một giá trị được ghi vào FFilename. Tuy nhiên, thủ tục SetFilename không còn khả dụng và do đó vi phạm quyền truy cập xảy ra trong khi khởi động chương trình.

1) (các dữ liệu đó là trong file .dfm và bây giờ được lưu trữ bên trong một tài nguyên dfm trong .exe của bạn)

2

Cách đơn giản nhất :

private 
    procedure SetFileName(Value: string); 
published 
    property FileName: string read FFileName write SetFileName; 

.... 
procedure TMyClass.SetFileName(Value: string); 
begin 
    FFileName := FFileName; 
end; 
+0

Cảm ơn bạn đã dành thời gian trả lời. Tôi đã thử điều đó nhưng người dùng có thể thay đổi giá trị thông qua thanh tra đối tượng mà tôi không muốn. Tài sản có nền màu trắng, giống như tất cả những thứ khác, và có thể được chỉnh sửa. Tôi thích nó để có một nền màu xám (giống như một hàng cố định trên một chuỗi lưới) và người dùng không được phép thay đổi giá trị của nó. (Nếu chúng ta không thể xem cách làm điều này, tôi sẽ làm cho nó riêng tư, nhưng muốn nó được xuất bản) – Mawg

+0

Có, Mawg, tài sản có thể được chỉnh sửa. Nhưng sau khi chỉnh sửa, điều khiển có tiếp tục hiển thị giá trị mới được chỉnh sửa không? Nó không nên, bởi vì giá trị của trường cơ bản đã không được thay đổi. Nếu giá trị mới xuất hiện, thì đó là một lỗi khác trong điều khiển TMS; trong Object Inspector thực, mã của Ken sẽ thành công trong việc tạo ra một thuộc tính được hiển thị ở thời gian thiết kế nhưng bỏ qua những nỗ lực chỉnh sửa nó. –

+0

@Mawg: Không có cách nào, AFAICT, để tạo thuộc tính chỉ đọc xuất hiện bị tắt. Nhưng người dùng nên tìm ra khá nhanh chóng mà cố gắng thay đổi nó không có gì; nhấn enter hoặc rời khỏi thuộc tính sẽ chuyển nó về giá trị trước đó (chỉ đọc), như @Rob đã đề cập. –

3

Đây rõ ràng là một lỗi trong thanh tra đối tượng TMS và bạn nên nộp đơn báo cáo lỗi với TMS.

+0

Nó có thể là do thiết kế. Oh chờ đã ... ngoại trừ phần bị rơi. :-) –

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