以下のコードは、D7 の IBCustomDataSet ユニットからのものです (コードは、後の XEx バージョンではより複雑になります)。
OriginIBX TFieldのプロパティを設定するのはこのコードです。
TIBCustomDataSet.CreateFields は、フィールドが TrueのInternalOpen
場合、データセットがそのメソッドを呼び出すときに呼び出されます。データセットのエントリがゼロの
場合FDefaultFields、True になります。ユーザー コードまたは IDE でデータセットのフィールド エディターを使用して事前にフィールドが作成されていない場合、0 になります。 メソッドを介して TDataSet.Open によって呼び出されます。InternalOpenFieldCountFieldCountInternalOpenOpenCursor
そのため、'CreateFields' が実行Origin
され、結果としてデータセット フィールドのプロパティがリセットされるのを回避する方法は、データセットを開く前に、これらの方法 (IDE またはユーザー コード) のいずれかを使用してフィールドを作成することです。つまり、Originこれらの方法のいずれかでプロパティを設定すると、リセットされるのを回避できます。
procedure TIBCustomDataSet.CreateFields;
var
FieldAliasName, RelationName : String;
i : Integer;
f : TField;
begin
inherited;
for i := 0 to FQSelect.Current.Count - 1 do
with FQSelect.Current[i].Data^ do
begin
{ Get the field name }
SetString(FieldAliasName, aliasname, aliasname_length);
SetString(RelationName, relname, relname_length);
f := FindField(FieldAliasname);
if Assigned(f) then
begin
if (RelationName <> '') and (FieldAliasName <> '') then
f.Origin := RelationName + '.' + FieldAliasName;
end;
end;
end;
更新 TIBCustomDataSet.InternalOpen の実装は、XE4 と XE6 の間で明らかに変更されたため、CreateFields は無条件で呼び出されるようになりました (つまり、DefaultFields が True であるかどうかに関係なく)。したがって、既存の TFields を使用しても、CreateFields が呼び出されて Origin プロパティがリセットされることは避けられません。