Вызов интерфейса GetUserGroupGal
Модераторы: m0p3e, edward_K, Модераторы
-
- Сообщения: 8
- Зарегистрирован: 01 дек 2020, 08:15
Вызов интерфейса GetUserGroupGal
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'е соответственно мизерное содержание информации.
Где ошибка?
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'е соответственно мизерное содержание информации.
Где ошибка?
Re: Вызов интерфейса GetUserGroupGal
lGroupsMarker := InitMarker('', 8, 10, 5);
if RunInterface('C_TUNE::GetUserGroupGal', lGroupsMarker, cGrNrec) <> cmCancel
{
......
}
DoneMarker(lGroupsMarker, '');
}
if RunInterface('C_TUNE::GetUserGroupGal', lGroupsMarker, cGrNrec) <> cmCancel
{
......
}
DoneMarker(lGroupsMarker, '');
}
-
- Сообщения: 8
- Зарегистрирован: 01 дек 2020, 08:15
-
- Сообщения: 8
- Зарегистрирован: 01 дек 2020, 08:15
Re: Вызов интерфейса GetUserGroupGal
Рано радовался. RunTimeError также происходит, не смотря на инициализацию маркера.Ged писал(а):lGroupsMarker := InitMarker('', 8, 10, 5);
if RunInterface('C_TUNE::GetUserGroupGal', lGroupsMarker, cGrNrec) <> cmCancel
{
......
}
DoneMarker(lGroupsMarker, '');
}
![Sad :sad:](./images/smilies/087.gif)
Попытался модифицировать код по предложенному техутешкой варианту на предмет:
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, т.е. отмеченные мной группы невозможно нигде использовать.
Есть еще идеи?
Re: Вызов интерфейса GetUserGroupGal
процедурой перегрузи маркер в таблицу в памяти и работай дальше с ней например для другого маркера
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();
......
}
}
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();
......
}
}
-
- Местный житель
- Сообщения: 547
- Зарегистрирован: 17 июл 2012, 11:56
- Откуда: Республика Беларусь, г.Могилев
Re: Вызов интерфейса GetUserGroupGal
Здравствуйте.
Ged писал:
lGroupsMarker := InitMarker('', 8, 10, 5);
oiko в своем примере с интерфейсом GetSomVidD писал:
_Marker:=InitMarker('MKatVidD', 8, 10, 10);
Насколько я понимаю, при инициализации маркера надо указать его имя. Какое имя у маркера для интерфейса GetUserGroupGal Ged не указал. Возможно кто-то, у кого есть доступ к исходникам, подскажет это имя.
Ged писал:
lGroupsMarker := InitMarker('', 8, 10, 5);
oiko в своем примере с интерфейсом GetSomVidD писал:
_Marker:=InitMarker('MKatVidD', 8, 10, 10);
Насколько я понимаю, при инициализации маркера надо указать его имя. Какое имя у маркера для интерфейса GetUserGroupGal Ged не указал. Возможно кто-то, у кого есть доступ к исходникам, подскажет это имя.
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5185
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Вызов интерфейса GetUserGroupGal
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
Я нашел только одно место прямого вызова
Параметры в инициализации lContainer очень важны.
Как то не очень удачный фейс. Найдите другой.
lMarker не таблица, а обычный маркер.
Вам уже это давали, но там нет
m_intUReestrTuneEasy.GetMarkTunesToMarker(lMarker);
чтобы перегнать пометку из контейнера в маркер.
Если вам нужно перегнать в таблицу из маркера, то вам выше писали как.
Можно забрать напрямую с lContainer
Вот как в этом фейсе заполняется пометка ( вместо runinterface лучше объявить объект и вызвать из него эту функцию)
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, '');
}
Как то не очень удачный фейс. Найдите другой.
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;
}