Помогите разобраться с фантомами

Автор Dune, 04.07.08, 13:40:27

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

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

Dune

           Здравствуйте!
Не пойму как правильно юзать пользовательский тип фантома,
а именно проблемы с функцией обратного вызова. Какую-то мелочь
я явно не замечаю. Функция CallBack отрабатывает и сразу компас
отваливается.

Вообще хотелось бы уточнить все ли я правильно понимаю:
если  Requestinfo.callback = nil то функция ksCursor отрабатывается один раз
и  получает значение:
- при нажатии левой кнопки мыши ksCursor=1 при этом возвращает координаты курсора
- при неудачном завершении ksCursor=0

Если Requestinfo.callback назначена некая функция CallBack, то:
в случае Requestinfo._dynamic=0  функция CallBack вызывается по нажатию левой кнопки мыши
в случае Requestinfo._dynamic=1 функция CallBack вызывается при движении курсора
в функцию CallBack передаются координаты курсора и индификатор команды Requestinfo.commands
далее внутри этой функции я должен перестроить соответствующим образом
группу обьектов фантома и если команда com=-1 значит точка пользователем указана
(нажата левая кнопка мыши) и можно вставлять группу в документ.
Непонятно какой смысл несёт результат функции Callback: integer; ???



var x1,y1,x2,y2: double;

function GetGroup: reference;
begin
  result:=newGroup(1); //временная группа
//  macro(0);
    LineSeg(x1,y1,x2,y2,1);
// refmacro:=endobj;
endGroup;

end;


function CallBack ( _dynamic : integer; phantom : pointer; info : PRequestInfo;
                   var angl : double;  var y, x : double;  com : integer ) : integer;  pascal;
var rub: PPhantom; 
begin
rub:=phantom;
x2:=x; Y2:=y;
rub^.type6.gr:=getgroup;

if com=-1 then
     begin       
        StoreTmpGroup( rub^.type6.gr );
        ClearGroup( rub^.type6.gr );
      end

  ksMessage('2');
  Result:=1;


  end;


procedure BreakLine.Draw;
var
  rub  : Phantom ;
  j:integer;
  x, y : double ;
  info   : RequestInfo;
begin

Fillchar(info,sizeof(info),0);     //Структура информации
info._dynamic:=1;
info.prompt:='Укажите начальную точку';

Fillchar(rub,sizeof(rub),0);     //Фантом
rub.phType:=6;

if  ksCursor(Addr(info),x1,y1,0)=0 then exit;  //Начальная точка

info.callBack:=addr(CallBack);

info.prompt:='Укажите точку';

ksMessage('1');

if ksCursor(Addr(info),x,y,Addr(rub))=0 then exit;

ksMessage('3');

///////////////////////

end;
end;



так вот появляется сообщение"1",потом "2" после нажатия "OK" компас закрывается.
что я делаю или понемаю не так или не делаю или не понимаю вообще???

Dune

Ситуация, несколько упростилась, функция обратного вызова заработала, но теперь другая проблема.
При динамическом режиме ksCursor функция CallBack вызывается по движению мыши. Все хорошо мой фантом
классно весь растягивается как мне надо и изменяется, но  на нажатие кнопки мыши как мне показалось система
не риагирует, как выходить из цикла, при этом вставляя в документ временную группу??
Внутри функции CallBack переменная com всегда имеет значение -1, почему???
Выходить из ksCursor получается только нажатием STOP на панели свойств, соответственно команда отменяется
фантом уничтожается.  :`(

Dune

Сам разобрался!
Чтобы тема не стала безсмысленной отвечу себе сам, авось кому и пригодится.
Так вот первая ошибка с вылетом компаса была в том, что функции обратного вызова для ksCursor и ksPlacement оказывается разные, кто бы мог подумать  :-)))  отличаются на один параметр var ang: Double;
соответственно если перепутать функции произойдет такая вот ошибка.
А вторая проблема с завершением цикла в CallbackC решалась добавлением условия _dynamic=0 это условие становится true когда происходит указание позиции , т е клик по рабочей области левой кнопкой мыши, а значение com=-1 всегда true, если не используется меню.
Результат функции обратного вызова CallBackC (cursor) как и  CallBackP (placement) , который мы сами устанавливаем взависимости от условий определяет result=1 продолжать ли цикл или завершить result=0, завершаясь функция ksCursor возвращает x,y равные нулю, и сама имеет значение ноль, но так ведь все нужные трансформации фантома, и вставку обьектов в документ мы производим в функциb CallBack :)
Есть еще функции ksCursorEx и ksPlasementEx которые позволяют при вводе или редактировании обьекта использовать все расширенные возможности панели свойств, т.е. добавлять, закладки, контролы стандартные и пользовательские, обрабатывать их события. Вобщем любой инструмент компас график, как мне сейчас показалось можно повторить или реализовать новый с помощью SDK .  88))