以下のコードは、D7 の IBCustomDataSet ユニットからのものです (コードは、後の XEx バージョンではより複雑になります)。
Origin
IBX TFieldのプロパティを設定するのはこのコードです。
TIBCustomDataSet.CreateFields は、フィールドが TrueのInternalOpen
場合、データセットがそのメソッドを呼び出すときに呼び出されます。データセットのエントリがゼロの
場合FDefaultFields
、True になります。ユーザー コードまたは IDE でデータセットのフィールド エディターを使用して事前にフィールドが作成されていない場合、0 になります。 メソッドを介して TDataSet.Open によって呼び出されます。InternalOpen
FieldCount
FieldCount
InternalOpen
OpenCursor
そのため、'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 プロパティがリセットされることは避けられません。