|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
Для решения конкретных задач (которые с большими ограничениями решались табличной формой) сделал ленточную форму которая имеет нужный функционал из табличной + имеет необходимые мне новые свойства. 1. Выглядит как табличная. 2. Может иметь закреплённые столбцы (как слева так и справа). 3. Свобода форматирования заголовка и примечания (для вывода итогов) и их перемещение при горизонтальной прокрутке формы. Так вот, все поставленные задачи решены успешно за исключения одного нюанса. Горизонтальную прокрутку (с целью реализации закреплённых столбцов) смог осуществить только с помощью FlatScrollBar и поэтому визуально горизонтальная и вертикальная полосы прокрутки отличаются. Нельзя ли сделать горизонтальную полосу такого же вида как и вертикальная? На примере прикреплена снизу (от ленточной формы), но конечно же не функционирует как FlatScrollBar. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2017, 02:22 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
GVOVНельзя ли сделать горизонтальную полосу такого же вида как и вертикальная? Можно, через API, где-то я уже делал такое, нужно поискать. Как-то сделал гибрид табличной формы (данные) и ленточной (для заголовков), но синхронизировать горизонтадьную прокрутку удалось только через таймер, а таймер влиял на пересчет вычисляемых полей и условное форматирование - пришлось отказаться от идеи. А так неплохо выглядело, кроме фиксации колонок можно было менять их размер, переставлять, скрывать, пользоваться встроенными фильтрами. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2017, 07:08 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
Да, вот, похоже, нашел свой эксперимент, он в accdb, сюда не лезет, но идея там такая: По таймеру считывается позиция встроенного скроллбара подформы через API функцию GetScrollPos, предварительно получив хандлер этого скроллбара через EnumChildWindows, при изменении положения пересчитывается красивый заголовок от ленточной формы. Посему поддержу вопрос: можно ли "прицепиться" к штатному скроллбару и "слушать" от него события вместо опроса по таймеру позиции этого скроллбара? У меня в свое время не хватиле времени/желания это добить. Завязываться на ActiveX-ы совершенно не хочется, т.к. они попросту почти все не работают в 64-х разрядной версии офиса и вообще капризная вещь. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2017, 07:27 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
MrShinДа, вот, похоже, нашел свой эксперимент, он в accdb, сюда не лезет, но идея там такая: По таймеру считывается позиция встроенного скроллбара подформы через API функцию GetScrollPos, предварительно получив хандлер этого скроллбара через EnumChildWindows, при изменении положения пересчитывается красивый заголовок от ленточной формы. Посему поддержу вопрос: можно ли "прицепиться" к штатному скроллбару и "слушать" от него события вместо опроса по таймеру позиции этого скроллбара? У меня в свое время не хватиле времени/желания это добить. Завязываться на ActiveX-ы совершенно не хочется, т.к. они попросту почти все не работают в 64-х разрядной версии офиса и вообще капризная вещь. Дык генерируйте события и обробатывайте их. Чё вы превезались к Access 64(полный ушерб выгод ни каких читайте наши топики) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2017, 08:18 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
ROIгенерируйте события и обробатывайте их Мой вопрос именно в том, как сгенерировать событие хотя бы от перемещения полосы прокрутки, в идеале еще от изменения размеров/положения колонок табличной формы. ROIЧё вы превезались к Access 64 IT службы компаний далеко не всегда руководствуются нуждами акцесс программистов, поэтому ставятся 64-х разрядные версии для работающих в Экселе (а там есть преимущества). Поэтому приходится работать с тем, что есть у клиентов. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2017, 08:34 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
MrShin Как-то сделал гибрид табличной формы (данные) и ленточной (для заголовков), но синхронизировать горизонтадьную прокрутку удалось только через таймер. Тут немного не то. Тут нет гибрида. Тут классическая табличная форма. Заморачиваться с синхронизацией не хотелось бы так как теряется надёжность работы. Хочется просто найти компонент аналогичный FlatScrollBar только имеющий вид встроенной полосы прокрутки. ActiveX не проблема, всегда программу можно запустить в 2003 рантайме. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2017, 10:54 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
MrShinМой вопрос именно в том, как сгенерировать событие хотя бы от перемещения полосы прокрутки, в идеале еще от изменения размеров/положения колонок табличной формы. Я это упростил сделав прокрутку целыми полями. В зависимости от находжения фокуса в таблице отрисовывается видимость полей В фиксированных позициях) и соответствующая позиция FlatScrollBar. Получилось достаточно надёжно и удобно, как мне кажется. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2017, 10:58 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
GVOVХочется просто найти компонент аналогичный FlatScrollBar только имеющий вид встроенной полосы прокрутки.Ну компонент - не компонент, но всё ж ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2017, 11:33 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
ПанургGVOVХочется просто найти компонент аналогичный FlatScrollBar только имеющий вид встроенной полосы прокрутки.Ну компонент - не компонент, но всё ж Контрол интересный, но вид у него всё таки не такой как у стандартной полосы прокрутки субформы ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2017, 12:11 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
GVOVКонтрол интересный, но вид у него всё таки не такой как у стандартной полосы прокрутки субформыДа? Как знаешь... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2017, 12:52 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
ПанургНу компонент - не компонент, но всё ж О!, Похоже, в нем и на мой вопрос ответ есть. Не простой, правда. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2017, 13:34 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
Панург, А у меня так не получается. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2017, 13:39 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
Всем привет, MrShinПосему поддержу вопрос: можно ли "прицепиться" к штатному скроллбару и "слушать" от него события вместо опроса по таймеру позиции этого скроллбара? У меня в свое время не хватиле времени/желания это добить. Завязываться на ActiveX-ы совершенно не хочется, т.к. они попросту почти все не работают в 64-х разрядной версии офиса и вообще капризная вещь. Вот тут 20797575 я выкладывал пример. Там же описал все плюсы и минусы. Код можно адаптировать под 64bit. MrShinМой вопрос именно в том, как сгенерировать событие хотя бы от перемещения полосы прокрутки Прослушиваются не только клики по полосе прокрутки, но и другие события: прокрутка формы колесиком мыши, прокрутка формы при использовании middle button(нажатие на колесико и удержание), прокрутка формы в результате смены фокуса, как при использовании клавиатуры(tab, стрелки и т.п.), так и мыши. Тот случай, когда прокручивание происходит в результате получения фокуса контролом, который частично или полностью не виден, выходя за границы формы. MrShinкак сгенерировать событие ... в идеале еще от изменения размеров/положения колонок табличной формы Основа примера - функция API SetWindowsHookEx. Пример можно доработать/переделать под вашу задачу. Как я понял, по сути что вам нужно, это возможность подписки на событие, происходящее в ответ на изменение ширины столбцов или порядка их следования. Такое событие можно организовать, основа кода заложена. Если действительно нужно - могу поучаствовать, допилим. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2017, 23:03 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
GVOV, заметил три шероховатости: 1. Если сделать двойной клик по стрелке гор.полосы прокрутки, то вместо ожидаемых смещений на ширину двух столбцов, происходит смещение только на один столбец. 2. Станьте в поле(значение 6129). Нажмите TAB. Что произошло со значением в поле, куда перешел фокус? Нажмите TAB снова. Опять фокусы. 3. Станьте в итоговое поле(значение 97). Кликните по стрелке гор.полосы прокрутки вправо. Посмотрите, что произошло с итогом по столбцу "Сумма". Сделайте еще пару кликов по стрелке. Итог по "Сумма" отображается некорректно. Я правильно понял, что ваша цель - создание горизонтальных и вертикальных(несмещаемых) итогов? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2017, 23:37 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
MrShinROIгенерируйте события и обробатывайте их Мой вопрос именно в том, как сгенерировать событие хотя бы от перемещения полосы прокрутки, в идеале еще от изменения размеров/положения колонок табличной формы. ROIЧё вы превезались к Access 64 IT службы компаний далеко не всегда руководствуются нуждами акцесс программистов, поэтому ставятся 64-х разрядные версии для работающих в Экселе (а там есть преимущества). Поэтому приходится работать с тем, что есть у клиентов. Нука- нука по подробнее преимущество Эксель 64 (конкретные преимущество) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2017, 06:08 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
Вакшуль СергейОснова примера - функция API SetWindowsHookEx Да, похоже, то что нужно! Спасибо! Как найдется время, допилю свой эксперимент. Кстати, пока не разбирался с кодом досконально, но успел заметить, что активно используются таймеры. Для чего они нужны в двух словах? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2017, 06:55 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
ROIНука- нука по подробнее преимущество Эксель 64 (конкретные преимущество) Основное преимущество - нет ограничения в 2ГБ по памяти. Одного этого пункта бывает достаточно для ИТ отдела при выборе разрядности, особенно если уже были жалобы о нехватке памяти. В некоторых организациях на Экселе чуть ли не ERP умудряются сделать и мучаются потом с этим. При работе с запросами из базы данных памяти много нужно. Project также начал поддерживать файлы более 2 Гб, некоторым уже не хватет 2 гиг на проект. В общем, реальность такова, что, по моим ощущениям, примерно четверть организаций на западе ставит 64-х разрядные версии, с этим приходится жить. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2017, 07:09 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
MrShinROIНука- нука по подробнее преимущество Эксель 64 (конкретные преимущество) Основное преимущество - нет ограничения в 2ГБ по памяти. Одного этого пункта бывает достаточно для ИТ отдела при выборе разрядности, особенно если уже были жалобы о нехватке памяти. В некоторых организациях на Экселе чуть ли не ERP умудряются сделать и мучаются потом с этим. При работе с запросами из базы данных памяти много нужно. Project также начал поддерживать файлы более 2 Гб, некоторым уже не хватет 2 гиг на проект. В общем, реальность такова, что, по моим ощущениям, примерно четверть организаций на западе ставит 64-х разрядные версии, с этим приходится жить. Обалдеть. Оказывается человек создал базу 2 гб. И гордится этим (базу заведомо гавно) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2017, 11:03 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
ROIОбалдеть. Оказывается человек создал базу 2 гб. И гордится этим (базу заведомо гавно) Не понял, что за наезды? Я что ли файлы с потребностью памяти больше 2 гиг создаю или ратую за установку 64-х битной версии? Я констатирую факт. Если вам не приходится работать с клиентами, у которых стоит 64-х битный офис, то вам просто везет. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2017, 12:16 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
MrShinROIОбалдеть. Оказывается человек создал базу 2 гб. И гордится этим (базу заведомо гавно) Не понял, что за наезды? Я что ли файлы с потребностью памяти больше 2 гиг создаю или ратую за установку 64-х битной версии? Я констатирую факт. Если вам не приходится работать с клиентами, у которых стоит 64-х битный офис, то вам просто везет. 1 Выигрышь в 2 гб не о чем 2 Много чего нуно допиливать (смотрите наши топики) 3 а так как вы и с 32бит работать не можете то о 64 бит забудьте. 4 сначала научитесь с 32бит работать, а уж потом (64) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2017, 12:29 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
MrShinROIОбалдеть. Оказывается человек создал базу 2 гб. И гордится этим (базу заведомо гавно) Не понял, что за наезды? Я что ли файлы с потребностью памяти больше 2 гиг создаю или ратую за установку 64-х битной версии? Я констатирую факт. Если вам не приходится работать с клиентами, у которых стоит 64-х битный офис, то вам просто везет. Я же спросил про ЭКСЕЛЬ ну в чем преимущество 64 только не надо про размер файла. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2017, 12:31 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
ROI, Еще раз. Мне не нужны советы по выбору битности, я сам таких советов могу надавать сколько хочешь, начиная с Access 2.0. Никогда по доброй воле 64-х битный геморрой не поставлю. Перечитай еще раз, разве я говорил, что эксель 64 умеет работать с ФАЙЛАМИ больше 2 Гб? Я говорил про ПАМЯТЬ, в любом сравнении версий об этом есть. Дальнейшую дискуссию вести не вижу смысла, оффтопик к тому же. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2017, 13:00 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
MrShinROI, Еще раз. Мне не нужны советы по выбору битности, я сам таких советов могу надавать сколько хочешь, начиная с Access 2.0. Никогда по доброй воле 64-х битный геморрой не поставлю. Перечитай еще раз, разве я говорил, что эксель 64 умеет работать с ФАЙЛАМИ больше 2 Гб? Я говорил про ПАМЯТЬ, в любом сравнении версий об этом есть. Дальнейшую дискуссию вести не вижу смысла, оффтопик к тому же. Я знаю про ограничения в размере файла. Делаю периодическое подгрызания базы. проблем нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2017, 13:14 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
MrShin...но успел заметить, что активно используются таймеры. Для чего они нужны в двух словах? в той же ветке "13-ый квартал" обратил мое внимание 20782737 на работу Бенедикта 10808021 , предложив доработать. Но чтобы провести такую доработку, нужно глубоко погрузится в тему. Одно дело использовать инструменты для работы с данными, другое дело создавать их. Копать в том направлении возможности/необходимости нет. Я пробовал с сублассингом формы, обрабатывая системые сообщение, но натолкнулся на определенные ограничения, описал тут: 20774213 , 20780341 Поэтому и остановился на SetWindowsHookEx. Эта функция среди прочего позволяется мониторить "low-level mouse input events". Т.е., допустим, сделали клик и смотрим: куда собственно? Если клик пришелся по полосе прокрутки, значит, ее значение в результате клика скорее всего изменится. Но изменится оно чуть позже, ведь мы же перехватили системное сообщение(можем даже его отменить) и до полосы прокрутки оно еще не дошло. Т.е. когда сообщение дойдет и будет обработано нам нужно будет вернутся и сгенерировать то самое событие ради чего все и затеялось: RaiseEvent Scrolled(blnVScroll, blnHScroll) Но как вернутся? Завести таймер и ждать обратный вызов: SetTimer(0, 0, 1500, AddressOf TimerProcForMOUSE) А в процедуре обратного вызова(TimerProcForMOUSE) уже смотреть что изменилось и делать выводы. Да таймер используется, но только когда действительно нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2017, 14:28 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
Вакшуль Сергей, Спасибо за пояснения. Вакшуль Сергейнужно глубоко погрузится в тему Да, это я заметил. По субклассингу, я смотрю, на Стэке тоже на смогли помочь. Вакшуль СергейДа таймер используется, но только когда действительно нужно Я почему полез в таймеры, заметил, что заголовок окна VBA редактора иногда помаргивает, как при работающем таймере. Не мог там остаться какой-то из таймеров работать даже когда фокуса нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2017, 14:45 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
MrShin, помаргивание в VBA это не из-за таймера, а из-за уставновленного фильтра(hook) сообщений функцией SetWindowsHookEx. Это происходит только тогда, когда открыта хотя бы одна форма, подписанная на события класса FormScrollBars. Т.е. установлен hook (Hook <> 0): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
Когда формы, за прокруткой которых нужно следить, закрыты, то hook снимается. вообще, если делать по хорошему, то значение Hook лучше хранить в TempVars. Тогда оно никогда не потеряется при сбросе переменных. Преимущество SetWindowsHookEx перед субклассингом в том, что Access пропускает через себя не все подряд сист.сообщения, а только их часть, здесь - только те из них, которые определяются константой WH_MOUSE_LL ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2017, 15:14 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
MrShinПо субклассингу, я смотрю, на Стэке тоже на смогли помочь. да, причем, любопытно, чем закончилось обсуждение на Social.msdn: https://social.msdn.microsoft.com/Forums/office/en-US/4cf1d113-d905-4cdf-9f82-eb2c8d3666ed/setwindowlong-on-a-ms-access-form-what-happens-if-ide-window-is-open?forum=accessdev Оказалось, что закрыть окно среды VBE невозможно. По клику на "крестик" окна VBE, Access просто скрывает это окно, но не закрывает. А при закрытии этого окна силой через API, кроме окна VBE закрывается также основное окно Access. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2017, 16:56 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
Вакшуль СергейGVOV, заметил три шероховатости: 1. Если сделать двойной клик по стрелке гор.полосы прокрутки, то вместо ожидаемых смещений на ширину двух столбцов, происходит смещение только на один столбец. 2. Станьте в поле(значение 6129). Нажмите TAB. Что произошло со значением в поле, куда перешел фокус? Нажмите TAB снова. Опять фокусы. 3. Станьте в итоговое поле(значение 97). Кликните по стрелке гор.полосы прокрутки вправо. Посмотрите, что произошло с итогом по столбцу "Сумма". Сделайте еще пару кликов по стрелке. Итог по "Сумма" отображается некорректно. Я правильно понял, что ваша цель - создание горизонтальных и вертикальных(несмещаемых) итогов? Да, в примере я допустил несколько неточностей в поведении табличных полей. Результирующие поля должны быть заблокированы (спасибо за замечание). Двойное нажатие на полосе прокрутки я так понял не обрабатывается, но это не критично, потому что скрытых полей будет не много и их отображать будет легче дёргая полосу прокрутки или просто табом (стрелкой вправо-лево) стоя в таблице. Исправил поведение полей. Как будто сейчас всё работает отлично, но вот с полосой прокрутки (придание вида) так и не разобрался. Двигать полосу прокрутки скрытой подформы научился, а вот обратно, двигать синхронно форму нет (Если бы научиться отлавливать уход полей с фокусом из видимой области то было бы самое то) Да, основная задача создание горизонтальных и вертикальных итогов которые будут корректно смещатся (особенно по горизонтали). ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2017, 18:19 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
MrShinМой вопрос именно в том, как сгенерировать событие ..., в идеале еще от изменения размеров/положения колонок табличной формы. кстати, а этот вопрос можно решить и без SetWindowsHookEx. Собственно событие это - Form_MouseUp. На нем все и ловится. Проблемный момент в том, что ловится то оно ловится, но только в том случае, если клавиша мыши отпускается вверх в момент, когда курсор мыши находится в зоне заголовков столбцов. Если же переместить мышь в другую зону(выше или ниже заголовков) и отпустить, то событие не произойдет. Идею, как с этим справится мне подсказал Андрей Митин ... в 2002-ом :) Функции пересчета координат тоже его. Идея в том, что зона перемещения курсора ограничивается с помощью функции API ClipCursor. Т.е. пока нажата и не отпущена левая клавиша траектория перемещения курсора замыкается в том пространстве, где гарантированно произойдет нужное нам событие Form_MouseUp, т.е. в зоне заголовков столбцов. Я на очень скорую руку надергал фрагменты из старого примера для демонстрации. См.вложение. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 01:18 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
GVOV, вы выложили пример в mdb. У вас и рабочая база тоже в mdb? Под какую версию Access разрабатываете? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 02:10 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
Вакшуль СергейGVOV, вы выложили пример в mdb. У вас и рабочая база тоже в mdb? Под какую версию Access разрабатываете? Нет, рабочая программа в mde, упакованная в sfx архив. Это только пример в mdb для удобства. Разрабатываю под 2003 Access ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 02:45 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
В моём примере при вводе данных подсчёт суммы в колонку справа осуществляется нормально а вот сумми рование внизу срабатывает только при переходе на следующую запись. Можно ли реализовать суммирование не выходя из записи? Пытался сохранять запись после редактирования каждого поля но тогда курсор переходит постоянно на первое поле. Эта проблема решаема или обновление возможно только после выхода из записи? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 20:56 |
|
|
start [/forum/topic.php?all=1&fid=45&tid=1611897]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 161ms |
0 / 0 |