работает ли ksSetDocVariableArray ?

Автор Zlоy, 05.05.04, 00:08:57

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Zlоy

использую эту функцию для замены значения переменной в документе или фрагменте, но никаких изменений нет. Всё перепробовал, даже напрямую из dll’ки функцию грузил - ничего не помогает.
Может быть кто-то успешно пользовался этой функцией ?

333

Приведите Ваш текст функции замены значений переменных.
Это даст возможность определить в чем ошибка.

333

Может после изменения значений не сохранил документ?

Zlоy

Пожалуйста, вот пример (frg - нормальный указатель) :

//получить массив внешних переменных фрагмента
reference    arrayVar = ksGetDocVariableArray(frg);
for(i = 0, count = GetArrayCount(arrayVar); i < count; i++) {
    VariableParam     par;
   //получить текущую переменную
   GetArrayItem( arrayVar, i, &par, sizeof(VariableParam) );
   sprintf(buf,
             "имя = %s\nзначение = %f\nкомментарий = %s",
             par.name, par.value, par.note);
   if(!strcmp(par.name, "h0")) {
   par.value = 106.0;
   //заменить текущую переменную в массиве
   if(!SetArrayItem(arrayVar, i, &par, sizeof(VariableParam))) {
       Message("Не меняется переменная");
        }
      }
}
//заменить значения  внешних переменных документа
if(!ksSetDocVariableArray (frg, arrayVar,1)) {
  Message("Приплыли с заменой переменных");
}

333, а неужели обязательно необходимо сохранять документ для того чтобы отследить изменение значения переменной ?

333

Является ли переменная h0 внешней.
Через API можно менять значения только внешних переменных.
Больше ни чего подозрительного не вижу.
Покрайней мере на вставках фрагментов это точно работает
Кстате раз Вы коментарий переменной не меняете то можно делать
ksSetDocVariableArray (frg, arrayVar,0))
Выполняется ли условие:
if (!strcmp(par.name, "h0") )
если нет то такой переменной либо нет либо она внутренняя  

Zlоy

Переменная h0 является внешней и условие выполняется - я проверял из-под отладчика.
Возможно, причина в единице, передаваемой последним параметром.
Посмотрим.

Zlоy

Нет, всё равно ничего. Интересно, а во всех ли версиях Компаса эта функция нормально поддерживается ? В 5.11 например.
В чём же про-б-л-е-м-а ?...........

333

Попробуйте выслать тест и пример документа по адресу support@kompas.kolomna.ru.
Если конечно Вы приобрели Компас.
Может что-то и прояснится.

SТil

В нелпе есть пример по работе с ksSetDocVariableArray для си, может у кого есть пример на делфи, а то никак не могу разобратся . Проблемма с тем что аргумент должен быть reference, а в библиотеке он integer или я чегото не понимаю.

333

ldefin2d.h
typedef long reference;

т.е. reference, long, Integer это одно и тоже

Integer и Reference один и тот же тип, так как Reference это есть именованный тип от Integer единственное  что  Delphi жестче работает с типами.

sТil

Спасибо за ответ, но может у кого нибудь всетаки есть пример по работе с внешними переменными на дельфи? Так было бы проще.

sТil

Разобрался

var
  i: integer;
  arrayVar1 : reference;     // Массив переменных
  par1     : VariableParam; // Спруктура параметров переменной

begin
      arrayVar1 :=  ksGetDocVariableArray( p ); //p - ссылка на фрагмент
    for i :=0 to GetArrayCount(arrayVar1) do
    begin
      if ( GetArrayItem(arrayVar1, i, @par1, SizeOf(VariableParam))0 )then
      begin
       buf := Format( ’name = %s values = %6.2f ’, [par1.name,par1.value] );
        Kompas.ksMessage( PChar(buf) );

        if ( par1.name = ’h’ ) then begin
          par1.value := 1000;   // Установить значение переменной h0 = 100
          SetArrayItem(arrayVar1, i, @par1, sizeof(VariableParam));
        end;
      end;
    end;
    ksSetDocVariableArray( p,    // указатель на документ или вставку фрагмента
                           arrayVar1,// указатель на динамический массив VARIABLE_ARR
                           0 );    // комментарии менять

главное не забыть подключить все нужные библиотеки :).

Ещё вопрос почему после всего этого появляется сообщение
"Неверный индекс массива"

Строчку for i :=0 to GetArrayCount(arrayVar1) do надо написать for i :=0 to GetArrayCount(arrayVar1)-1 do так, как Count указывает количество записей в массиве, а первая запись начинается с нуля.