|
checkbox в grid'e
|
|||
---|---|---|---|
#18+
Здравствуйте. Почитал похожие темы, по ним начал создавать грид, понял как отслеживать нажатие, как увязывать с курсором. Грид с формой создаю программно. ... Grid.column1.AddObject('MyCheck1','Checkbox') Grid.column1.currentcontrol = 'Check1' ... добавляется в первую колонку контрол checkbox Вопрос: возможно или нет проставлять чекбокс в поле со значением,т.е. не заводить для него отдельную колонку и как при этом отслеживать его нажатие ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2009, 20:27 |
|
checkbox в grid'e
|
|||
---|---|---|---|
#18+
NickMNВопрос: возможно или нет проставлять чекбокс в поле со значением,т.е. не заводить для него отдельную колонку Не понял вопроса. А куда же вы тогда вставляете CheckBox через метод AddObject()? В не существующий столбец? NickMNи как при этом отслеживать его нажатие Никак. "На лету", в процессе исполнения программы, методы не пишутся. Программирование - это код, который написан ДО собственно выполнения программы. Например, при помощи классов. Тогда добавлять надо экземпляр не базового класса CheckBox, а собственного класса на основе CheckBox. В большинстве случаев и писать ничего не надо. Достаточно привязать CheckBox (или столбец) к полю таблицы или курсора. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2009, 20:49 |
|
checkbox в grid'e
|
|||
---|---|---|---|
#18+
Конечно же в существующий, попробую перефразировать вопрос, можно ли свойство Caption объекта checkbox в гриде использовать для отображения значения поля(например фамимлия) или каких либо данных (например порядкового номера) например: | N п/п | Имя | | # 1 | qwe | | # 2 | qw | ... | # N | q | , где # checkbox ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2009, 21:18 |
|
checkbox в grid'e
|
|||
---|---|---|---|
#18+
NickMNможно ли свойство Caption объекта checkbox в гриде использовать для отображения значения поля(например фамимлия) или каких либо данных (например порядкового номера) А Вы используете подобные кунштюки в обычном чекбоксе вне грида? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2009, 22:36 |
|
checkbox в grid'e
|
|||
---|---|---|---|
#18+
Вообще-то чекбокс работает с логическими данными -.T.,.F.,.NULL. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2009, 22:39 |
|
checkbox в grid'e
|
|||
---|---|---|---|
#18+
Сделать-то такое можно, через методы Column.Dynamic... только потребуется много мелких доработок. Да и особого смысла это не имеет. CheckBox - это ответ, на не явно заданный вопрос вроде: А является ли ...? Другими словами, CheckBox - это вовсе не выбор "из списка", как может показаться. Это именно согласие или не согласие с неким вопросом, который подразумевает ответ Да/Нет. Ну, например, весьма распространенная практика использования CheckBox для указания пола: М/Ж. Проблема только в том, что это вовсе не выбор между "мужчиной" или "женщиной". Это ответ на вопрос: А является ли данный человек мужчиной? Да - мужчина, Нет - не мужчина. Здесь нет указания на то, что данный человек - женщина. Как следствие, возможны недоразумения, если, например, данные вводятся с бумаги и в бумаге пол не указан. Т.е. следовало бы указать "не знаю" (NULL), но CheckBox - подобный ответ не предусматривает. И как в этом случае будет выглядеть ваш интерфейс? Вы просите пользователя подтверждать, что данная строка является, к примеру, первой строкой? А что, есть сомнения? Логичнее просто вывести еще один столбец, с информацией из интересующего поля, а в столбце с CheckBox вообще скрыть Caption. Установить такую его ширину, чтобы был виден только собственно "квадратик". ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2009, 11:22 |
|
checkbox в grid'e
|
|||
---|---|---|---|
#18+
ВладимирМ, Спасибо Вам за помощь. Я так и сделал, скрыл Caption чекбокса и выставил колонку в Resizeble=.F. . Просто хотел отобразить в Header колонки чекбокс, для того чтобы на него повесить функцию пометки всех чекбоксов данного столбца, сейчас Я эту функцию повесил на Header.Click первого(чекбоксного)столбца. Еще момент, несовсем корректно получается все это дело у меня, т.е. по событию Header.Click все работает нормально(выделяются все записи чекбоксами), но если проставить/убрать чекбокс отдельно в строке и после вызвать Header.Click не всегдаполучается ожидаемый результат. В процедуре Header.Click Я в цикле бегу по полю курсора и выставляю например первому полю, которое завязано на чекбокс, либо всем значения .Т., либо всем .F. зависит от значения Header.Tag, которое Я использую как признак "Выделить все/ Снять выделение". При этом события Checkbox у Меня вообще не описаны. Т.е. Я на выходе хочу получить курсор и затем выгрузить его в *.тхт в соответствии с отмеченными записями в гриде. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2009, 17:22 |
|
checkbox в grid'e
|
|||
---|---|---|---|
#18+
Вот в этой теме http://forum.foxclub.ru/read.php?29,382911,382936 Рассматривается бредовая идея, но в ходе обсуждения, выяснилось, что нужно примерно то же самое - пометить некоторые записи для последующей обработки. Там же приведено несколько решений через создание дополнительного курсора. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2009, 17:55 |
|
checkbox в grid'e
|
|||
---|---|---|---|
#18+
ВладимирМ, Спасибо, по ссылке сходил, но это не совсем то, у Меня курсор уже готов, т.е. Я его выбрал и добавил первую колонку типа Boolean для Check'ов, по умолчанию она у Меня вся в .Т., после Я отображаю данный курсор в Gride, и вот тут начинается, если нажимать по Header.Click("Выделить все"/"Снять выделение") то все работает нормально, но если вручную ставить-убирать галки и затем вновь кликать по Header бывает что выделяются/снимаются не все галки, такое чувство что Мои ручные щелканья невносят изменения в курсор, т.е не меняют значение с .Т. на .F. и наоборот, также заметил что если перейти в др. колонку, т.е. перевести фокус с колонки Check'ов и кликнуть по заголовку то срабатывает на ура. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2009, 18:40 |
|
checkbox в grid'e
|
|||
---|---|---|---|
#18+
Приведите код, который написан в Header.Click(). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2009, 18:46 |
|
checkbox в grid'e
|
|||
---|---|---|---|
#18+
Procedure Header.Click select crsTmp go top scan if This.Tag="1" ChkF = iif(!ChkF,.T.,ChkF) This.Tag="2" else ChkF = iif(ChkF,.F.,ChkF) This.Tag="2" endif endscan EndProc т.е. если Мы щелкаем и значение Header.Tag="1" то выдеяем все чеки, затем меняем tag, если в след раз щелкнуть по заголовку то tag="2" и Мы снимаем все чеки, ChkF - поле курсора типа Boolean ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2009, 19:37 |
|
checkbox в grid'e
|
|||
---|---|---|---|
#18+
извините, забыл исправить после else This.Tag="1", и еще скажу при инициализации Header Я свойству Tag присваиваю "1", т.е. третьего значения не дано ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2009, 19:39 |
|
checkbox в grid'e
|
|||
---|---|---|---|
#18+
походу опять намудрил, в коде Я писал через if endif, сейчас написал быстро через iif(), сейчас вижу что неправильно, вот так будет вернее, хотя зачем вообще ставить проверку,думал незачем лишний раз ставить .Т./.F. если поле и так имеет истинное/ложное значение, а можно ведь и просто все заменить на .Т. или на .F., Procedure Header.Click select crsTmp go top scan if This.Tag="1" ChkF = iif(ChkF,ChkF,.T.) This.Tag="2" else ChkF = iif(ChkF,.F.,ChkF) This.Tag="1" endif endscan EndProc ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2009, 19:49 |
|
checkbox в grid'e
|
|||
---|---|---|---|
#18+
извините, чтоза бредятину пишу, сам оказывается невижу, сечас выкладываю окончательный код, без проверок на истину и ложь: PROCEDURE Click SELECT test GO top if This.Tag="1" scan replace a WITH .T. endscan This.Tag="2" else SCAN replace a WITH .F. ENDSCAN This.Tag="1" endif ENDPROC так вот если курсор в колонке чеков он не сбрасывается, как понимаю срабатывает событие interactivechange у элемента checkbox? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2009, 20:09 |
|
checkbox в grid'e
|
|||
---|---|---|---|
#18+
NickMNтакое чувство что Мои ручные щелканья невносят изменения в курсор, т.е не меняют значение с .Т. на .F. и наоборот, Вообще-то, так и есть. Точнее, изменения происходят, но не сразу. Смысл в том, что хотя вам и кажется, что вы напрямую редактируете данные в таблице через Grid, но реально вы имеете дело с кучей промежуточных буферов. Т.е. после изменения значения на форме, выполненные модификации должны "спустится" по целому каскаду различных буферов, пока они реально не изменят данные в таблице. Но в данном случае все не так страшно. Здесь "мешает" один единственный буфер собственно Grid. Т.е. изменения сначала происходят в объекте Grid и только после того, как модификации в ячейке Grid полностью завершены, эти модификации "спускаются" в таблицу-источник. Другими словами, "единицей" буфера Grid является содержимое одной ячейки. Той самой, в которой выполняется модификация. Сигналом о том, что модификации в ячейке завершены является попытка выхода из ячейки. Либо переход на другую строку, либо переход в другой столбец, либо переход на любой объект вне Grid. NickMNтакже заметил что если перейти в др. колонку, т.е. перевести фокус с колонки Check'ов и кликнуть по заголовку то срабатывает на ура. Разумеется, ведь переходом в другую колонку вы выполнили сброс буфера в той ячейке Grid в которой выполнялось редактирование. Следовательно, перед выполнением каких-либо модификаций в таблице-источнике Grid необходимо завершить модификации в текущей ячейке Grid. Т.е. банально перевести фокус на другую ячейку или объект. Проблема в том, что заголовок столбца не может получить фокус. А перевод фокуса в другую ячейку тоже достаточно проблематичен. Поэтому стандартным решением является увод фокуса на любой другой объект вне Grid. Если на форме кроме Grid ничего больше нет или же нет объектов, способных принимать фокус, то создается дополнительный объект, например CommandButton и у него устанавливаются такие координаты Top и Left, чтобы он оказался вне области видимости. "За рамкой" формы. Например, Top = -100 В результате, код Header.Click() будет примерно таким Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Здесь логика анализа значения Tag заключается в том, что при открытии формы он у тебя не заполнен. Пустой. А начальное значение всех полей .T. Значит, логично предположить, что первое нажатие означает "Снять все". Т.е. установить значение .F. Поскольку при первом нажатии Tag пустой, то сравнение даст .F. и попадем в ветку Else. Ну, а дальше все "как положено" Кстати, вместо свойства Tag вполне можно анализировать и менять свойство Header.Caption. Хотя, для CheckBox полного текста видно не будет, но можно использовать ToolTips ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2009, 21:38 |
|
checkbox в grid'e
|
|||
---|---|---|---|
#18+
ВладимирМ, Большое спасибо за развернутый ответ, насчет фокуса теперь буду вкурсе. Попутно вылез еще вопрос, при перемещении указателя по курсору, например в цикле scan соответственно указатель перемещается по гриду, понятно что после его можно вернуть командой go top, а можно вообще скрыть перемещение указателя, хотя это для Меня и непервоочередной вопрос, т.к. данный грид будет несильно наполняться, максимум 20-30 записей. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2009, 22:40 |
|
checkbox в grid'e
|
|||
---|---|---|---|
#18+
В данном случае следует понимать, что Grid - это всего-лишь "окно" через которое вы смотрите на таблицу-источник. "Перемещения" в самом Grid попросту нет. Есть перемещение только и исключительно по таблице-источнику. Поэтому скрыть перемещение невозможно в принципе. Однако Grid - это все-таки очень специфическое "окно". Как ни странно, но оно отображает изменения в содержимом таблицы и в положении указателя записи только когда в него "смотрят". Т.е. когда фокус находится в самом Grid. А это значит, что пока фокус находится вне Grid указатель записи можно перемещать куда угодно. Видно это все-равно не будет до тех пор, пока фокус снова не попадет в Grid. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2009, 23:54 |
|
|
start [/forum/topic.php?fid=41&msg=36020012&tid=1586377]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
687ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 320ms |
total: | 1099ms |
0 / 0 |