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)
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. –
@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
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. –