Re: LIST как BROWSE (Clarion 5.5)
Добавлено: 24 Февраль 2012, 14:44
О птичках...
ABCFree Templates содержит шаблон BrowseQueue...
ABCFree Templates содержит шаблон BrowseQueue...
Место общения программистов, форум разработчиков БД на Clarion
https://forum.clarionlife.net/
Код: Выделить всё
OF ?EditRec ! редактировать запись
GET(Q,CHOICE(?List)) ! получить в Q выделенную строку из List'а
OPEN(WinEditRec) ! открыть окно редактирования записи (это окно номер 2)
?UpdTel{PROP:USE}=Q.Tel; ?UpdFam{PROP:USE}=Q.Fam; ?UpdAdr{PROP:USE}=Q.Adr; ?UpdKat{PROP:USE}=Q.Kat;
ACCEPT
CASE ACCEPTED()
OF ?UpdRec ! кнопка сохранить
Q.Tel=?UpdTel{PROP:USE}; Q.Fam=?UpdFam{PROP:USE}; Q.Adr=?UpdAdr{PROP:USE}; Q.Kat=?UpdKat{PROP:USE};
PUT(Q) ! обновить запись в очереди
F.R=Q ! подготовить файловую запись
PUT(F) ! записать ее. Почему не пишет в файл в позицию, соответствующую позиции в Q?
DISPLAY
break
OF ?ExitRec ! кнопка выхода без сохранения
BREAK
END
END
В общем случае перед выполнением функции Put(F) необходимо выполнить функцию Get(F) или SET(F), и разумеется, NEXT(F),EugeneR писал(а):Всем здравствуйте! Помогите пожалуйста с таким маленьким вопросом. А то я что-то запутался совсем...
OF ?EditRec ! редактировать запись
GET(Q,CHOICE(?List)) ! получить в Q выделенную строку из List'а
OPEN(WinEditRec) ! открыть окно редактирования записи (это окно номер 2)
?UpdTel{PROP:USE}=Q.Tel; ?UpdFam{PROP:USE}=Q.Fam; ?UpdAdr{PROP:USE}=Q.Adr; ?UpdKat{PROP:USE}=Q.Kat;
ACCEPT
CASE ACCEPTED()
OF ?UpdRec ! кнопка сохранить
Q.Tel=?UpdTel{PROP:USE}; Q.Fam=?UpdFam{PROP:USE}; Q.Adr=?UpdAdr{PROP:USE}; Q.Kat=?UpdKat{PROP:USE};
PUT(Q) ! обновить запись в очереди
F.R=Q ! подготовить файловую запись
PUT(F) ! записать ее. Почему не пишет в файл в позицию, соответствующую позиции в Q?
DISPLAY
break
OF ?ExitRec ! кнопка выхода без сохранения
BREAK
END
END
После нажатия кнопки "сохранить изменения", PUT(F) пишет всегда в первую запись. Почему не пишет в файл в позицию, соответствующую позиции в Q?
...Get(F) или SET(F)..NEXT(F)...В общем случае перед выполнением функции Put(F) необходимо выполнить функцию Get(F) или SET(F), чтобы обозначить запись, над которой будут выполняться операции изменения или удаления.
Я использую в ROUTINE загрузку Q из F (через VIEW)В общем случае перед выполнением функции Put(F) необходимо выполнить функцию Get(F) или SET(F), и разумеется, NEXT(F), чтобы обозначить запись, над которой будут выполняться операции изменения или удаления.
Код: Выделить всё
LoadQueue ROUTINE
LOOP
NEXT(V)
IF ERRORCODE()
break
.
Q.TEL = CLIP(FDB:TEL)
Q.FAM = CLIP(FDB:FAM)
Q.ADR = CLIP(FDB:ADR)
Q.UPP = CLIP(FDB:UPP)
ADD(Q)
endили
И больше к чтению F не возвращаюсь.
Можно дурацкий вопрос: а зачем все это делать ручками,Я использую в ROUTINE загрузку Q из F (через VIEW)
Я использую драйвер TOPSPEED. KEY не использую, потому что, когда его указываю, то при открытии базы ошибка - нет записей. Почему?В этой же очереди надо сохранить либо значение уникального ключа (ID), чтобы потом можно было сделать GET по ключу,
либо, если такового нет, то POINTER или POSITION (в зависимости от драйвера)
Код: Выделить всё
PROGRAM
INCLUDE('KEYCODES.CLW')
MAP
Main PROCEDURE
END
CODE
Main
Main PROCEDURE
?EditEntry EQUATE(100)
EditEntry string(64)
Columns SHORT,DIM(8)
ChDb SHORT(0) ! флаг внесения изменений в базу и он же счетчик измененных полей
isOpen SHORT(0)
cnt LONG(0)
DropL LONG(10)
Q QUEUE,PRE(Q)
Tel STRING(5)
Fam STRING(27)
Adr STRING(27)
UPP STRING(4)
Dom STRING(4)
Kvr STRING(4)
Kat STRING(5)
Ust STRING(8)
GP STRING(4)
PR STRING(4)
END
FileName STRING(64),STATIC !Переменная имени файла
StrFlt STRING(64),STATIC
S1 STRING(5),STATIC
S2 STRING(5),STATIC
aster byte(0)
i byte(0)
F FILE,DRIVER('TOPSPEED'),NAME(FileName),PRE(FDB),BINDABLE
!K KEY(FDB:Tel)
R RECORD
Tel STRING(5)
Fam STRING(27)
Adr STRING(27)
UPP STRING(4)
Dom STRING(4)
Kvr STRING(4)
Kat STRING(5)
Ust STRING(8)
GP STRING(4)
PR STRING(4)
. .
V VIEW(F)
PROJECT(FDB:TEL,FDB:FAM,FDB:ADR,FDB:UPP,FDB:DOM,FDB:KVR,FDB:KAT,FDB:UST,FDB:GP,FDB:PR)
END
NewRecWin WINDOW('Новая запись'),AT(150,70,280,150),GRAY,MAX
GROUP('Ввод данных абонента'),AT(4,4,210,142),USE(?Gr3),BOXED
STRING('Номер телефона'),AT(08,15); ENTRY(@S5), AT(80,15,25,10), USE(?NewTel)
STRING('Aбонент'), AT(08,30); ENTRY(@S28), AT(80,30,128,10), USE(?NewFam)
STRING('Адрес'), AT(08,45); ENTRY(@S28), AT(80,45,128,10), USE(?NewAdr)
STRING('Ул/Пер'), AT(08,60); ENTRY(@S4), AT(80,60,16,10), USE(?NewUpp)
STRING('Дом'), AT(08,75); ENTRY(@S4), AT(80,75,16,10), USE(?NewDom)
STRING('Квартира'), AT(08,90); ENTRY(@S4), AT(80,90,16,10), USE(?NewKvr)
STRING('Категория'), AT(08,105);ENTRY(@S4), AT(80,105,16,10), USE(?NewKat)
STRING('Дата установки'),AT(08,120);ENTRY(@S8), AT(80,120,50,10), USE(?NewUst)
STRING('Громполоса'), AT(08,35); ENTRY(@S4), AT(80,135,16,10), USE(?NewGP)
STRING('Пара'), AT(08,50); ENTRY(@S4), AT(80,150,16,10), USE(?NewPR)
END
BUTTON('Добавить'), AT(219,08,53,27), USE(?OKnewrec), icon('OK.ICO')
BUTTON('Отменить'), AT(219,45,53,27), USE(?NOnewrec), icon('EXIT.ICO')
END
WinEditRec WINDOW('Редактирование записи'),AT(150,70,280,199),GRAY,MAX
GROUP('Изменение данных по абоненту'),AT(4,4,210,189),USE(?Gr2),BOXED
STRING('Номер телефона'),AT(8,15); ENTRY(@S5), AT(80,15,25,10), USE(?UpdTel)
STRING('Aбонент'), AT(8,30); ENTRY(@S28), AT(80,30,128,10), USE(?UpdFam)
STRING('Адрес'), AT(8,45); ENTRY(@S28), AT(80,45,128,10), USE(?UpdAdr)
STRING('Ул/Пер'), AT(8,60); ENTRY(@S4), AT(80,60,16,10), USE(?UpdUpp)
STRING('Дом'), AT(8,75); ENTRY(@S4), AT(80,75,16,10), USE(?UpdDom)
STRING('Квартира'), AT(8,90); ENTRY(@S4), AT(80,90,16,10), USE(?UpdKvr)
STRING('Категори<255>'), AT(8,105);ENTRY(@S4), AT(80,105,16,10), USE(?UpdKat)
STRING('Дата установки'),AT(8,120);ENTRY(@S8), AT(80,120,50,10), USE(?UpdUst)
STRING('Громполоса'), AT(8,135);ENTRY(@S4), AT(80,135,16,10), USE(?UpdGP)
STRING('Пара'), AT(8,150);ENTRY(@S4), AT(80,150,16,10), USE(?UpdPR)
END
BUTTON('Применить'), AT(219,8,53,27), USE(?UpdRec), ICON('OK.ICO')
BUTTON('Выход'), AT(219,45,53,27), USE(?ExitRec), ICON('EXIT.ICO')
END
Win1 WINDOW('ТЕЛЕФОННЫЙ СПРАВОЧНИК Технологической св<255>зи '),AT(0,1,556,272),SYSTEM,GRAY
GROUP(' Фильтр '),AT(4,4,215,55),USE(?Group1),BOXED
STRING('По номеру телефона:'),AT(8,16,65,10),USE(?pont),DISABLE
ENTRY(@s5),AT(84,12,25,10),USE(?Tel),DISABLE
STRING('По имени:'),AT(8,32,30,10),USE(?poim),DISABLE
ENTRY(@S31),AT(56,28,100,10),USE(?Im),DISABLE
STRING('По адресу:'),AT(8,44,34,10),USE(?poad),DISABLE
ENTRY(@S31),AT(56,44,100,10),USE(?Adr),DISABLE
BUTTON('Применить'),AT(164,12,50,40),USE(?BF),DISABLE,ICON('TLF7.ICO')
END
LIST,AT(4,80,548,180),USE(?List),HVSCROLL,ALRT(EnterKey),ALRT(MouseLeft2),ALRT(MouseLeft), |
FORMAT( '32L@s05@~Телефон~' &|
'99L@s27@~| Абонент~' &|
'99L@s27@~| Адрес~' &|
'27L@s04@~| ул/пер~' &|
'19L@s04@~| Дом~' &|
'22L@s04@~| Квар~' &|
'40L@s05@~| Категори<255>~' &|
'60L@s08@~| Дата установки~' &|
'47L@s04@~| Громполоса~' &|
'05L@s04@~| Пара~'),FROM(Q)
BUTTON('Выход'),AT(504,8,46,48),USE(?Cancel),ICON('EXIT.ICO')
BUTTON('Открыть базу'),AT(228,12,60,20),USE(?OpBase) !,ICON('OPEN.ICO') !ENTRY(@S15),AT(280,10,80,15),USE(STR1)
BUTTON('Нова<255> запись'),AT(292,12,60,20),USE(?NewRec),DISABLE
BUTTON('Редактировать'),AT(228,36,60,20),USE(?EditRec),DISABLE !,ICON('EXIT.ICO')
BUTTON('Удалить запись'),AT(292,36,60,20),USE(?DelRec),DISABLE
PROGRESS,USE(?Pr),DISABLE,AT(4,64,548,14),RANGE(0,300)
END
CODE
OPEN(Win1)
ACCEPT
CASE FIELD()
OF ?List
CASE EVENT()
OF EVENT:PreAlertKey
CYCLE
OF EVENT:AlertKey
CASE KEYCODE()
!IF KEYCODE()=MouseRight
! EXECUTE POPUP('ONE|TWO')
! END
!END
OF EnterKey OROF MouseLeft2
GET(Q,CHOICE())
OF MouseLeft
IF ?List{PROPLIST:MouseDownRow} = 0
!Message(Columns[?List{PROP:COLUMN}])
EXECUTE Columns[?List{PROPLIST:MouseDownField}]
!EXECUTE Columns[?List{PROP:COLUMN}]
SORT(Q,Q.Tel)
SORT(Q,Q.Fam)
SORT(Q,Q.ADR)
SORT(Q,Q.UPP)
SORT(Q,Q.DOM)
SORT(Q,Q.KVR)
SORT(Q,Q.KAT)
SORT(Q,Q.UST)
SORT(Q,Q.GP)
SORT(Q,Q.PR)
END
?List{PROP:Edit,?List{PROP:Column}} = 0 ! скрыть поле редактирования
SELECT(?) ! остаться в текущем контроле
END
END ! case keycode()
!----------------
OF event:accepted
END ! case event
OF ?OpBase
IF FileName <> '' ! ЕСЛИ ОТКРЫВАЕМ 2-Ю БАЗУ
close(F); close(V)
end
IF FILEDIALOG('Выбирите базу для работы',FileName, 'Bases|*.TPS', FILE:LongName)
! подготовить дисковый файл
OPEN(F);
IF NOT RECORDS(F)
MESSAGE('База пуста.','Информация',ICON:Clarion,,,0)
.
SET(F)
! подготовить виртуальный файл
OPEN(V); set(V); free(Q)
! подготовить очередь
DO LoadQueue
DISPLAY
ENABLE(?BF); ENABLE(?EditRec); ENABLE(?NewRec); ENABLE(?DelRec)
ENABLE(?pont); ENABLE(?Tel); ENABLE(?poim); ENABLE(?Im);
ENABLE(?poad); ENABLE(?Adr);
! читаем первую запись
SET(V)
NEXT(V)
!Q=F.R
SELECT(?List,1) ! ставим курсор на первую запись
END ! filedialog
!=====================================================================
OF ?EditRec ! редактировать запись
GET(Q,CHOICE(?List))
OPEN(WinEditRec)
?UpdTel{PROP:USE}=Q.Tel; ?UpdFam{PROP:USE}=Q.Fam; ?UpdAdr{PROP:USE}=Q.Adr; ?UpdUpp{PROP:USE}; ?UpdDom{PROP:USE}=Q.Dom;
?UpdKvr{PROP:USE}=Q.Kvr; ?UpdKat{PROP:USE}=Q.Kat; ?UpdUst{PROP:USE}=Q.Ust; ?UpdGP{PROP:USE}=Q.GP; ?UpdPR{PROP:USE}=Q.PR
ACCEPT
CASE ACCEPTED()
OF ?UpdRec ! кнопка сохранить
Q.Tel=?UpdTel{PROP:USE}; Q.Fam=?UpdFam{PROP:USE}; Q.Adr=?UpdAdr{PROP:USE}; Q.Upp=?UpdUpp{PROP:USE}; Q.Dom=?UpdDom{PROP:USE};
Q.Kvr=?UpdKvr{PROP:USE}; Q.Kat=?UpdKat{PROP:USE}; Q.Ust=?UpdUst{PROP:USE}; Q.GP=?UpdGP{PROP:USE}; Q.PR=?UpdPR{PROP:USE}
PUT(Q) ! обновить запись в очереде
F.R=Q ! подготовить файловую запись
!message('3:' & pointer(V))
PUT(F) ! записать ее
DISPLAY
break
OF ?ExitRec ! кнопка выхода без сохранения
BREAK
.
.
if accepted()=?UpdRec
!!message('--------')
end
CLOSE(WinEditRec)
DISPLAY
OF ?Cancel ! завершить программу
close(F)
close(V)
CLOSE(Win1)
RETURN
! обработка поля фильтра
OF ?BF
aster=0
StrFlt=?tel{prop:use}
S1 = StrFlt
S2 = StrFlt
loop i=1 to 5
if StrFlt[i]='*'
S1[i]=0
S2[i]=9
aster = 1
. .
if aster=1
V{PROP:FILTER} = 'FDB:TEL>' & S1 & ' and FDB:TEL<' & S2
else
V{PROP:FILTER} = 'FDB:TEL=' & StrFlt
end
SET(V)
FREE(Q)
DO LoadQueue
display(?)
! ввести новую запись
OF ?NewRec
OPEN(NewRecWin)
ACCEPT
CASE ACCEPTED()
OF ?OKnewrec
Q.Tel=?NewTel{PROP:USE}; Q.Fam=?NewFam{PROP:USE}; Q.Adr=?NewAdr{PROP:USE}; Q.Upp=?NewUpp{PROP:USE}; Q.Dom=?NewDom{PROP:USE};
Q.Kvr=?NewKvr{PROP:USE}; Q.Kat=?NewKat{PROP:USE}; Q.Ust=?NewUst{PROP:USE}; Q.GP=?NewGP{PROP:USE}; Q.PR=?NewPR{PROP:USE}
ADD(Q)
F.R=Q ! подготовить файловую запись
ADD(F) ! записать ее
BREAK
OF ?NOnewrec
BREAK
END
END
CLOSE(NewRecWin)
SELECT(?List,POINTER(Q))
! удалить запись
OF ?DelRec
!MESSAGE(POINTER(Q))
DELETE(Q)
SET(F,POINTER(Q))
DELETE(F)
DISPLAY(?)
END ! case field()
END
LoadQueue ROUTINE
LOOP
NEXT(V)
IF ERRORCODE()
break
.
Q.TEL = CLIP(FDB:TEL)
Q.FAM = CLIP(FDB:FAM)
Q.ADR = CLIP(FDB:ADR)
Q.UPP = CLIP(FDB:UPP)
Q.DOM = CLIP(FDB:DOM)
Q.KVR = CLIP(FDB:KVR)
Q.KAT = CLIP(FDB:KAT)
Q.UST = CLIP(FDB:UST)
Q.GP = CLIP(FDB:GP)
Q.PR = CLIP(FDB:PR)
ADD(Q)
.
Тоже негодую. Но я зашел и поправил сам. А у тебя что прав нет?Дед Пахом писал(а):Евгений.
Я такие посты буду удалять. Прикрепляйте файл с программой к сообщению или в конце концов ставьте тег <code>, чтобы это хотя бы читалось.
Есть, наверно. Но и у авторов постов есть права на редактирование.Admin писал(а):Тоже негодую. Но я зашел и поправил сам. А у тебя что прав нет?Дед Пахом писал(а):Евгений.
Я такие посты буду удалять. Прикрепляйте файл с программой к сообщению или в конце концов ставьте тег <code>, чтобы это хотя бы читалось.