Еще раз...Множественный выбор в интерфейсе

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

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

victorpvp
Новичок
Сообщения: 24
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Еще раз...Множественный выбор в интерфейсе

Сообщение victorpvp »

Уважаемые!!! Требуется помощь...плиз!
Искал по форуму пример подходящего интерфейса множественного выбора "попроще", т.к. опыта в написании интерфейсов, у меня мягко говоря, маловато, а сроки - как известно жмут...
Задача: сделать интерфейс выбора б/листов на базе использования с помощью временных таблиц в памяти используя маркеры (на форуме часто именно так советуют опытные люди...)
для последующей обработки отмеченных nRec'ов в пакетном режиме в ARD-отчете...Но вот перекопав источники, нигде не нашел чего-то цельного по моей задаче. Тут кусочек описания построения временной таблицы....там кусочек описания отработки событий на нажатие описанных кнопок селекциии....Очень прошу, у кого нибудь (если не жалко своих интеллектуальных трудов...) есть несложный пример не просто обработки отметок множественного выбора в интерфейсе, а с последующей обработкой выбора по маркерам в форме...Пока что выяснил, что в таблицу Pick отметки больничных не попадают...Так что с ним варианты отпадают...
Буду очень благодарен за практический совет,ссылку (может что просмотрел на форуме... ) ...или за код, скинутый на e-mail...
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5184
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

если вы про стандартный фейс ввода больничных то их пометка идет в Formarks ( туда правда и почти все остальные выборы в зарплате попадают). Если же про свой, то временная табла нужна может быть для сортировок, но ни как не для выбора. ищите событие cmMarkUnMark и InitMarker.
victorpvp
Новичок
Сообщения: 24
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Интерфейс свой...

Сообщение victorpvp »

Интерфейс свой, именно в нем надо как-то отмечать записи, чтобы потом именно их обработать в форме. Как инициализировать маркер, представляю....а как дальше? Как поймать отмеченные маркером записи в форме? Можете помочь?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5184
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

ну если помеченные в своем фейсе видны, то какие проблемы?
.begin
Runinterface(...) - не забудьте в нем donemarker сделать

??????:=Initmarker ( ...) - такой же как в фейсе
чего то делаете
donemarker.
end.
быстрее будет делать цикл не по больничным а по самому маркеру
MrkCount := GetMarkerCount(Marker) - 1 ;
for (i := 0; i <= MrkCount; i := i + 1)
{ if (GetMarker(tMarker, i, Item))
if getfirst blisnet where (( item == blisnet.nrec ))=0
....
}
для формы цикл может быть и таким
.{while i<=MrkCount
...
.begin i:=i+1 ;
.}
а в нем уже наполняете временную таблицу и т.д.
victorpvp
Новичок
Сообщения: 24
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Попробую...Спасибо !!!

Сообщение victorpvp »

Спасибо за помощь! Пробую...
aleks1232321
Постоянный гость
Сообщения: 86
Зарегистрирован: 28 апр 2005, 12:15
Откуда: Москва

Сообщение aleks1232321 »

Не люблю маркеры. Предпочитаю использовать PICK
Например,

. . . . . .
create view MY_PP
var
isPicked : LongInt;
FieldMarkers : LongInt;
IndexNo : LongInt;

(isPicked)

As Select
if (isValid(tnPick),''#251,''), //признак выбора
* from my_pers, pick
where
((
word(999) == Pick.wList
and my_pers.m_NRec == Pick.cRec

));

Panel pnPers ;
Table my_Pers;
Browse bwPers (,,sci1478EnIns);
Fields
isPicked '' :[1], Skip,
{Font = {Color = if (isValid(#Pick),ColorMark,0)}};
MY_Pers.M_Fio 'ФИО' ('ФИО',,) : [40], Protect,
{Font = {Color = if (isValid(#Pick),ColorMark,0)}};

end;
HandleEvent
cmMarkUnmark:
{ if (isValid(#Pick))
delete current Pick
else
{ Pick.wList:=999;
Pick.cRec := my_pers.m_NRec;
insert current Pick;
}
if (GetNext my_pers = tsOk)
{
CallToNeighBours(cmPosDown,#my_pers)
};
RescanPanel(#my_pers);
}

end; // HandleEvent
end;

HandleEvent
cmInit :
{
delete all Pick where ((Word(999) == Pick.wList))
. . . . . .

}

end; // HandleEvent
end.

И в основном интерфейсе обрабатываю PICK с кодом 999
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5184
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

ну с pick работать конечно проще, но тогда начинают раздражать сообщения "идет запись в базу" при выходе из галактики. delete all тоже беследно не проходит - потом pick.dat нужно подчищать. Да и маркер вроде как быстрее работает. Разработчик так старательно уходит от pick.
Sytin
Постоянный обитатель
Сообщения: 159
Зарегистрирован: 28 сен 2005, 19:48
Откуда: mos
Контактная информация:

Сообщение Sytin »

Я в интерфейсах выбора просто использую временные таблицы без маркеров и pick.

Например вот так:

table struct IndexTable777
(
_BaseInd_Nrec:comp
);


const
sci178InsPM = 6959;
cmMarkUnMark = 2243;
cmSelectAll = 2244;
cmUnSelectAll = 2245;
End;

Interface KatRaspor777 'Список распоряжений' (,,sci178InsPM) cyan,PushPosition,AlwaysReturn;
Show at(1,1,82,26);
var
i:integer;
isDel:boolean;

TmpNrec:comp;
create view
as select *
from KatRasp
order by DRASP,NRASP;

function SearchIndex(__Nrec:comp;var i:integer):boolean;
{
SearchIndex:=FALSE;
i:=0;
if(GetFirst IndexTable777=tsok)
do{
i:=i+1;
if(IndexTable777._BaseInd_Nrec=__Nrec){
SearchIndex:=TRUE;
break;
}
}while(GetNext IndexTable777=tsok);
}

Browse B1;
show at (1,1,80,24);
fields
if(SearchIndex(KatRasp.nrec,i),'v','')'v ':[3],Skip ,{font={bold=TRUE}};
NRasp 'номер':[10],Protect,{font={color=if(DTO<cur_date,2,1);bold=SearchIndex(KatRasp.nrec,i)}};
DRasp 'дата':[10],Protect,{font={color=if(DTO<cur_date,2,1);bold=SearchIndex(KatRasp.nrec,i)}};
DFrom 'дата с...':[10],Protect,{font={color=if(DTO<cur_date,2,1);bold=SearchIndex(KatRasp.nrec,i)}};
DTo 'дата по...':[10],Protect,{font={color=if(DTO<cur_date,2,1);bold=SearchIndex(KatRasp.nrec,i)}};
end;

HandleEvent
cmInit:{
delete all from IndexTable777;
}

cmMarkUnMark:{
isDel:=FALSE;
if(GetFirst IndexTable777=tsok)
do{
if(KatRasp.nrec=IndexTable777._BaseInd_Nrec){
delete current IndexTable777;
IsDel:=TRUE;
break;
}
}while(GetNext IndexTable777=tsok);
if(not isDel){
Insert IndexTable777 set
IndexTable777._BaseInd_Nrec:=KatRasp.nrec;
update current IndexTable777;
}
//if(getnext KatRasp <>TsOk) Then{};
Rescanpanel(B1);
}
cmSelectAll:{
delete all from IndexTable777;
_loop KatRasp{
Insert IndexTable777 set
_BaseInd_Nrec:=KatRasp.nrec;
update current IndexTable777;
}
Rescanpanel(B1);
}
cmUnSelectAll:{
delete all from IndexTable777;
Rescanpanel(B1);
}
cmDefault:{
RunInterface(RedaktRasp777,KatRasp.nrec);
RescanPanel(B1);
}
cmInsert:{
insert KatRasp;
TmpNrec:=KatRasp.nrec;
RunInterface(RedaktRasp777,KatRasp.nrec);
//message (TmpNrec);
RescanPanel(B1);
getFirst KatRasp where ((TmpNrec==KatRasp.nrec));
//getLast KatRasp;
}
cmDelete:{
if (KatRasp.Nrec!=0){
delete SPRASPMC where ((KatRasp.nrec==SpRaspMC.cRasp));
if (GetNext KatRasp=tsok) {TmpNrec:=KatRasp.nrec;GetPrev KatRasp;}
else {
if (GetPrev KatRasp=tsok){TmpNrec:=KatRasp.nrec;GetNext KatRasp;}
else TmpNrec:=0;
}
delete current KatRasp;
if (TmpNrec!=0) GetFirst KatRasp where ((TmpNrec==KatRasp.nrec));
RescanPanel(B1);
}
}
cmCancel:{
CloseInterface(cmDefault);
stop;
}
end;
end.
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Сообщение m0p3e »

edward_K писал(а):ну с pick работать конечно проще, но тогда начинают раздражать сообщения "идет запись в базу" при выходе из галактики. delete all тоже беследно не проходит - потом pick.dat нужно подчищать. Да и маркер вроде как быстрее работает. Разработчик так старательно уходит от pick.
Вот только живет маркер в dsk, а dsk очень падать любит.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5184
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

Вот только живет маркер в dsk, а dsk очень падать любит.
ну временные таблы на первасиве падают с не меньшей регулярностью :cool:
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Сообщение m0p3e »

edward_K писал(а):
Вот только живет маркер в dsk, а dsk очень падать любит.
ну временные таблы на первасиве падают с не меньшей регулярностью :cool:
Перефразирую известный анекдот:
У меня ни разу временные таблы на первасиве не падали. Что я неправильно делаю? :)

А в чем выражается "падение"?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5184
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

да по разному
наиболее популярно - индекс сбивается.
реже - просто летят, когда не дожидаются окончания "записи" после выхода из галки.
Добится можно взяв нормальную базу ( гигов на 10 хотя бы) и поработать месяцок - 100% кто-то попадется.
по зарплате это особено видно - иногда пока их все не грохнешь расчитать зарплату просто не возможно.
victorpvp
Новичок
Сообщения: 24
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Уважаемые!!! А она (т.е.ARD форма) не заводится! Что не так?

Сообщение victorpvp »

Что-то я явно неправильно делаю...В интерфейсе все работает как надо...помечаются записи,инвертируются, снимаются пометки, все визуально хорошо....В ARD форме не выбирается ни одной записи...Уж и для отладки и задачу то до работающей схемы упростил...По хорошему надо читать и читать ...документацию...Но сроки "поджаривают"...Что не так? Подскажите?
...вот форма:

.Form 'SelectMC'
.ARD
.NameInList 'Множественный выбор МЦ'
.F 'SelectMC.OUT'
.VAR
mMC :LongInt ;
IndexNo :LongInt ;
.ENDVAR
.Create view vtKATMC
SELECT
*
FROM
KATMC
WHERE
SearchMarker(mMC,KATMC.NREC, IndexNo)=True
;
.Begin
mMC := InitMarker('', 8, 10, 10) ;
ClearMarker(mMC) ;
IF RunInterface('iMARKERS', mMC) = cmCancel Then
{
MESSAGE('ВЫХОД ПО "Esc"- ? !!!',WARNING) ;
SelectMC.FEXIT ;
} ;
End.
баркод наименование выбранной
матценности
.{Table vtKATMC
.Fields
vtKATMC.KatMC.BarKod vtKATMC.KatMC.Name
.EndFields
@@@@@@@@@ @@@@@@@@@@@@@@@@@@
.}
.Begin
DoneMarker(mMC, 'MC');
End.

.EndForm
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5184
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

mMC := InitMarker('', 8, 10, 10) ;
ClearMarker(mMC) ;
DoneMarker(mMC, 'MC');
IF RunInterface('iMARKERS', mMC) = cmCancel Then
{
MESSAGE('ВЫХОД ПО "Esc"- ? !!!',WARNING) ;
SelectMC.FEXIT ;
} ;
mMC := InitMarker('', 8, 10, 10) ;
victorpvp
Новичок
Сообщения: 24
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

УРА!!!! ЗАРАБОТАЛО !!!!!

Сообщение victorpvp »

ЗАРАБОТАЛО !!!
Уважаемые, ВСЕМ помогающим, огромное спасибо!!!
Уважаемый edward_K Вы мне очень помогли! Спасибо!
:cool:
Ответить