Новая заморочка.

отредактировано 12:46 Раздел: FastScript
Требуется в компонент TIBQuery добавить лукап поле на другую таблицу.
Дело в том, то Napravs - совсем из другой базы. Итак.

Имеем:
DM : TDataModule;
в нём REPORTQUERYSEx1 : TIBQuery;

В коде:
fsScript.AddForm(DM);

В скрипте:
begin
 with DM.REPORTQUERYSEx1.FieldDefs do
  begin
   with AddFieldDef do begin
     Name      := 'NAPRAVNAME';
     DataType  := ftString;
     Size := 40;
     FieldKind := fkLookup;
     KeyFields := 'IDN';
     LookupDataSet     := 'Napravs';
     LookupKeyFields   := 'ID';
     LookupResultField := 'NAME';
     Visible := True;
   end;
  end;
  ShowMessage('OK');
end.

Получаю ошибку:
Неопределённый идентификатор:'FieldKind'

Пробовал:
fsScript.AddType('TFieldKind', fvtEnum);
fsScript.AddEnumSet('TFieldKind', 'fkData, fkCalculated, fkLookup, fkInternalCalc, fkAggregate');

Не помогает.

Коллеги, если хоть кто то может помочь, не оставляйте без внимания плиз. Иначе незнаю к кому еще обратиться.

Комментарии

  • vixvix
    отредактировано 12:46
    Короче вот такая фигня если ты нечего не изменял с TFieldDef то по умолчанию этот класс поддерживает такие свойства:

    TFieldDef = class(TPersistent)
    property Attributes: TFieldAttributes
    property ChildDefs: Class TFieldDefs
    property DataType: TFieldType
    property Name: String
    property Precision: Integer
    property Size: Integer

    как видишь среди них нету свойства FieldKind! Вывод его надо добавить, а как, а вот так:

    with fsScript do
    FindClass('TFieldDef') do
    begin
    AddProperty('FieldKind', 'TFieldKind', GetProp, SetProp);
    end;

    Ну а как добовлять типы, ты как я вижу уже знаешь.
    Ну и по твоему скрипту видно что ещё кое что добавить придётся!

    Дерзай! ;)
  • отредактировано April 2006
    Добавил
      with fsScript.FindClass('TFieldDef') do
       begin
        AddProperty('FieldKind', 'TFieldKind', GetProp, SetProp);
       end;
    
    function TRepForm.GetProp(Instance: TObject; ClassType: TClass;
      const PropName: String): Variant;
    begin
      Result := 0;
      if PropName = 'FieldKind' then Result := fkData; //??? жёстко fkData ?
    end;
    
    procedure TRepForm.SetProp(Instance: TObject; ClassType: TClass;
      const PropName: String; Value: Variant);
    begin
    //  if PropName = 'FieldKind' then {(Instance as TFieldKind) ??? } := Value;
    end;
    

    Никак не пойму как тут со всем этим разобраться.
    Народ помогите. Намаялся уже.
  • vixvix
    отредактировано April 2006
    МЛЯ.....!!! ;)
    У тебя чё исходников FastScript нету? Вроде он в исходниках распрострвняется только 2 модуля в .dcu! Вот как надо!
    function TRepForm.GetProp(Instance: TObject; ClassType: TClass;
     const PropName: String): Variant;
    begin
     Result := 0;
      if ClassType = TFieldDef
        then begin
               if PropName = 'FIELDKIND' //обязательно большими буквами
                 then Result := TFieldDef(Instance).FieldKind; // Instance - это тот объект у кого ты хочешь значение свойства прочитать.
             end;
    // if PropName = 'FieldKind' then Result := fkData; //??? жёстко fkData ?
    end;
    
    procedure TRepForm.SetProp(Instance: TObject; ClassType: TClass;
     const PropName: String; Value: Variant);
    begin
    //  if PropName = 'FieldKind' then {(Instance as TFieldKind) ??? } := Value;
    //Instance - это тот объект которому ты хочешь значение свойства присвоить, тоесть TFieldDef!!!
    
      if ClassType = TFieldDef
        then begin
               if PropName = 'FIELDKIND' //обязательно большими буквами
                 then TFieldDef(Instance).FieldKind := Integer(Value);
             end;
    end;
    

    Там ещё есть методы и события (это ваще ЖОПА)!

    FastScript класная вещь! Дерзай! ;)
  • отредактировано 12:46
    Вглядевшись в твой пример стал копаться.
    Вобщем компилируется вот так:
    function TRepForm.GetProp(Instance: TObject; ClassType: TClass;
      const PropName: String): Variant;
    begin
     Result := 0;
     if ClassType = TFieldDef then
       begin
        if PropName = 'FIELDKIND'
         then Result := TField(TFieldDef(Instance)).FieldKind; // Instance - это тот объект у кого ты хочешь значение свойства прочитать.
        if PropName = 'KEYFIELDS'
         then Result := TField(TFieldDef(Instance)).KeyFields;
    {    if PropName = 'LOOKUPDATASET'
         then Result := TField(TFieldDef(Instance)).LookupDataSet;}
        if PropName = 'LOOKUPKEYFIELDS'
         then Result := TField(TFieldDef(Instance)).LookupKeyFields;
        if PropName = 'LOOKUPRESULTFIELD'
         then Result := TField(TFieldDef(Instance)).LookupResultField;
       end;
    end;
    
    procedure TRepForm.SetProp(Instance: TObject; ClassType: TClass;
      const PropName: String; Value: Variant);
    begin
     if ClassType = TFieldDef then
       begin
        if PropName = 'FIELDKIND'
         then TField(TFieldDef(Instance)).FieldKind := Value;
        if PropName = 'KEYFIELDS'
         then TField(TFieldDef(Instance)).KeyFields := Value;
    {    if PropName = 'LOOKUPDATASET'
         then TField(TFieldDef(Instance)).LookupDataSet := Value;}
        if PropName = 'LOOKUPKEYFIELDS'
         then TField(TFieldDef(Instance)).LookupKeyFields := Value;
        if PropName = 'LOOKUPRESULTFIELD'
         then TField(TFieldDef(Instance)).LookupResultField := Value;
       end;
    end;
    
    ----------------------------------------------------------
    
       fsScript.AddEnum('TFieldKind', 'fkData, fkCalculated, fkLookup, fkInternalCalc, fkAggregate');
       with fsScript.FindClass('TFieldDef') do
       begin
        AddProperty('FieldKind', 'Integer', GetProp, SetProp);
        AddProperty('KeyFields', 'String', GetProp, SetProp);
        //AddProperty('LookupDataSet', 'TDataSet', GetProp, SetProp);
        AddProperty('LookupKeyFields', 'String', GetProp, SetProp);
        AddProperty('LookupResultField', 'String', GetProp, SetProp);
       end;
    

    НО ! Там надо еще и LookupDataSet присваивать : TDataSet
    Задумался как это сделать.
    { if PropName = 'LOOKUPDATASET'
    then Result := TField(TFieldDef(Instance)).LookupDataSet;}
    Ругается. Говорит в вариант не записать TDataSet.

    Как в fsScript передать ссылки на нужные датасеты, а главное как обработать потом в GetProp ?
    Это последний наверное вопрос. ;)
  • vixvix
    отредактировано 12:46
    написал:
    НО ! Там надо еще и LookupDataSet присваивать : TDataSet
    Задумался как это сделать.
    { if PropName = 'LOOKUPDATASET'
    then Result := TField(TFieldDef(Instance)).LookupDataSet;}
    Ругается. Говорит в вариант не записать TDataSet.

    Как в fsScript передать ссылки на нужные датасеты, а главное как обработать потом в GetProp ?
    Это последний наверное вопрос.

    Вот как надо:
    if PropName = 'LOOKUPDATASET'
      then Result := Integer(TField(TFieldDef(Instance)).LookupDataSet);
    

    Все объекты переобразо...мля, короче Integer(ОБЪЕКТ), также в обратную сторону TObject(Integer(Variant))!!!
    написал:
    Это последний наверное вопрос.

    НУ НУ ;)

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

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