LIST как BROWSE (Clarion 5.5)
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- Посетитель
- Сообщения: 30
- Зарегистрирован: 02 Август 2011, 12:40
- Откуда: г. Ленинск-Кузнецкий
Re: LIST как BROWSE (Clarion 5.5)
Всем здравствуйте! Помогите пожалуйста с таким маленьким вопросом. А то я что-то запутался совсем...
После нажатия кнопки "сохранить изменения", PUT(F) пишет всегда в первую запись. Почему не пишет в файл в позицию, соответствующую позиции в Q?
Код: Выделить всё
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
Re: LIST как BROWSE (Clarion 5.5)
В общем случае перед выполнением функции 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?

Последний раз редактировалось svru 22 Май 2012, 19:07, всего редактировалось 1 раз.
Re: LIST как BROWSE (Clarion 5.5)
1.Надо обработать Event:NewSelection для листбокса, чтобы выбрать запись очереди
Get(Queue,?List{Prop:Selected})
2. Весьма удобно поля для EIP делать непосредственно полями очереди (?Q:Tel, ?Q:Fam и т.д.), тогда игрища с Prop:Use становятся абсолютно не нужными.
3. Запись сохраняется не по кнопке, а по Event:Selected на любое поле, кроме редактируемых. Иначе будут неприятности при уходе с листбокса.
Get(Queue,?List{Prop:Selected})
2. Весьма удобно поля для EIP делать непосредственно полями очереди (?Q:Tel, ?Q:Fam и т.д.), тогда игрища с Prop:Use становятся абсолютно не нужными.
3. Запись сохраняется не по кнопке, а по Event:Selected на любое поле, кроме редактируемых. Иначе будут неприятности при уходе с листбокса.
Re: LIST как BROWSE (Clarion 5.5)
...Get(F) или SET(F)..NEXT(F)...В общем случае перед выполнением функции Put(F) необходимо выполнить функцию Get(F) или SET(F), чтобы обозначить запись, над которой будут выполняться операции изменения или удаления.
А перед PUT(F) желательно WATCH() какой-нибудь вставить, если, конечно, это не однопользовательская система.
Да и DUPLICATE() не помешает для проверки, чего там навводили.
...PUT(F) лучше делать под LOGOUT() и вносить изменения в очередь Q после COMMIT.
А лучше всего переделать это всё на стандартный темплейт Form, если это не противоречит принципам разработчика.
-
- Посетитель
- Сообщения: 30
- Зарегистрирован: 02 Август 2011, 12:40
- Откуда: г. Ленинск-Кузнецкий
Re: LIST как BROWSE (Clarion 5.5)
Я использую в 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 не возвращаюсь.
Re: LIST как BROWSE (Clarion 5.5)
В этой же очереди надо сохранить либо значение уникального ключа (ID), чтобы потом можно было сделать GET по ключу,
либо, если такового нет, то POINTER или POSITION (в зависимости от драйвера), опять-таки чтобы сделать GET по указателю или REGET.
Ну и всё вышесказанное.
либо, если такового нет, то POINTER или POSITION (в зависимости от драйвера), опять-таки чтобы сделать GET по указателю или REGET.
Ну и всё вышесказанное.
-
- Ветеран
- Сообщения: 390
- Зарегистрирован: 26 Август 2009, 12:41
- Откуда: Moscow
- Контактная информация:
Re: LIST как BROWSE (Clarion 5.5)
Добрый день!
а не использовать стандартный temlate Browse ? Который все это делает сам...
Алексей
Можно дурацкий вопрос: а зачем все это делать ручками,Я использую в ROUTINE загрузку Q из F (через VIEW)
а не использовать стандартный temlate Browse ? Который все это делает сам...
Алексей
-
- Посетитель
- Сообщения: 30
- Зарегистрирован: 02 Август 2011, 12:40
- Откуда: г. Ленинск-Кузнецкий
Re: LIST как BROWSE (Clarion 5.5)
Я использую драйвер TOPSPEED. KEY не использую, потому что, когда его указываю, то при открытии базы ошибка - нет записей. Почему?В этой же очереди надо сохранить либо значение уникального ключа (ID), чтобы потом можно было сделать GET по ключу,
либо, если такового нет, то POINTER или POSITION (в зависимости от драйвера)
Re: LIST как BROWSE (Clarion 5.5)
Давайте поподробнее и лучше с кодом (описания файла и места ошибки).
А то я смотрю у вас и в LoadQueue закралась ошибка: отсутствует SET() перед циклом LOOP.
(Надобно сказать, что NEXT() всегда работает в паре с SET(), типа также как FindFirst..FindNext, если так понятнее)
А то я смотрю у вас и в LoadQueue закралась ошибка: отсутствует SET() перед циклом LOOP.
(Надобно сказать, что NEXT() всегда работает в паре с SET(), типа также как FindFirst..FindNext, если так понятнее)
-
- Посетитель
- Сообщения: 30
- Зарегистрирован: 02 Август 2011, 12:40
- Откуда: г. Ленинск-Кузнецкий
Re: LIST как BROWSE (Clarion 5.5)
Вот код, посмотрите, пожалуйста. Как работать с индексными файлами (или ключами)? Как исправить режим корректировки записи? Как улучшить фильтр? (Давайте только без шаблонов, всё ручками - мне так надо для большего понимания "из нутри")
Код: Выделить всё
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)
.
- Дед Пахом
- Старичок
- Сообщения: 3288
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 49 раз
- Контактная информация:
Re: LIST как BROWSE (Clarion 5.5)
Евгений.
Я такие посты буду удалять. Прикрепляйте файл с программой к сообщению или в конце концов ставьте тег <code>, чтобы это хотя бы читалось.
Я такие посты буду удалять. Прикрепляйте файл с программой к сообщению или в конце концов ставьте тег <code>, чтобы это хотя бы читалось.
С уважением, ДП
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Re: LIST как BROWSE (Clarion 5.5)
Тоже негодую. Но я зашел и поправил сам. А у тебя что прав нет?Дед Пахом писал(а):Евгений.
Я такие посты буду удалять. Прикрепляйте файл с программой к сообщению или в конце концов ставьте тег <code>, чтобы это хотя бы читалось.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
-
- Посетитель
- Сообщения: 30
- Зарегистрирован: 02 Август 2011, 12:40
- Откуда: г. Ленинск-Кузнецкий
Re: LIST как BROWSE (Clarion 5.5)
Извините, исправлюсь. Если не трудно, подскажите что с моей проблемой?
- Дед Пахом
- Старичок
- Сообщения: 3288
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 49 раз
- Контактная информация:
Re: LIST как BROWSE (Clarion 5.5)
Есть, наверно. Но и у авторов постов есть права на редактирование.Admin писал(а):Тоже негодую. Но я зашел и поправил сам. А у тебя что прав нет?Дед Пахом писал(а):Евгений.
Я такие посты буду удалять. Прикрепляйте файл с программой к сообщению или в конце концов ставьте тег <code>, чтобы это хотя бы читалось.
С уважением, ДП