2010-01-25 2 views
0

발생합니다. 폼에 클래스를 등록 할 수 있도록 클래스를 구성 요소로 등록했습니다.Lazarus 구성 요소에 속성을 퍼블리시하면 리눅스에서 Lazarus의 'Access violation'이

내가 게시 할 수있는 속성이 문자열 및 정수와 같은 간단한 유형으로 제한된다는 점을 제외하고는 매력적으로 작동합니다.
TStringList 또는 TImage와 같은 속성을 게시하려고 할 때마다 개체 관리자에서 해당 개체를 클릭하면 '액세스 위반'이 발생합니다.

본인의 코드를 표준 구성 요소와 비교했지만, 그 코드가 다른 것을 실제로 볼 수는 없습니다.

그럼 개체 속성에서 이러한 속성을 사용하는 데 필요한 추가 단계는 무엇입니까?

답변

0

이것은 델파이와 거의 동일하다고 생각합니다. 복잡한 유형의 디자인은 표시/편집을 처리하는 디자인 타임 코드가 있어야합니다.

+0

이 문제에 대한 몇 가지 문서를 알려줄 수 있습니까? 지금까지 읽은 문서 중 복잡한 유형의 특수 처리에 대해서는 언급하지 않았습니다. :( – lyle

2

클래스 속성을 초기화하려면 : 1. 구성 요소 생성자 내에 해당 속성을 만듭니다. 따라서 결코이 될 수 없습니다. 2. 새 값에서 구성 요소로 지정해야합니다. 따라서 구성 요소에서 Assign 메서드 또는 AssignTo를 구현해야합니다. 예 :

TMyComponent = class 
private 
    FString: TStrings; 
published 
    property Strings: TStrings read FStrings write SetStrings; 
end; 

constructor TMyComponent.Create(AOwner: TComponent); 
begin 
    inherited Create(AOwner); 
    // always create it in the constructor so it will not be nil 
    FStrings := TStringList.Create; 
end; 

procedure TMyComponent.SetStrings(const AValue: TStrings); 
begin 
    // this is correct statement 
    FStrings.Assign(AValue); 
    // this is not correct 
    // FStrings := AValue; 
end; 
관련 문제