Страница 1 из 4
Еще раз...Множественный выбор в интерфейсе
Добавлено: 19 мар 2007, 13:12
victorpvp
Уважаемые!!! Требуется помощь...плиз!
Искал по форуму пример подходящего интерфейса множественного выбора "попроще", т.к. опыта в написании интерфейсов, у меня мягко говоря, маловато, а сроки - как известно жмут...
Задача: сделать интерфейс выбора б/листов на базе использования с помощью временных таблиц в памяти используя маркеры (на форуме часто именно так советуют опытные люди...)
для последующей обработки отмеченных nRec'ов в пакетном режиме в ARD-отчете...Но вот перекопав источники, нигде не нашел чего-то цельного по моей задаче. Тут кусочек описания построения временной таблицы....там кусочек описания отработки событий на нажатие описанных кнопок селекциии....Очень прошу, у кого нибудь (если не жалко своих интеллектуальных трудов...) есть несложный пример не просто обработки отметок множественного выбора в интерфейсе, а с последующей обработкой выбора по маркерам в форме...Пока что выяснил, что в таблицу Pick отметки больничных не попадают...Так что с ним варианты отпадают...
Буду очень благодарен за практический совет,ссылку (может что просмотрел на форуме... ) ...или за код, скинутый на e-mail...
Добавлено: 19 мар 2007, 16:51
edward_K
если вы про стандартный фейс ввода больничных то их пометка идет в Formarks ( туда правда и почти все остальные выборы в зарплате попадают). Если же про свой, то временная табла нужна может быть для сортировок, но ни как не для выбора. ищите событие cmMarkUnMark и InitMarker.
Интерфейс свой...
Добавлено: 19 мар 2007, 16:56
victorpvp
Интерфейс свой, именно в нем надо как-то отмечать записи, чтобы потом именно их обработать в форме. Как инициализировать маркер, представляю....а как дальше? Как поймать отмеченные маркером записи в форме? Можете помочь?
Добавлено: 19 мар 2007, 17:18
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 ;
.}
а в нем уже наполняете временную таблицу и т.д.
Попробую...Спасибо !!!
Добавлено: 19 мар 2007, 18:30
victorpvp
Спасибо за помощь! Пробую...
Добавлено: 19 мар 2007, 18:34
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
Добавлено: 19 мар 2007, 18:45
edward_K
ну с pick работать конечно проще, но тогда начинают раздражать сообщения "идет запись в базу" при выходе из галактики. delete all тоже беследно не проходит - потом pick.dat нужно подчищать. Да и маркер вроде как быстрее работает. Разработчик так старательно уходит от pick.
Добавлено: 20 мар 2007, 20:20
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.
Добавлено: 20 мар 2007, 20:59
m0p3e
edward_K писал(а):ну с pick работать конечно проще, но тогда начинают раздражать сообщения "идет запись в базу" при выходе из галактики. delete all тоже беследно не проходит - потом pick.dat нужно подчищать. Да и маркер вроде как быстрее работает. Разработчик так старательно уходит от pick.
Вот только живет маркер в dsk, а dsk очень падать любит.
Добавлено: 21 мар 2007, 10:46
edward_K
Вот только живет маркер в dsk, а dsk очень падать любит.
ну временные таблы на первасиве падают с не меньшей регулярностью
Добавлено: 21 мар 2007, 12:02
m0p3e
edward_K писал(а):Вот только живет маркер в dsk, а dsk очень падать любит.
ну временные таблы на первасиве падают с не меньшей регулярностью
Перефразирую известный анекдот:
У меня ни разу временные таблы на первасиве не падали. Что я неправильно делаю?
А в чем выражается "падение"?
Добавлено: 21 мар 2007, 12:34
edward_K
да по разному
наиболее популярно - индекс сбивается.
реже - просто летят, когда не дожидаются окончания "записи" после выхода из галки.
Добится можно взяв нормальную базу ( гигов на 10 хотя бы) и поработать месяцок - 100% кто-то попадется.
по зарплате это особено видно - иногда пока их все не грохнешь расчитать зарплату просто не возможно.
Уважаемые!!! А она (т.е.ARD форма) не заводится! Что не так?
Добавлено: 21 мар 2007, 14:50
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
Добавлено: 21 мар 2007, 14:59
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) ;
УРА!!!! ЗАРАБОТАЛО !!!!!
Добавлено: 21 мар 2007, 16:32
victorpvp
ЗАРАБОТАЛО !!!
Уважаемые, ВСЕМ помогающим, огромное спасибо!!!
Уважаемый edward_K Вы мне очень помогли! Спасибо!