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

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

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

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

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

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

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

Ошибка "Неверный индекс массива" при закрытии формы библиотеки

Автор Pavor, 22.06.09, 11:49:45

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

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

Pavor

Приветствую всех!

Начал писать свою библиотеку, на 9-м Компасе все работает без проблем,
при перекомпиляции под 8+ почему-то начал ругаться при закрытии формы.
Вроде бы ничего особенного не делаю:

  Application.Handle := GetHWindow;

  dlg:=TfmInput.Create(Application);

  EnableTaskAccess(0);
  res:=dlg.ShowModal;
  EnableTaskAccess(1);

if (res=mrOK) then
  begin
  //Читаем данные из формы
  //...........
  //Вызываем функцию рисования с полученными параметрами
   case comm of
   1: Draw(A, B, C, D);
   end;{case}

   end;
     Application.Handle := 0;
     dlg.Free; //СООБЩЕНИЕ ОБ ОШИБКЕ


Интересно, что если закомментировать ф-цию Draw, форма закрывается нормально.
Может, кто сталкивался, подскажите в чем может быть дело?

Prog2

Попробуйте в самом начале добавить проверку:

if dlg not nil then
dlg:=TfmInput.Create(Application);

И закомментируйте строку  dlg.Free;


PS: а вообще при такой ошибке, ИМХО, нужно вести раскопки в функции Draw...

Pavor

23.06.09, 08:12:51 #2 Последнее редактирование: 23.06.09, 08:38:28 от Pavor
if dlg not nil then
dlg:=TfmInput.Create(Application);

Это значит - если переменная dlg не ноль, тогда создать форму. это добавил.

dlg.Free;
А это означает - память не освобождать. Соглашаться на это, наверное, не следует - но попробовал,
проблема сохраняется.

Непонятно, все-таки, почему в 9-й версии работает нормально...

Функция Draw практически полностью взята из примера Step4, может чего-нибудь лишнее выбросил, конечно:
procedure Draw(A, B, C, D);
var
  info : RequestInfo; // Параметры запроса
  rub  : Phantom;     // Фантом
  x, y : double ;     // координаты точки вставки
  j    : integer;

  //Переменные для построения
  index:integer;

PW, PH: double;

begin
  j     := 1;
  FillChar( rub, sizeof(rub), 0 );
  rub.type1.scale := 1;  // Масштаб
  rub.phType      := 1;  // Тип фантома

  FillChar( info, sizeof(info), 0 );
  info.commands := 'Укажите точку привязки группы';

  PW:=(A-B)/2;
  PH:=(C-D*10)/(C+1);

  while ( j <> 0 ) do
  begin
    if ( rub.type1.gr > 0 ) then
      DeleteObj( rub.type1.gr  );  // Удалить старую группу
    // Создать новую группу
    rub.type1.gr := NewGroup( 1 ); // Временная группа

//Построение
    for index:=0 to NumOfChannels do
    begin
    rect.x:=0;
    rect.y:=(PH+ChannelHeight)*index;
    rect.ang:=0;
    rect.height:=PH;
    rect.weight:=PW;
    rect.style:=1;
    rect.pCorner:=0;
    ksRectangle (@rect, 0);
    end;

    info.commands := 'Укажите точку привязки группы';

    EndGroup();

    // Запрос точки вставки и угла поворота группы
    j := Placement( Addr(info), x, y,
                    rub.type1.ang,
                    Addr(rub) );

    case  j of
//     1 : _type := j;
//     2 : _type := j;
     -1 : begin // Поставить в модель

            MoveObj( rub.type1.gr, x, y );                    // Сдвинуть группу

            if ( Abs(rub.type1.ang) > 0.001 ) then
              RotateObj( rub.type1.gr, x, y, rub.type1.ang ); // Повернуть группу

            StoreTmpGroup( rub.type1.gr );   // Поставить временную группу в вид
            ClearGroup( rub.type1.gr );      // Очистить группу
      end;
    end;
  end;
end;

А Вы не пробовали поменять местами ити строки, обычно пямять высвобождается в обратном порядке.
Application.Handle := 0;
     dlg.Free; //СООБЩЕНИЕ ОБ ОШИБКЕ
у Вас получается, что Вы убиваете первой строчкой владельца объекта которого потом пытаетесь освободить.

Pavor

Попробовал - никак не повлияло  :(
Кстати говоря - в примерах именно такая последовательность.

Нужен полный текст т.к. у Вас скорее всего конфликт в обработке событий.
Либо проблема в подключаемых модулях, для 8 компаса использовать его модули.

Pavor

Всем добрый день!
Предыдущую тему, похоже, удалили.

Коротко: есть библиотека, в Компасе 9 работает без ошибок. при перекомпиляции под Компас 8+
при закрытии формы выдается сообщение "Неверный индекс массива", на функциональность библиотеки это не влияет.

В приложении - проект Delphi 7 c текстом библиотеки.

Хорошо бы разобраться, в чем тут дело.

можно использовать:

ResultNULL Функция обнуляет результат работы библиотеки, если ошибка не фатальная.

Аналог данной функции при использовании Automation - метод KompasObject::ksResultNULL.

Пример создания формы есть здесь:
http://mariupolsapr.narod.ru/
http://mariupolsapr.narod.ru//lib/animaciq3d.rar

prog1

У меня такая ошибка не фатальная - получилась, например, в результате неправильного использования DynamicArray (текстовое что-то было).
Забейте на ошибку, воспользовавшись предыд.советом от Sabahs (есть небольшая вероятность что что-то где-то не отрисуется) или...
Предположение: правильно ли Вы используете rect.pCorner? Он есть динамический массив. Попробуйте отрисовать в цикле for index:=0 to NumOfChannels dо..., к примеру, LineSeg. (Я про процедуру DRAW)
Удачи!

Pavor

Всем спасибо за советы!
Правда, я пока еще их не пробовал в действии  :shu: