2010-01-15 24 views
6

Tôi đang sử dụng Delphi 5 và chúng ta có phương thức để tự động tạo các điều khiển nhất định dựa trên nội dung của một bảng cơ sở dữ liệu (chúng ta tạo ra hầu hết các phần tử) và thực hiện hành động. Điều này cho phép chúng ta thêm các điều khiển đơn giản vào một biểu mẫu mà không phải biên dịch lại ứng dụng.Truy cập động một thuộc tính trong một thành phần Delphi

Tôi đã tự hỏi liệu có thể đặt thuộc tính của thành phần dựa trên tên thuộc tính có trong chuỗi để chúng tôi có thể đặt thêm tùy chọn hay không.

Pseudo-code:

Comp := TButton.Create(Self); 

// Something like this: 
Comp.GetProperty('Left').AsInteger := 100; 
// Or this: 
Comp.SetProperty('Left', 100); 

Đây có phải là có thể ở tất cả?

+1

Hãy lưu ý rằng nội dung không đúng định dạng trong cấu hình của bạn có thể đưa bạn vào các chế độ thất bại thú vị. (Đã ở đó, thực hiện điều đó.) –

Trả lời

11

Bạn phải sử dụng các Run-Time Loại Thông tin tính năng của Delphi để làm điều này:

Blog này mô tả chính xác những gì bạn đang cố gắng để làm: Run-Time Type Information In Delphi - Can It Do Anything For You?

Về cơ bản bạn có để có được tài sản thông tin, sử dụng GetPropInfo và sau đó sử dụng SetOrdProp để đặt giá trị.

var 
    PropInfo: PPropInfo; 
begin 
    PropInfo := GetPropInfo(Comp.ClassInfo, 'Left'); 
    if Assigned(PropInfo) then 
    SetOrdProp(Comp, PropInfo, 100); 
end; 

Đây không phải là súc tích như mã giả của bạn, nhưng nó vẫn thực hiện công việc. Ngoài ra nó trở nên phức tạp hơn với các thứ khác, như các thuộc tính mảng.

+0

Tuyệt vời, tôi hiện đang phân tích cú pháp một chuỗi, điều khiển ngay lập tức và thiết lập thuộc tính động! – Drarok

+0

Điều này có thể bạn quan tâm: http://www.remobjects.com/ps.aspx –

9

Từ một trong những đơn vị làm việc của tôi (trong Delphi 7 mặc dù)

var 
    c : TComponent; 

    for i := 0 to pgcProjectEdits.Pages[iPage].ControlCount - 1 do 
    begin 
    c := pgcProjectEdits.Pages[iPage].Controls[i]; 
    if c is TWinControl 
    then begin 
     if IsPublishedProp(c,'color') 
     then 
      SetPropValue(c,'color',clr); 
     if IsPublishedProp(c,'readonly')       
     then              
      SetPropValue(c,'readonly', bReadOnly); 
     ...    
    end; 
    ... 

Bạn phải bao gồm TypInfo trong báo cáo kết quả sử dụng. Không biết nếu điều này hoạt động theo Delphi 5.

+0

Ah, IsPublishedProp() đẹp hơn nhiều so với ở trên, tôi đã sử dụng kết hợp cả hai trong mã của tôi. Cảm ơn nhiều. – Drarok

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