powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / checkbox в grid'e
17 сообщений из 17, страница 1 из 1
checkbox в grid'e
    #36020012
NickMN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Почитал похожие темы, по ним начал создавать грид, понял как отслеживать нажатие, как увязывать с курсором. Грид с формой создаю программно.
...
Grid.column1.AddObject('MyCheck1','Checkbox')
Grid.column1.currentcontrol = 'Check1'
...
добавляется в первую колонку контрол checkbox

Вопрос: возможно или нет проставлять чекбокс в поле со значением,т.е. не заводить для него отдельную колонку и как при этом отслеживать его нажатие
...
Рейтинг: 0 / 0
checkbox в grid'e
    #36020031
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickMNВопрос: возможно или нет проставлять чекбокс в поле со значением,т.е. не заводить для него отдельную колонку
Не понял вопроса. А куда же вы тогда вставляете CheckBox через метод AddObject()? В не существующий столбец?

NickMNи как при этом отслеживать его нажатие
Никак.

"На лету", в процессе исполнения программы, методы не пишутся. Программирование - это код, который написан ДО собственно выполнения программы. Например, при помощи классов. Тогда добавлять надо экземпляр не базового класса CheckBox, а собственного класса на основе CheckBox.

В большинстве случаев и писать ничего не надо. Достаточно привязать CheckBox (или столбец) к полю таблицы или курсора.
...
Рейтинг: 0 / 0
checkbox в grid'e
    #36020071
NickMN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Конечно же в существующий,

попробую перефразировать вопрос,
можно ли свойство Caption объекта checkbox в гриде использовать для отображения значения поля(например фамимлия) или каких либо данных (например порядкового номера)


например:
| N п/п | Имя |
| # 1 | qwe |
| # 2 | qw |
...
| # N | q | , где # checkbox
...
Рейтинг: 0 / 0
checkbox в grid'e
    #36020145
Dag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickMNможно ли свойство Caption объекта checkbox в гриде использовать для отображения значения поля(например фамимлия) или каких либо данных (например порядкового номера)

А Вы используете подобные кунштюки в обычном чекбоксе вне грида?
...
Рейтинг: 0 / 0
checkbox в grid'e
    #36020149
Dag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то чекбокс работает с логическими данными -.T.,.F.,.NULL.
...
Рейтинг: 0 / 0
checkbox в grid'e
    #36020747
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделать-то такое можно, через методы Column.Dynamic... только потребуется много мелких доработок. Да и особого смысла это не имеет.

CheckBox - это ответ, на не явно заданный вопрос вроде: А является ли ...? Другими словами, CheckBox - это вовсе не выбор "из списка", как может показаться. Это именно согласие или не согласие с неким вопросом, который подразумевает ответ Да/Нет.

Ну, например, весьма распространенная практика использования CheckBox для указания пола: М/Ж. Проблема только в том, что это вовсе не выбор между "мужчиной" или "женщиной". Это ответ на вопрос: А является ли данный человек мужчиной? Да - мужчина, Нет - не мужчина.

Здесь нет указания на то, что данный человек - женщина. Как следствие, возможны недоразумения, если, например, данные вводятся с бумаги и в бумаге пол не указан. Т.е. следовало бы указать "не знаю" (NULL), но CheckBox - подобный ответ не предусматривает.

И как в этом случае будет выглядеть ваш интерфейс? Вы просите пользователя подтверждать, что данная строка является, к примеру, первой строкой? А что, есть сомнения?

Логичнее просто вывести еще один столбец, с информацией из интересующего поля, а в столбце с CheckBox вообще скрыть Caption. Установить такую его ширину, чтобы был виден только собственно "квадратик".
...
Рейтинг: 0 / 0
checkbox в grid'e
    #36021766
NickMN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,

Спасибо Вам за помощь. Я так и сделал, скрыл Caption чекбокса и выставил колонку в Resizeble=.F. . Просто хотел отобразить в Header колонки чекбокс, для того чтобы на него повесить функцию пометки всех чекбоксов данного столбца, сейчас Я эту функцию повесил на Header.Click первого(чекбоксного)столбца.

Еще момент, несовсем корректно получается все это дело у меня, т.е. по событию Header.Click все работает нормально(выделяются все записи чекбоксами), но если проставить/убрать чекбокс отдельно в строке и после вызвать Header.Click не всегдаполучается ожидаемый результат.

В процедуре Header.Click Я в цикле бегу по полю курсора и выставляю например первому полю, которое завязано на чекбокс, либо всем значения .Т., либо всем .F. зависит от значения Header.Tag, которое Я использую как признак "Выделить все/ Снять выделение". При этом события Checkbox у Меня вообще не описаны.

Т.е. Я на выходе хочу получить курсор и затем выгрузить его в *.тхт в соответствии с отмеченными записями в гриде.
...
Рейтинг: 0 / 0
checkbox в grid'e
    #36021886
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот в этой теме

http://forum.foxclub.ru/read.php?29,382911,382936

Рассматривается бредовая идея, но в ходе обсуждения, выяснилось, что нужно примерно то же самое - пометить некоторые записи для последующей обработки. Там же приведено несколько решений через создание дополнительного курсора.
...
Рейтинг: 0 / 0
checkbox в grid'e
    #36022024
NickMN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,

Спасибо, по ссылке сходил, но это не совсем то, у Меня курсор уже готов, т.е. Я его выбрал и добавил первую колонку типа Boolean для Check'ов, по умолчанию она у Меня вся в .Т., после Я отображаю данный курсор в Gride, и вот тут начинается, если нажимать по Header.Click("Выделить все"/"Снять выделение") то все работает нормально, но если вручную ставить-убирать галки и затем вновь кликать по Header бывает что выделяются/снимаются не все галки, такое чувство что Мои ручные щелканья невносят изменения в курсор, т.е не меняют значение с .Т. на .F. и наоборот, также заметил что если перейти в др. колонку, т.е. перевести фокус с колонки Check'ов и кликнуть по заголовку то срабатывает на ура.
...
Рейтинг: 0 / 0
checkbox в grid'e
    #36022036
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведите код, который написан в Header.Click().
...
Рейтинг: 0 / 0
checkbox в grid'e
    #36022106
NickMN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
...
Рейтинг: 0 / 0
checkbox в grid'e
    #36022112
NickMN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
извините, забыл исправить после else This.Tag="1", и еще скажу при инициализации Header Я свойству Tag присваиваю "1", т.е. третьего значения не дано
...
Рейтинг: 0 / 0
checkbox в grid'e
    #36022119
NickMN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
походу опять намудрил, в коде Я писал через 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
...
Рейтинг: 0 / 0
checkbox в grid'e
    #36022132
NickMN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
извините, чтоза бредятину пишу, сам оказывается невижу, сечас выкладываю окончательный код, без проверок на истину и ложь:

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?
...
Рейтинг: 0 / 0
checkbox в grid'e
    #36022242
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
* Сначала уводим фокус с Grid для завершения ввода в текущей ячейке
ThisForm.CommandButton1.SetFocus()

* Теперь собственно модификация
SELECT test
GO top
LOCAL llNewValue

if This.Tag="1"
	llNewValue = .T.
	This.Tag="2"
else
	llNewValue = .F.
	This.Tag="1"
endif

replace ALL a WITH m.llNewValue

* И возвращаем фокус в Grid
go top
This.parent.parent.setFocus()

Здесь логика анализа значения Tag заключается в том, что при открытии формы он у тебя не заполнен. Пустой. А начальное значение всех полей .T.

Значит, логично предположить, что первое нажатие означает "Снять все". Т.е. установить значение .F. Поскольку при первом нажатии Tag пустой, то сравнение даст .F. и попадем в ветку Else. Ну, а дальше все "как положено"

Кстати, вместо свойства Tag вполне можно анализировать и менять свойство Header.Caption. Хотя, для CheckBox полного текста видно не будет, но можно использовать ToolTips
...
Рейтинг: 0 / 0
checkbox в grid'e
    #36022323
NickMN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,

Большое спасибо за развернутый ответ, насчет фокуса теперь буду вкурсе.
Попутно вылез еще вопрос, при перемещении указателя по курсору, например в цикле scan соответственно указатель перемещается по гриду, понятно что после его можно вернуть командой go top, а можно вообще скрыть перемещение указателя, хотя это для Меня и непервоочередной вопрос, т.к. данный грид будет несильно наполняться, максимум 20-30 записей.
...
Рейтинг: 0 / 0
checkbox в grid'e
    #36022389
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В данном случае следует понимать, что Grid - это всего-лишь "окно" через которое вы смотрите на таблицу-источник. "Перемещения" в самом Grid попросту нет. Есть перемещение только и исключительно по таблице-источнику. Поэтому скрыть перемещение невозможно в принципе.

Однако Grid - это все-таки очень специфическое "окно". Как ни странно, но оно отображает изменения в содержимом таблицы и в положении указателя записи только когда в него "смотрят". Т.е. когда фокус находится в самом Grid.

А это значит, что пока фокус находится вне Grid указатель записи можно перемещать куда угодно. Видно это все-равно не будет до тех пор, пока фокус снова не попадет в Grid.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / checkbox в grid'e
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]