Сабклассинг Excel

Программирование на Visual Basic for Applications
alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сабклассинг Excel

Сообщение alibek » 13.10.2004 (Ср) 14:15

Никто не занимался?
Тут одному товарищу требовалось запретить любой ввод в лист Excel.
Я вот на досуге попробовал вариант с сабклассингом, это просто кошмар какой-то :)
Отслеживать Application.hWnd вообще не имеет смысла. В конечном итоге я добрался до Application\XLDESK\EXCEL7, насколько я понял, это и есть рабочая область (или грид).
Хук на него ставится, сообщения ловятся, но через несколько секунд зависает намертво. И кстати, хук ставится, но при попытке его снять Excel слетает (может Excel потом самостоятельно подменяет оконную процедуру?).
Вообщем пытал я его какое-то время, но так и не удалось заставить игнорировать определенные WM_KEYDOWN/WM_KEYUP.
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.10.2004 (Ср) 14:21

А почему не имеет смысла отслеживать? А Spy++ что говорит?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.10.2004 (Ср) 14:32

Так потому и не имеет смысл, туда ничего не попадает. У меня почему-то такие подозрения, что рабочая область Excel является самостоятельным окном, которое просто позиционируется синхронно с окном приложения.
Lasciate ogni speranza, voi ch'entrate.

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 13.10.2004 (Ср) 15:12

А просто поставить защиту на лист, на каждую ячейку, отлавливать события изменения позиции курсора на листе и возвращать изменённые значения :oops:

При защите можно выставить, что не будут просматриваться формулы в ячейках, только результат, соответственно и редактировать нечего!
Легко обходится:
Ctrl+A, Ctrl+C, Ctrl+N, Ctrl+V.
и все

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.10.2004 (Ср) 15:13

Так предлагал :)
Человеку не нравится, что выскакивает сообщения "Ячейка защищена от записи".
Насчет способа реализации я согласен, сабклассинг очень неудачен. Но вопрос теперь не в реализации, а в самом сабклассинге - почему не получается?
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.10.2004 (Ср) 15:15

Я вообще предлагал оригинальный лист со значениями сделать скрытым, а показывать копию, в которой при каждом изменении происходит Cells()=ShSource.Cells() -- не устроило, т.к. хотя данные и восстанавливаются, но надо вообще закрыть возможность редактирования.
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.10.2004 (Ср) 15:46

А!
Да просто потому что это MDI, вот и всё :)
Нуно сабклассить child...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.10.2004 (Ср) 16:03

А!!! Блин!!! :)
Меня оправдывает только то, что я всегда документы в Excel разворачиваю на весь экран. Забыл, что это MDI-форма :)
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.10.2004 (Ср) 17:08

Именно это я про тебя и подумал. Сам такой :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

LeoCh
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 22.09.2004 (Ср) 8:52

Сообщение LeoCh » 18.10.2004 (Пн) 13:25

Делал подобное с Word. Просто при старте Word запускал невидимую форму, на нее Hook. По событию DETSROY - Uhook. Есть даже вариант для 97.

Lider
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 02.06.2004 (Ср) 15:44
Откуда: Москва

Сообщение Lider » 29.10.2004 (Пт) 13:52

Блин, ПАРНИ! Вы тут крутые вещи крутите! Я в восторге! Только ни фига не понял!

Плиз! поподробнее насчет Hook В EXCELe ! :shock:
Есть 10 тпов людей:
Одни понимают двоичную систему исчисления,
Другие нет!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.10.2004 (Пт) 16:27

Lider, сигнатура классная :)
API-Guide есть? Если нет, скачай. И в нем смотри любой пример к SetWindowLong.
Lasciate ogni speranza, voi ch'entrate.

Lider
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 02.06.2004 (Ср) 15:44
Откуда: Москва

Сообщение Lider » 01.11.2004 (Пн) 9:35

Не понял!
Что из VBA можно обращаться к функциям API?
Или это делается через VB а не через VBA?
Есть 10 тпов людей:
Одни понимают двоичную систему исчисления,
Другие нет!

Lider
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 02.06.2004 (Ср) 15:44
Откуда: Москва

Сообщение Lider » 01.11.2004 (Пн) 9:36

И что такое API-Guide?
Есть 10 тпов людей:
Одни понимают двоичную систему исчисления,
Другие нет!

Lider
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 02.06.2004 (Ср) 15:44
Откуда: Москва

Сообщение Lider » 01.11.2004 (Пн) 9:39

Да, и насколько я знаю SetWindowLong устанавливает стиль окна !
(знаю по C++)
Дайте пожалуйста хоть какие - нибудь подробности , чтобы хоть что-то прояснилось, a дальше попробую разобраться ! :?
Есть 10 тпов людей:
Одни понимают двоичную систему исчисления,
Другие нет!

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 01.11.2004 (Пн) 9:39

http://www.mentalis.org/agnet/apiguide.shtml

Справочник по Api-функциям. Очень рекомендую.

Lider
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 02.06.2004 (Ср) 15:44
Откуда: Москва

Сообщение Lider » 01.11.2004 (Пн) 10:16

To Armed!
Я же спросил, как использовать API в VBA !!!!
А с самими функциями API я разобраться смогу!
Они же везде одинаковые и в VB и в C++ и в Delphi !!!
Как их использовать в VBA-Excel Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!
Есть 10 тпов людей:
Одни понимают двоичную систему исчисления,
Другие нет!

Lider
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 02.06.2004 (Ср) 15:44
Откуда: Москва

Сообщение Lider » 01.11.2004 (Пн) 10:44

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
SetCursorPos 20, 20


End Sub

Это не работает ...
Значит просто так в VBA API использовать нельзя !
А как?
Есть 10 тпов людей:
Одни понимают двоичную систему исчисления,
Другие нет!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.11.2004 (Пн) 11:39

Прежде чем использовать API-функции, их надо объявить. Примеры объявлений в API-Viewer или API-Guide.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 33

    TopList