2017-05-15 20 views
0

디자인 타임 구성 요소로 등록한 사용자 지정 TClientDataset을 만들었습니다. 작성 방법 사용자 지정 TClientDataSet을 등록했지만 생성자에서 필드가 표시되지 않습니다.

TMyDataset = class(TClientDataset) 
public 
constructor Create(AOwner : TComponent); override; 
end; 

는,이 데이터 세트의 필드를 만든

implementation 

constructor TMyDataset.Create(aOwner : TComponent); 
var 
    lField : TStringField; 
begin 
    inherited Create(aOwner); 
    lField := TStringField.Create(Self); 
    lField.FieldName := 'NAME'; 
    lField.Dataset := Self; 
    Fields.Add(lField);  
end; 

같은

procedure Register; 
begin 
RegisterComponents('Queries', [TMyDataset]); 
end; 

같은 구성 요소를 등록하고, 형태 상 TMyDataset 떨어지고, 내가 이 데이터 집합의 필드 컬렉션에 NAME 필드가 표시되지 않습니다..

내 목표는 디자인 타임에 사용할 수 있도록 이러한 미리 정의 된 쿼리를 정의하고 등록하는 것입니다.

이 구성 요소를 사용하는 모든 사용자가이 데이터 집합의 필드를 다시 정의하지 못하도록하고 싶지만 시각적 편집기에서 cxGrid 또는 그와 같은 (자동 열 작성 등)를 계속 바인드 할 수는 있습니다.

또한이 데이터 집합은 다른 데이터 집합의 자리 표시 자입니다. Fields 컬렉션을 바인딩 할 수있는 다른 시각적 편집자에게만 Fields 컬렉션을 제공하는 역할을합니다.

내 질문은 :

내가 비주얼 편집기에서 생성자에서 만든 필드를 볼 수없고, 나는 그것이 눈에 보이는 방법을 만들 수 있습니다 왜

?

TField의 사용자 수정 사항을 DFM에 저장하지 않도록 구성 요소의 동작을 재정의하려면 어떻게해야합니까?

uses 
    SysUtils, Classes, DB, DBClient; 

type 
    TMyDataSet = class(TClientDataSet) 
    private 
    FMyStringField : TStringField; 
    function GetMyStringField: TStringField; 
    protected 
    public 
    constructor Create(AOwner : TComponent); override; 
    property MyStringField : TStringField read GetMyStringField; 
    published 
    end; 

procedure Register; 

implementation 

procedure Register; 
begin 
    RegisterComponents('Data Access', [TMyDataSet]); 
end; 

{ TMyDataSet } 

constructor TMyDataSet.Create(AOwner: TComponent); 
begin 
    inherited; 
    FMyStringField := TStringField.Create(AOwner); 
    FMyStringField.FieldName := 'NAME'; 
    FMyStringField.Size := 80; 
    FMyStringField.DataSet := Self; 
end; 

function TMyDataSet.GetMyStringField: TStringField; 
begin 
    Result := FMyStringField; 
end; 

당신은 쉽게 당신의 코드가 작동하기를 수정해야하는 방법을 식별 할 수 있어야한다 :

다음은 TMyDataSet 필드 편집기에서 보여주는 NAME 필드를 포함하여, 나를 위해 잘 작동 당신에게

답변

1

감사 비슷하게. 한 가지만 StringField Size을 생략했습니다.

[TBC]

+0

내가 필드의 AOwner는 데이터 집합의 소유자 여야한다는 생각을, 그게 내가 내 코드 – Ludo

+0

를 수정할 때 일을 무엇 감사합니다 내가 DFM의 변경을 방지하는 방법을 알고 계십니까 사용자가? (필드 추가/수정 금지)? – Ludo

+0

"수정을 막아줍니다 ..."근사하지는 않지만,이 q에 대한 SertacAkyuz의 답변은 Delphi가 내 코드를 사용하여 중복 된 '이름'필드에 대해 불평한다는 사실과 관련이 있습니다. http : //stackoverflow.com/questions/38293072/how-to-correctly-stream-a-tcollection-property-of-a-subcomponent-eg-the-colum – MartynA