• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

ISpecificationObject::FirstOnSheet всегда возвращает false

Автор dimaschig, 29.11.13, 08:54:34

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

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

dimaschig

Добрый день.
Столкнулся с необходимость, при считывании объектов спецификации - определять, на какой странице находится тот или иной объект. Для этого я последовательно прохожу по всем объектам массива, возвращаемого методом SpecificationDescription.Objects и, зная количество строк в первом и последующих листах спецификации - определяю номер листа. Однако в компасе v14 есть кнопка "Размещать на новом листе" и определить, нажата ли она для конкретного объекта можно используя свойство ISpecificationObject::FirstOnSheet (если верить справочной системе SDK).

var_1:= SpecificationDescription.Objects;
for i := 0 to VarArrayHighBound(var_1, 1) do       
  begin
     var_2 := var_1;
     SpecificationObject := var_2 as ISpecificationObject;
     if(SpecificationObject.FirstOnSheet = true) then
          .....

Но по какой-то причине SpecificationObject.FirstOnSheet постоянно возвращает FALSE для всех объектов спецификации.
При этом, когда я программно создаю в спецификации новый объект и указываю SpecificationObject.FirstOnSheet := true у нового объекта и выполняю SpecificationObject.Update, то все отрабатывает правильно - объект размещается на новой странице.

Подскажите пожалуйста, в чем моя ошибка или как быть в данной ситуации.

Внимательно вчитайтесь в Значения свойства:
TRUE - объект спецификации разместить в начале новой страницы спецификации,
FALSE - объект спецификации разместить после ­предыдущего.

Что мешает идти на новой странице, после ­предыдущего?


dimaschig

------------------------------------------------------------------------------------------
Что мешает идти на новой странице, после предыдущего?
-----------------------------------------------------------------------------------------
Могли бы пояснить ?

Дело в том, что я не могу определить в какой позиции (на какой странице) находится тот или иной объект спецификации, если свойство  SpecificationObject.FirstOnSheet не вернет мне правду, т.к. даже, если в спецификации у базового или вспомогательного объекта кнопка "Размещать на новом листе" нажата - SpecificationObject.FirstOnSheet все равно возвращает False.

Эта строка  var_2 := var_1, тоже мне непонятна, справедливо будет, если  var_1 будет равно VT_DISPATCH, а если  var_1 будет равно VT_ARRAY or VT_DISPATCH.
Здесь есть пример получения интерфейса из вариантного массива http://forum.ascon.ru/index.php/topic,24894.msg180294.html#msg180294

dimaschig

-----------------------------------
var_2 := var_1
------------------------------------
Извиняюсь - некорректно скопировал
Вот более полный код:
********************************************************************
var
kompas: KompasObject;
KompasHandle:THandle;
KompasAPI:IApplication;
Document:IKompasDocument;
iSpcDoc : ksSpcDocument;
SpecificationDescriptions : ISpecificationDescriptions;
SpecificationDescription : ISpecificationDescription;
SpecificationObject : ISpecificationObject;
var_1 : Variant;
var_2 : IDispatch;

begin
   try
     kompas:=KompasObject(GetActiveOleObject('Kompas.Application.5'));
   except
     try  kompas:=KompasObject(CreateOleObject('Kompas.Application.5'));
     except
       result:=false;
       exit
     end
   end;
   KompasHandle := kompas.ksGetHWindow;
   kompas.Visible:=False;

   KompasAPI := kompas.ksGetApplication7 as IApplication;
   if (KompasAPI = nil) then Exit;
   Document := KompasAPI.Documents.Open(_file_name,True,False);
   KompasAPI.ActiveDocument := Document;
   iSpcDoc:=ksSpcDocument(kompas.SpcActiveDocument);
   SpecificationDescriptions := Document.SpecificationDescriptions;
   SpecificationDescription := SpecificationDescriptions.Item[0];
   
   var_1:= SpecificationDescription.Objects;
   for i := 0 to VarArrayHighBound(var_1, 1) do
   begin
     var_2 := var_1;
     SpecificationObject := var_2 as ISpecificationObject;
     if(SpecificationObject.FirstOnSheet = true) then
      ..................
     if(SpecificationObject.IncrementPosition = true) then
      ..................

   end;
********************************************************************
В данном примере свойство  SpecificationObject.IncrementPosition отрабатывает абсолютно верно,
SpecificationObject.Columns - также безошибочно возвращает интерфейс коллекции колонок объекта спецификации(ISpecificationColumns).

Повторюсь, что проблема возникает только с получением SpecificationObject.FirstOnSheet





for J := 0 to VarArrayHighBound(var_1, 1) do
begin
     if(VarType(var_1)=VT_DISPATCH)then SpecificationObject := IDispatch(var_1) as ISpecificationObject
      else SpecificationObject := IDispatch(var_1[J]) as ISpecificationObject;
...
end;
Посмотрите картинку по ссылке, которую я приводил.
var_1:OleVariant;

dimaschig

Попробовал Вашим способом - эффект ровно тотже самый

*************************************************************
var
var_1 : OleVariant;
var_2 : IDispatch;

begin
...........

  var_1:= SpecificationDescription.Objects;

  for i := 0 to VarArrayHighBound(var_1, 1) do       
  begin
    if (VarType(var_1) = VT_DISPATCH)then
      SpecificationObject := IDispatch(var_1) as ISpecificationObject
    else
      SpecificationObject := IDispatch(var_1) as ISpecificationObject;

     if(SpecificationObject.FirstOnSheet = true) then
      ..................
     if(SpecificationObject.IncrementPosition = true) then

****************************************************************************
  FirstOnSheet также в каждом случае выдает False
  IncrementPosition работает правильно


dimaschig

кстати по какойто причине квадратные скобки и все, что в них на странице броузера не отображаются. На самом деле в моем коде не

IDispatch(var_1)
а
IDispatch(var_1(i)),  только внутренние скобки квадратные

dimaschig

и соответственно было не
var_2 := var_1;

а

var_2 := var_1(i);

Так с кодом разобрались, теперь об значениях:
TRUE - объект спецификации разместить в начале новой страницы спецификации,
FALSE - объект спецификации разместить после предыдущего.
Как я понимаю, если значение TRUE, то объект обязательно на новой странице даже, если на предыдущей есть место, ели FALSE, то тут как масть ляжет.

dimaschig


Цитата: dimaschig от 29.11.13, 13:00:17
кстати по какойто причине квадратные скобки и все, что в них на странице броузера не отображаются. На самом деле в моем коде не
Тег <I> создает наклонный текст.
HTML тег <I> и обязательный парный ему </I> выделенный текст с квадратными скобками и обязательный парный ему

dimaschig

 :) с одной проблемой разобрались

Можно попробовать получить интерфейс ISpecificationColumns, а именно коллекции дополнительных колонок, может быть получен от интерфейса ISpecificationObject с помощью свойства ISpecificationObject::AdditionalColumns.
И посмотреть, что там по Item - колонка объекта спецификации, заданная по индексу, приведённому на рисунке.

dimaschig

Насколько я понимаю,  ISpecificationObject::AdditionalColumns позволяет получить доступ вот к этим дополнительным колонкам объекта

Нов них номера листа нет