Как ручками добавить локатор на LIST?

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
optron
Активист
Сообщения: 114
Зарегистрирован: 29 Март 2006, 10:53
Откуда: Саранск
Контактная информация:

Как ручками добавить локатор на LIST?

Сообщение optron »

День добрый.
С55EE, ABC

Имеется такой вот LIST (Не BROWSE) SprMatList, получаемый из очереди SprMatQueue:

Код: Выделить всё

LIST,AT(4,46,422,231),USE(?SprMatList),VSCROLL,ALRT(EnterKey),ALRT(InsertKey),ALRT(DeleteKey), |
           ALRT(MouseLeft2),FORMAT('0R|M~Spec~L(2)@n3@9R|MI@S3@27R|M*~Код~C@N_6@150L(2)|M*~Наименование~C(0)@s150@3' &|
           '5L(2)|M*~<185> группы~C(0)@s6@71L|M*~Б/С~C@s20@80L(1)|M*~Получатель~C(2)@s20@40R|M*~' &|
           'Цена~C@n10.2@0R|M~SprMat_ID~L(2)@n-14@'),FROM(SprMatQueue)
Далее, она заполняется полями, соответственно:

Код: Выделить всё

SprMatQueue   queue
Spec          like(MAT:Spec)
Flag          like(MAT:Flag)
Kod           like(MAT:Kod)
Name          like(MAT:Name)
NoGr          like(MAT:NoGr)
BS            like(MAT:BS)
Poluch        like(MAT:Poluch)
Cena          like(MAT:Cena)
SprMat_ID     like(MAT:SprMat_ID)
              end
и выводится.

В окне есть поле(для локатора)
MAT:Kod ну или SprMatQueue.Kod.
Вопрос: как кодом навесить на эту очередь Incremental Locator?
Пробовал после окончания формирования очереди писать что - то типа

Код: Выделить всё

 ?SprMatList{proplist:locator , SprMatQueue.Kod} = 1
или 
   ?SprMatList{proplist:locator , MAT:Kod} = 1
Пробовал в Формате листа добавлять ?, но что - то пока никак.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Re: Как ручками добавить локатор на LIST?

Сообщение Дед Пахом »

Всё самому. И нажатия кнопок (букв) самому отлавливать (и на листе, и на локаторе), и поиск в очереди самому делать, и лист прокручивать... Грубо говоря, так:
- включить атрибут IMM для локатора
- в Event:NewSelection
Q.Locator = ?Locator{Prop:ScreenText}
GET(Q, Q.Locator)
IF NOT ERRORCODE()
?List{Prop:Selected} = POINTER(Q)
END
С уважением, ДП
kreator
✯ Ветеран ✯
Сообщения: 5161
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Re: Как ручками добавить локатор на LIST?

Сообщение kreator »

Я делаю так. После открытия окна определяю алерты для листа:

Код: Выделить всё

  j#=3
  loop i#=Key0 to Key9
    ?LOC:Queue{prop:Alrt,j#} = i#
    j# += 1
  end
  loop i#=AKey to ZKey
    ?LOC:Queue{prop:Alrt,j#} = i#
    j# += 1
  end
  loop i#=Shift0 to Shift9
    ?LOC:Queue{prop:Alrt,j#} = i#
    j# += 1
  end
  loop i#=ShiftA to ShiftZ
    ?LOC:Queue{prop:Alrt,j#} = i#
    j# += 1
  end
  ?LOC:Queue{prop:Alrt,j#} = MinusKey
  j# += 1
  ?LOC:Queue{prop:Alrt,j#} = ShiftMinus
  j# += 1
  ?LOC:Queue{prop:Alrt,j#} = PlusKey
  j# += 1
  ?LOC:Queue{prop:Alrt,j#} = ShiftPlus
  j# += 1
  ?LOC:Queue{prop:Alrt,j#} = SpaceKey
  j# += 1
  ?LOC:Queue{prop:Alrt,j#} = SlashKey
  j# += 1
  ?LOC:Queue{prop:Alrt,j#} = ShiftSlash
  j# += 1
  ?LOC:Queue{prop:Alrt,j#} = BSKey
  j# += 1
  ?LOC:Queue{prop:Alrt,j#} = AstKey
  j# += 1
  ?LOC:Queue{prop:Alrt,j#} = ShiftAst
  j# += 1
  ?LOC:Queue{prop:Alrt,j#} = DecimalKey
  j# += 1
  ?LOC:Queue{prop:Alrt,j#} = ShiftDecimal
  j# += 1
  loop i#=KeyPad0 to KeyPad9
    ?LOC:Queue{prop:Alrt,j#} = i#
    j# += 1
  end
  loop i#=ShiftPad0 to ShiftPad9
    ?LOC:Queue{prop:Alrt,j#} = i#
    j# += 1
  end
  loop i#=186 to 192
    ?LOC:Queue{prop:Alrt,j#} = i#
    j# += 1
  end
  loop i#=219 to 222
    ?LOC:Queue{prop:Alrt,j#} = i#
    j# += 1
  end
  loop i#=442 to 448
    ?LOC:Queue{prop:Alrt,j#} = i#
    j# += 1
  end
  loop i#=475 to 478
    ?LOC:Queue{prop:Alrt,j#} = i#
    j# += 1
  end
А на событие EVENT:AlertKey для ?LOC:Queue:

Код: Выделить всё

              if keycode()=BSKey
                if LOC:LocatorStringLength
                  LOC:LocatorString[(LOC:LocatorStringLength):(LOC:LocatorStringLength)] = ''
                  LOC:LocatorStringLength -= 1
                end
              else
                LOC:LocatorString = LOC:LocatorString[1:(LOC:LocatorStringLength)]&chr(keychar())
                LOC:LocatorStringLength += 1
              end
              display(?LOC:LocatorString)
              loop i#=1 to records(LOC:Queue)
                get(LOC:Queue,i#)
                if LOC:Queue.LOC:ObjectName[1:(LOC:LocatorStringLength)]=LOC:LocatorString[1:(LOC:LocatorStringLength)]
                  select(?LOC:Queue,i#)
                  break
                end
              end
We are hard at work… for you. :)
optron
Активист
Сообщения: 114
Зарегистрирован: 29 Март 2006, 10:53
Откуда: Саранск
Контактная информация:

Re: Как ручками добавить локатор на LIST?

Сообщение optron »

Спасибо. Думал, что можно попроще. Что-ж, будем пробовать.
optron
Активист
Сообщения: 114
Зарегистрирован: 29 Март 2006, 10:53
Откуда: Саранск
Контактная информация:

Re: Как ручками добавить локатор на LIST?

Сообщение optron »

Еще раз спасибо. Всё получилось!
kreator
✯ Ветеран ✯
Сообщения: 5161
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Re: Как ручками добавить локатор на LIST?

Сообщение kreator »

Если надо проще, то используем броуз. Я перестал использовать листы по очереди (практически). К броузу ведь подтянуто много вкусностей.
We are hard at work… for you. :)
optron
Активист
Сообщения: 114
Зарегистрирован: 29 Март 2006, 10:53
Откуда: Саранск
Контактная информация:

Re: Как ручками добавить локатор на LIST?

Сообщение optron »

Как то он нестабильно работает стандартный броуз.
Допустим, пишу лист на основную таблицу и автоматом шаблонами создаю броузы и апдейты дочерних таблиц. Там записей то до 10-ти к каждой основной. Делаю Change какой - либо дочерней записи и иной раз после внесения в неё изменения в списке остается она одна, а остальные 9 пропадают. Выхожу из Листа, захожу снова - опять 10 записей.

(Таблицы в MYSQL. С ТПС-ками такого не замечал.) И как этот трабл выловить в стандартных шаблонах - ума не приложу.
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Как ручками добавить локатор на LIST?

Сообщение Yufil »

Тут немного неправильно

0. Select кинет курсор на листбокс, хотим ли мы этого?
1. Нет Upper, если набираем не тем регистром - не найдётся нифига
2. Если у нас есть слова на А и В, а в локаторе вводим Б, хотелось бы встать на начало В

FreeABC Templates содержит шаблон BrowseQueue, который превращает Queue в аналог Browse, хотя и не без
ошибок. В своё время помучился, чтобы колесо в листбоксе корректно крутило очередь...
kreator
✯ Ветеран ✯
Сообщения: 5161
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Re: Как ручками добавить локатор на LIST?

Сообщение kreator »

Есть такое. Тут принципиальный момент. И дело не в апдейте. Чтобы скульные таблицы отображались в броузе по-человечески (без задвоений, и без пропаж), броуз нужно делать по уникальному ключу. Вот пример. Сортировка в броузе по наименованию, а оно не уникальное. Будут проблемы. В этом случае в сортировку нужно добавить уникальный ID (как правило первичный ключ), т. е. ключ в словаре NameKey должен быть из двух столбцов Name и ID. Проверено - проблемы пропадают. На досуге попробуй, посмотри.
И, вообще, таблицы SQL без первичного ключа не рекомендуются к использованию. Где-то это в хелпе написано, но с ходу не нашёл.
We are hard at work… for you. :)
optron
Активист
Сообщения: 114
Зарегистрирован: 29 Март 2006, 10:53
Откуда: Саранск
Контактная информация:

Re: Как ручками добавить локатор на LIST?

Сообщение optron »

Хм, спасибо. PRIMARY Key то у меня во всех таблицах есть. А вот то, что его нужно доп. включать в ключ - не слышал. Попробую.
kreator
✯ Ветеран ✯
Сообщения: 5161
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Re: Как ручками добавить локатор на LIST?

Сообщение kreator »

Во, нашёл:

Код: Выделить всё

Browsing SQL-Based Tables
 Top  Previous  Next  
This topic presents some techniques that should be followed when browsing SQL-based tables within your generated applications.

1)

You should not create a Browse procedure using an SQL table without a Key defined in the Dictionary. 

2)

You not only have to have a key defined, but the sort order has to be unique.
Without a unique Key defined you can have what we refer to as  ghosting effect, whereby at runtime paging up and down the displayed list can create duplicates in the Queue. So make sure that all your browses use a Key with a unique sort sequence. All Key defintions should include a unique column.

For example, if you had a unique EmployeeID component, and another Name key based on LastName and FirstName, add the unique EmployeeID as the third component of the name key.
 
We are hard at work… for you. :)
Ответить