Как задать размер создаваемого поля?
Как задать длину создаваемого поля ?
Создаю LookUp поле скриптом.
Для этогто делаю в Delphi:
Теперь сам текст скрипта:
Вобщем всё работает, но лукап поле получается 20 символов.
Это по дефаулту у TStringField
Подскажите как это обойти ?
Создаю LookUp поле скриптом.
Для этогто делаю в Delphi:
fsScript.Clear;
fsScript.Parent := fsGlobalUnit;
For I := 0 To Application.ComponentCount - 1 do
fsScript.AddForm(Application.Components[i]);
with fsScript.FindClass('TField') do
AddProperty('DataSet', 'TDataSet', GetProp, SetProp);
with fsScript.FindClass('TFieldDefs') do
AddProperty('Count', 'Integer', GetProp, nil);
with fsScript.FindClass('TFieldDef') do
AddMethod('function CreateField(Owner: TComponent): TField', CallMethod);
fsScript.AddEnum('TFieldKind', 'fkData, fkCalculated, fkLookup, fkInternalCalc, fkAggregate');
{ //пытался
with fsScript.FindClass('TStringField') do
AddProperty('Size', 'Integer', GetProp, SetProp);}
procedure TRepForm.SetProp(Instance: TObject; ClassType: TClass;
const PropName: String; Value: Variant);
begin
if ClassType = TField then
begin
if PropName = 'DATASET'
then TField(Instance).DataSet := TDataSet(Integer(Value));
end;
{ //пытался
if ClassType = TStringField then
if PropName = 'SIZE'
then TStringField(Instance).Size := Integer(Value);}
end;
function TRepForm.GetProp(Instance: TObject; ClassType: TClass;
const PropName: String): Variant;
begin
Result := 0;
if ClassType = TField then
begin
if PropName = 'DATASET'
then Result := Integer(TField(Instance).DataSet);
end;
if ClassType = TFieldDefs then
if PropName = 'COUNT'
then Result := TFieldDefs(Instance).Count;
{ //пытался
if ClassType = TStringField then
if PropName = 'SIZE'
then Result := Integer(TStringField(Instance).Size);}
end;
function TRepForm.CallMethod(Instance: TObject; ClassType: TClass;
const MethodName: String; Caller: TfsMethodHelper): Variant;
begin
Result := 0;
if ClassType = TFieldDef then
if MethodName = 'CREATEFIELD' then
Result := Integer(TFieldDef(Instance).CreateField( TComponent(Integer(Caller.Params[0])) ));
end;
Теперь сам текст скрипта:
var j : Integer;
Fld, Fld1 : TField;
QSumma : TIBQuery;
begin
DM.REPORTQUERYSEx1.Close;
//В FieldDefs создать поля (чтобы получился список объектов полей) из результата запроса
//Надо чтобы поля существовали объектами, для ссылки на них при создании лукапа
for j := 0 to DM.REPORTQUERYSEx1.FieldDefs.Count - 1 do
try
If DM.REPORTQUERYSEx1.FieldByName(DM.REPORTQUERYSEx1.FieldDefs[j].Name) = nil Then;
except
DM.REPORTQUERYSEx1.FieldDefs[j].CreateField(DM.REPORTQUERYSEx1);
end;
Fld1 := TStringField.Create(Application);
//Fld1.Size := 40; // Надо чтобы эта строчка заработала !
Fld1.FieldName := 'CANTRYNAME';
Fld1.FieldKind := fkLookUp;
Fld1.KeyFields := 'IDC';
Fld1.LookupDataSet := DM.Cantrys0;
Fld1.LookupKeyFields := 'ID';
Fld1.LookupResultField := 'CANTRY';
Fld1.DataSet := DM.REPORTQUERYSEx1;
DM.REPORTQUERYSEx1.Open;
end.
Вобщем всё работает, но лукап поле получается 20 символов.
Это по дефаулту у TStringField
Подскажите как это обойти ?
Комментарии
Что то FRTeam мне нифига не подсказали.
Итак.
Пришлось в fs_idbrtti.pas исправить соответственно в SetProp
Затем перекомпилировал fsDB7.dpk
И инсталлировал dclfsDB7.dpk
Из Projects/Bpl переписал в system32 fsDB7.bpl
После чего свойство Size стало нормально изменяться.
Для чего его сделали неизменяемым - даже не представляю.