Как задать размер создаваемого поля?

отредактировано July 2006 Раздел: FastScript
Как задать длину создаваемого поля ?

Создаю 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

Подскажите как это обойти ?

Комментарии

  • отредактировано 00:25
    Сам же и нашёл как это делается.
    Что то FRTeam мне нифига не подсказали.

    Итак.

    Пришлось в fs_idbrtti.pas исправить
          //AddProperty('Size', 'Integer', GetProp, nil);
          AddProperty('Size', 'Integer', GetProp, SetProp);
    
    соответственно в SetProp
        else if PropName = 'ASVARIANT' then
          _TField.AsVariant := Value
        else if PropName = 'SIZE' then
          _TField.Size := Value
        else if PropName = 'VALUE' then
          _TField.Value := Value
    

    Затем перекомпилировал fsDB7.dpk
    И инсталлировал dclfsDB7.dpk

    Из Projects/Bpl переписал в system32 fsDB7.bpl

    После чего свойство Size стало нормально изменяться.
    Для чего его сделали неизменяемым - даже не представляю.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.