Добавление колонки в браузер средствами API конфигуратора

Приемы и подходы, обмен опытом

Модераторы: Screw, larin

Ответить
Аватара пользователя
Magic
топ-софт
Сообщения: 35
Зарегистрирован: Вт, 20/11/2007 10:30
Имя Фамилия: Роман Тищенко
Откуда: Галактика-Украина
Контактная информация:

Добавление колонки в браузер средствами API конфигуратора

Сообщение Magic »

Пытаюсь добавить новую колонку в браузер при помощи API конфигуратора.
Код выглядит так:

Код: Выделить всё

#include cfg_all.inc   // константы для использования конфигуратора
#include cfg_err.inc
end;

interface TestConfAPI;

table struct t1
(
  p1: String,
  p2: Double,
  p3: Double
);

create view
  as select
    *
  from
    t1;

browse br1;
  show at (,,,20);
  table t1;
fields
  t1.p1 'name field': [10], protect;
end;

screen scr1
  show at (,21,,);
buttons
  cmok;
<<
<.Добавить колонку.>
>>
end;

// Процедура переводит код pRetCode в идентификатор соответствующей
// константы, добавляет ее к строке pMsg и выводит полученное сообщение.
function CheckCfResult(pRetCode: LongInt; pMsg: String): Boolean;
var
  ErrMsg: String;
begin
  if pRetCode != CfOk then
  begin
    CheckCfResult := False
    case pRetCode of
      CfErrObjectTypeNotExist:
        ErrMsg := 'Тип объекта не существует';
      CfErrObjectTypeAlreadyExist:
        ErrMsg := 'Тип объекта уже существует';
      CfErrObjectNotExist:
        ErrMsg := 'Объект не существует';
      CfErrObjectAlreadyExist:
        ErrMsg := 'Уже есть объект с таким именем, как у создаваемого объекта';
      CfErrContainerObjectNotExist:
        ErrMsg := 'Контейнер не существует';
      CfErrPropNotExist:
        ErrMsg := 'Свойство не существует';
      CfErrPropAlreadyExist:
        ErrMsg := 'Свойство уже существует';
      CfErrObjectSelfAlreadyExist:
        ErrMsg := 'Уже есть объект с заданным указателем (Self''ом)';
      CfErrContainerSelfNotExist:
        ErrMsg := 'Не найден контейнер с заданным указателем (Self-''ом)';
      CfErrCantEditProp:
        ErrMsg := 'Нельзя редактировать указанное свойство';
      CfErrPropValueError:
        ErrMsg := 'Значение поля не совместимо по типу с указанным свойством';
      CfErrCantCreateObject:
        ErrMsg := 'Нельзя создать объект в указанном контейнере';
      CfErrCreateObjectError:
        ErrMsg := 'Не получилось создать объект';
      CfErrObjectStorageNotCreated:
        ErrMsg := 'Вызвана функция управления ObjectStorage, а объект не создан';
      CfErrInternalBadCommand:
        ErrMsg := 'Неизвестная команда сервисных функций';
      CfErrBadFieldType:
        ErrMsg := 'Не того типа параметр';
      CfErrBadFind:
        ErrMsg := 'Атом не найден';
      CfErrMustBeUnsigned:
        ErrMsg := 'Значение типа cftUnsignedInteger меньше 0';
    else
      ErrMsg := 'Неопознанная ошибка. Код: ' + pRetCode;
    end;
    Message('Ошибка ' + String(pRetCode) + ': ' + ErrMsg + '. ' + if(pMsg != '', ''#13 + pMsg, ''));
  end else
    CheckCfResult := True
end;

HandleEvent
  cmInit:
    begin
      t1.p1 := 'запись 1';
      t1.p2 := 111;
      insert current t1;
      t1.p1 := 'запись 2';
      t1.p2 := 222;
      insert current t1;
    end;
  cmOk:
    begin
      // Устанавливаем текущий корневой контейнер
      CfsSetCurrentContainer('TestConfAPI');
      var p2self: LongInt;
      var rc: LongInt;
      // Создаем объект с типа "Column" с названием "newpole" в контейнере "br1"
      rc := CfsCreateObject('Column', 'br1', 'newpole', False, p2self);
      if CheckCfResult(rc, 'Не удалось создать поле "newpole"') then
      begin
        // Устанавливаем свойство "Title" объекта "newpole"
        CfsSetProp('newpole', 'Title', 'new pole');
        // Устанавливаем свойство "FieldName" объекта "newpole"
        CfsSetProp('newpole', 'FieldName', 't1.p2');
      end;
      RescanPanel(#t1);
    end;
end;

end.
При нажатии на кнопку "Добавить колонку" получаю следующие сообщения об ошибке:
Нет такой функции, поля или метода: NEWPOLE
newpole
Затем еще одно сообщение:
Ошибка интерпретации имени поля: "newpole"
Затем уже выводится сообщение функции CheckCfResult, из которого видно,
что возникает ошибка с кодом -12 "Нельзя создать объект в указанном контейнере".
Что я делаю неправильно? Почему нельзя создать объект "Column" в контейнере "browse"?
Аватара пользователя
Screw
топ-софт
Сообщения: 73
Зарегистрирован: Пт, 14/09/2007 22:54
Имя Фамилия: Виталий Корзюк
Откуда: ТопСофт
Контактная информация:

Сообщение Screw »

Вот так сработало:

Код: Выделить всё

rc := CfsCreateObject(cfcColumn, 'br1', 'T1.P2', False, p2self);
Конфигуратор ожидал увидеть имя существующего поля.
Аватара пользователя
larin
топ-софт
Сообщения: 228
Зарегистрирован: Пн, 10/09/2007 12:13
Имя Фамилия: Михаил Ларин
Откуда: ТопCофт
Контактная информация:

Сообщение larin »

Может будет полезен пример.
Для корректной работы примера нужен Атлантис 5.4.19 и выше.

Код: Выделить всё

interface ConfTest2 'Тест';
  show at (,,,30);

create view as select * from x$resources;

screen scr1 'screen';
 show at(,21,20,);
buttons
  cmOk;
<<
  <.OK.>
>>
end;

handleEvent
cmOk:
{
  var pobj1, pobj2 : longInt;
  var err : string;

  cfsSetCurrentContainer('ConfTest2');
  cfsSetProp('ConfTest2', 'Title', 'Интерфейс тест API конфигуратора');
  
  err := '';

  err := err + ' ' + string(cfsCreateObject('Screen', 'ConfTest2', 'scr2', false, pobj1));
  cfsSetProp(pobj1, 'RectA_X', 1);
  cfsSetProp(pobj1, 'RectA_Y', 1);
  cfsSetProp(pobj1, 'RectB_X', 60);
  cfsSetProp(pobj1, 'RectB_Y', 20);
  cfsSetProp(pobj1, 'PanelTable', tnx$resources);

    err := err + ' ' + string(cfsCreateObject('PanelInputLine', pobj1, 'x$resources.XR$NAME', false, pobj2));
    cfsSetProp(pobj2, 'Origin_X', 10);
    cfsSetProp(pobj2, 'Origin_Y', 10);
    cfsSetProp(pobj2, 'Size_X', 120);
    pobj2 := 0;

    err := err + ' ' + string(cfsCreateObject('StaticText', pobj1, 'StaticText вавава', false, pobj2));
    cfsSetProp(pobj2, 'Origin_X', 10);
    cfsSetProp(pobj2, 'Origin_Y', 30);
    cfsSetProp(pobj2, 'Size_X', 120);
    pobj2 := 0;

    err := err + ' ' + string(cfsCreateObject('Label', pobj1, 'Label 34534535', false, pobj2));
    cfsSetProp(pobj2, 'Origin_X', 10);
    cfsSetProp(pobj2, 'Origin_Y', 50);
    cfsSetProp(pobj2, 'Size_X', 120);
    pobj2 := 0;

    err := err + ' ' + string(cfsCreateObject('FieldLine', pobj1, 'FieldLine dsdsd', false, pobj2));
    cfsSetProp(pobj2, 'Origin_X', 10);
    cfsSetProp(pobj2, 'Origin_Y', 70);
    cfsSetProp(pobj2, 'Size_X', 120);
    pobj2 := 0;

    err := err + ' ' + string(cfsCreateObject('Bevel', pobj1, 'Bevel sdffsfdf', false, pobj2));
    cfsSetProp(pobj2, 'Origin_X', 10);
    cfsSetProp(pobj2, 'Origin_Y', 90);
    cfsSetProp(pobj2, 'Size_X', 120);
    cfsSetProp(pobj2, 'Size_y', 120);
    pobj2 := 0;

    err := err + ' ' + string(cfsCreateObject('Button', pobj1, 'Button qweqwe', false, pobj2));
    cfsSetProp(pobj2, 'Origin_X', 140);
    cfsSetProp(pobj2, 'Origin_Y', 10);
    cfsSetProp(pobj2, 'Size_X', 120);
    cfsSetProp(pobj2, 'Size_y', 20);
    pobj2 := 0;

  err := err + ' ' + string(cfsCreateObject('Browser', 'ConfTest2', 'br2', false, pobj1));
  cfsSetProp(pobj1, 'RectA_X', 61);
  cfsSetProp(pobj1, 'RectA_Y', 1);
  cfsSetProp(pobj1, 'RectB_X', 90);
  cfsSetProp(pobj1, 'RectB_Y', 20);
  cfsSetProp(pobj1, 'PanelTable', tnx$resources);

    err := err + ' ' + string(cfsCreateObject('Column', pobj1, 'x$resources.XR$TYPE', false, pobj2));
    cfsSetProp(pobj2, 'Title', 'Поле1');
    pobj2 := 0;

    err := err + ' ' + string(cfsCreateObject('Column', pobj1, 'Field: x$resources.XR$NAME', false, pobj2));
    cfsSetProp(pobj2, 'Title', 'Поле2');
    pobj2 := 0;

    err := err + ' ' + string(cfsCreateObject('Column', pobj1, 'ExtAttr: X$RESOURCES,281474976710702', false, pobj2));
    cfsSetProp(pobj2, 'Title', 'Атрибут1');
    pobj2 := 0;

    err := err + ' ' + string(cfsCreateObject('Column', pobj1, 'ExtAttr: X$RESOURCES,2814702', false, pobj2));
    cfsSetProp(pobj2, 'Title', 'Атрибут2');
    pobj2 := 0;


  err := err + ' ' + string(cfsCreateObject('MemoViewer', 'ConfTest2', 'x$resources.XR$DATA', false, pobj1));
  cfsSetProp(pobj1, 'RectA_X', 22);
  cfsSetProp(pobj1, 'RectA_Y', 22);
  cfsSetProp(pobj1, 'RectB_X', 90);
  cfsSetProp(pobj1, 'RectB_Y', 28);

  ReReadRecord;
  message(err);
}
end;
end.

paul2401
заказчик
Сообщения: 11
Зарегистрирован: Пн, 11/02/2008 19:27
Имя Фамилия: Павел Мацкевич
Откуда: Луганская областная Фармация

Сообщение paul2401 »

А что делать, если необходимо добавить колонку в browse интерфейса WTHandCorrectionMask? Атлантис версии 5.3.17. В документации описаны все эти функции API конфигуратора, но добавление колонки не работает. Перейти на Атлантис 5.4.19 нет возможности.
Аватара пользователя
larin
топ-софт
Сообщения: 228
Зарегистрирован: Пн, 10/09/2007 12:13
Имя Фамилия: Михаил Ларин
Откуда: ТопCофт
Контактная информация:

Сообщение larin »

paul2401 писал(а):А что делать, если необходимо добавить колонку в browse интерфейса WTHandCorrectionMask? Атлантис версии 5.3.17. В документации описаны все эти функции API конфигуратора, но добавление колонки не работает. Перейти на Атлантис 5.4.19 нет возможности.
К сожалению в 5.3.17 эти функции работают с ошибками (т.е. не работают) :-(

Добавить колонку можете попробовать путем замещения формата. Т.е. в alter interface сделать новый browse с нужным набором колонок и заместить им видимый формат. См. в документации раздел
"Описание объектов (vip-интерфейсы) - Наследование vip-интерфейсов - Замещение видимых элементов", либо описание функции SetFormat.
paul2401
заказчик
Сообщения: 11
Зарегистрирован: Пн, 11/02/2008 19:27
Имя Фамилия: Павел Мацкевич
Откуда: Луганская областная Фармация

Сообщение paul2401 »

Спасибо, я так и делаю. Но... Галактика куплена за очень немаленькие деньги и, если не работает описанная в документации функциональность, то вместо констатации этого факта хотелось бы получить патчи, исправляющие этот дефект. В противном случае получается, что деньги уплачены за некачественный продукт, а производитель спокойно констатирует это.
Gera
топ-софт
Сообщения: 97
Зарегистрирован: Пн, 24/09/2007 17:53
Имя Фамилия: Юрий Герман
Откуда: ТопСофт
Контактная информация:

Сообщение Gera »

Обновления Атлантиса 5.4.19 доступны - в них проблема исправлена.

Исправление обнаруженного дефекта произведено в соответствии с условиями поддержки продукта.

Павел Мацкевич, почему нет возможности перейти на 5.4.19?
paul2401
заказчик
Сообщения: 11
Зарегистрирован: Пн, 11/02/2008 19:27
Имя Фамилия: Павел Мацкевич
Откуда: Луганская областная Фармация

Сообщение paul2401 »

Потому, что дата окончания абонентского обслуживания 31.12.2008. В договоре на поставку написано, что система ДОЛЖНА работать так, как описано в документации при условии ее использования квалифицированными пользователями. На деле получается, что ошибки текущей версии исправляются в следующей, и тем кто не платит % за абонентское обслуживание исправления недоступны. Но ведь мы купили продукт, а не альфа-версию!
Представьте ситуацию: покупаете автомобиль. В процессе эксплуатации выясняется, что не работают тормоза. Обращаетесь с этой проблемой в сервис, а там отвечают - Да, мы знаем об этой проблеме. Она будет исправлена в следующей модели нашего автомобиля! Нонсенс?
Мое мнение такое - исправлять ошибки надо патчами к той версии, в которой они обнаружены (вне зависимости от наличия договора на абонентское обслуживание), а новую функциональность включать в следующие версии (за отдельные деньги).
Gera
топ-софт
Сообщения: 97
Зарегистрирован: Пн, 24/09/2007 17:53
Имя Фамилия: Юрий Герман
Откуда: ТопСофт
Контактная информация:

Сообщение Gera »

Павел Мацкевич, понятно.

Этот вопрос выходит за рамки обсуждаемой темы.
Ответить