Вызов интерфейса GetUserGroupGal

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Bodybomber
Сообщения: 14
Зарегистрирован: 01 дек 2020, 08:15

Вызов интерфейса GetUserGroupGal

Сообщение Bodybomber »

var i : integer;
lGroupsMarker : longInt;
cGrNrec : comp;
...

cmPick:
{
var i : integer = 0;
lGroupsMarker := 1;

case CurField of
#sUserGroups:
{
if RunInterface('C_TUNE::GetUserGroupGal', lGroupsMarker, cGrNrec) <> cmCancel
{
for (i; i < GetMarkerCount(lGroupsMarker); i++ )
{ GetMarker(lGroupsMarker, i, cGrNrec); }
}
}
end;
}

...

В вышеприведенном фрагменте кода программы при вызове интерфейса открывается окно со списком пользовательских групп. Отмечаю Insert'ом необходимые мне группы и нажимаю Enter. После этого программа аварийно завершает выполнение по RunTime Error. Подозреваю, что ошибка в передаваемых параметрах или в их значениях. К сожалению, не нашел примеров использования. В atldoc'е соответственно мизерное содержание информации.
Где ошибка?
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Re: Вызов интерфейса GetUserGroupGal

Сообщение Ged »

lGroupsMarker := InitMarker('', 8, 10, 5);

if RunInterface('C_TUNE::GetUserGroupGal', lGroupsMarker, cGrNrec) <> cmCancel
{
......
}

DoneMarker(lGroupsMarker, '');
}
Bodybomber
Сообщения: 14
Зарегистрирован: 01 дек 2020, 08:15

Re: Вызов интерфейса GetUserGroupGal

Сообщение Bodybomber »

Спс.
Bodybomber
Сообщения: 14
Зарегистрирован: 01 дек 2020, 08:15

Re: Вызов интерфейса GetUserGroupGal

Сообщение Bodybomber »

Ged писал(а):lGroupsMarker := InitMarker('', 8, 10, 5);

if RunInterface('C_TUNE::GetUserGroupGal', lGroupsMarker, cGrNrec) <> cmCancel
{
......
}

DoneMarker(lGroupsMarker, '');
}
Рано радовался. RunTimeError также происходит, не смотря на инициализацию маркера. :sad:
Попытался модифицировать код по предложенному техутешкой варианту на предмет:


procedure prSelectSomeGroups;
{
var lContainer : TPtr = SortedContainer_Init('', 8, 10, 5, false);
if (RunInterface('GetUserGroupGal', lContainer, 0) <> cmCancel)
{
var lMarker : TPtr = InitMarker('', 8, 10, 5);
.....
DoneMarker(lMarker, '');
}
SortedContainer_Done(lContainer, '');
}

плюс в том, что прога не падает, но минус в том, что при этом нет nRec'ов в таблице RMT=>MARKER, т.е. отмеченные мной группы невозможно нигде использовать.
Есть еще идеи?
oiko
Местный житель
Сообщения: 419
Зарегистрирован: 29 мар 2005, 17:49

Re: Вызов интерфейса GetUserGroupGal

Сообщение oiko »

процедурой перегрузи маркер в таблицу в памяти и работай дальше с ней например для другого маркера
table struct pickvid_dog
(
s_vid_dog:string,
w_vid_dog:word
)
with index
(
pickvid_dog01=w_vid_dog
);
.......
procedure Fillmytable();
var _IndexNo, _MarkerCount : longint; _cnrec:comp; _errorKol:longint;
begin
_errorKol:=0;
_MarkerCount:=GetMarkerCount(_Marker);
StartNewVisual(vtIndicatorVisual, vfTimer + vfBreak + vfConfirm, 'Всего выбрано: '+string(_MarkerCount)+' ...', _MarkerCount+1);
for (_IndexNo:=0;
(_IndexNo<_MarkerCount and inextVisual('Всего выбрано:'+string(_MarkerCount)+''#13' обрабатывается '+string(_IndexNo)+'.'));inc(_IndexNo))
{
if GetMarker(_Marker,_IndexNo,_cnrec)
then
{
clearbuffer(#pickvid_dog);
pickvid_dog.w_vid_dog:=if(modifier getfirst KATVIDD where ((_cnrec==KATVIDD.nrec))=tsok,KATVIDD.VIDDOG,0);
if (modifier insert current pickvid_dog)<>tsok then{inc(_errorKol);};
};
};
stopVisual('',0);
doneMarker(_Marker,'');
if _errorKol>0 then Message(''#3'Не вставилось обьектов '+string(_errorKol)+'.',cmerror);
end;


.......
cmPick:
{
case curfield of
#sviddog:{
DoneMarker(_Marker,'MKatVidD');
if (RunInterface('L_DOGOVOR::GetSomVidD',0,0,Boolean(True),Comp(0),Word(0)) <> cmCancel)
{
_Marker:=InitMarker('MKatVidD', 8, 10, 10);
sviddog:='Выбрано видов: '+GetMarkerCount(_Marker);
}
}

end; //case
}
cmdefault:{
if (GetMarkerCount(_Marker)>0)
then {
Fillmytable();
......
}
}
Irina_
Местный житель
Сообщения: 554
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: Вызов интерфейса GetUserGroupGal

Сообщение Irina_ »

Здравствуйте.
Ged писал:
lGroupsMarker := InitMarker('', 8, 10, 5);
oiko в своем примере с интерфейсом GetSomVidD писал:
_Marker:=InitMarker('MKatVidD', 8, 10, 10);
Насколько я понимаю, при инициализации маркера надо указать его имя. Какое имя у маркера для интерфейса GetUserGroupGal Ged не указал. Возможно кто-то, у кого есть доступ к исходникам, подскажет это имя.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Вызов интерфейса GetUserGroupGal

Сообщение edward_K »

1. Markers: TPtr; Хотя это почти и тоже, но лучше все таки правильный тип передавать.
2. InitMarker если делать без имени, то он будет чистый. Если с именем, то будет взят из DSK
3. Параметры интерфейса вы можете смотреть в vih. vil в frm
VipInterface GetUserGroupGal(AbstractGroupsGal)
licensed(free) parameters(Markers : TPtr ; GroupNRec: Comp);
ну или в \EXE\GalDoc\!GSDK.chm или там же в файле на компоненту.
4. Если вам множественный выбор не нужен, то на вход вы можете подать 0.
но надо обязательно сделать Markers := 0 вместо InitMarker - объявление в галактике не обнуляет в автомате.
5. В этом фейсе на вход идет не маркер, хоть и параметр называется так
Markers
Я нашел только одно место прямого вызова

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

  m_intUReestrTuneEasy : UReestrTuneEasy;
  m_intGetUserGroup : GetUserGroupGal;
procedure CopyNastrsToGroups;
{
  var lContainer : TPtr = SortedContainer_Init('', 8, 10, 5, false);
  if (RunInterface('GetUserGroupGal', lContainer, 0) <> cmCancel)
  {
    var lMarker :  TPtr = InitMarker('', 8, 10, 5);
    m_intUReestrTuneEasy.GetMarkTunesToMarker(lMarker);
....
    DoneMarker(lMarker, '');
    m_intUReestrTuneEasy.UnselectAll;
  }

  SortedContainer_Done(lContainer, '');
}

Параметры в инициализации lContainer очень важны.
Как то не очень удачный фейс. Найдите другой.
lMarker не таблица, а обычный маркер.
Вам уже это давали, но там нет
m_intUReestrTuneEasy.GetMarkTunesToMarker(lMarker);
чтобы перегнать пометку из контейнера в маркер.

Если вам нужно перегнать в таблицу из маркера, то вам выше писали как.

Можно забрать напрямую с lContainer
Вот как в этом фейсе заполняется пометка ( вместо runinterface лучше объявить объект и вызвать из него эту функцию)

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

function o$GetUserGroupGal.GetGroups ( aMarkers : TPtr; var aGroupNRec : Comp ) : boolean;
  var
    i : longint;
  {
    Markers := aMarkers;
    StartNewVisual(vtIndicatorVisual, vfTimer + vfBreak + vfConfirm,'', SortedContainer_GetCount(Markers));
    mGroups.UnselectAll;
    for(i := 0; i < SortedContainer_GetCount(Markers); i++)
    {
      var cGroup : comp;
      SortedContainer_At(Markers, i, cGroup);
      if (cGroup <> 0)
        mGroups.MarkUnMarkRec(cGroup);
    }
    StopVisual('', 0);
    GroupNRec := aGroupNRec;
    Result := RunWindowModal(-1) = cmDefault;
    if Result and (aMarkers = 0)
       aGroupNRec := GroupNRec;
  }
Ответить