![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| omankit |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 13.10.2008 Репутация: нет Всего: нет |
Что я уже накопал:
!!!!!!!!!!!!!!!!!!!!!!?????????????????? А теперь самое интересное если на форме добавить какой нибудь контейнер (tabconteiner,panel,tablelayout и т.п.) то ничего не работает этот код видит только данный контейнер и чтобы выловить контрол надо перебирать все его содержимое. а если контейнеры вложены друг в друга надо перебирать сначало один потом вложеный и т.д и т.п. Вопрос как это обойти! не хочется писать оброботчик в каждой форме ------------------------------------------------------------------------------------------------------------------------------------------------------------------ ИТОГОВЫЙ КОД ОТВЕТ!!!!!!!!!!!
Это сообщение отредактировал(а) omankit - 29.10.2008, 12:13 |
||||
|
|||||
| omankit |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 13.10.2008 Репутация: нет Всего: нет |
Очень жалко что ни кто не может ответить
|
|||
|
||||
| MasterOfCode |
|
|||
|
elwin ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 24.4.2008 Где: World.Russia.Tyum en Репутация: 4 Всего: 27 |
Windows должна по стандарту копировать текст на Ctrl + C
-------------------- ![]() |
|||
|
||||
| diadiavova |
|
||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
На самом деле вопрос не вполне ясен. Для начала неплохо было бы выяснить для чего нужно перебирать все открытые формы. Дело в том, что о событии KeyUp написано буквально следующее
Учитывая, что событие возникает не само по себе, а для конкретного объекта, то если вызван обработчик события, то и так ясно, что активна именно та форма для которой он сработал. Таким образом для начала надо урезать код хотябы до такого
Хотя, кто знает, возможно я чего-то не понял. Теперь к проблеме Замечание в данном случае довольно уместно, правда немного с другого боку. Обрати внимание на то, как копирование производит система. При нажатии Ctrl + C копируется не абы какой текст, а конкретно выделенный текст активного текстбокса. Ты, как я понимаю хочешь скопировать весь текст из текстбокса. Это можно, только надо определиться с какого именно. Что происходит у тебя в коде? перебираются контролы на заданной панели и если это текстбокс, его содержимое копируется в буфер. Проблема только в том сколько текстбоксов на этой панели. Если их больше одного, то принахождении первого его текст будет скопирован, но цикл при этом не остановится, далее будет найден следующий текстбокс, и его текст тоже будет скопирован(полагаю излишне объяснять, что текст, скопированный перед этим будет удалён) и конце концов в буфере останется только текст из последнего текстбокса. Так что сначала определись, что именно ты хочешь копировать. Хотя... возможно я чего-то не понял. Это сообщение отредактировал(а) diadiavova - 16.10.2008, 14:30 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
||||
|
|||||
| mihryak |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 19 Всего: 36 |
omankit, я был был раздосадован, если на ctrl-c в буфер бы скопировался не так старательно мною выделенный текст, а текст целиком, причём из какого-то левого текст-бокса
есть общеупотребительные приёмы работы, и когда некая программа на стандартные действия реагирует совсем нестандартно - это всегда плохо и раздражает не только меня одного |
|||
|
||||
| diadiavova |
|
||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Ну, коль скоро разъяснений по поводу того, что должен делать этот код не последовало прийдётся описывать задачу, исходя из того, что я понял.
Насколько я понял задача заключается в том, чтобы "лёгким движением руки" можно было скопировать текст изо всех текстбоксов и так же легко его вставить, к тому же, что бы он правильно распределился, да ещё и реализовать это всё в базовом классе и ктому же, чтобы всё работало одинаково хорошо для всех производных классов. Если это так - попытаюсь объяснить почему это невозможно в общем случае. Допустим ты производишь от данного класса ещё два к примеру A и B. В классе А три текстбокса, в классе В - два (или четыре - всё равно). Скопировали данные из экземпляра класса А и пытаемся вставить в экземпляр класса В. И что куда вставлять? Поэтому 1.Не нужно использовать буфер обмена. Вместо этого нужно реализовать такой механизм в котором обмен данными будет осуществляться только внутри одного класса. Если в системный буфер нужно заносить данные - делать это отдельно. 2.Часть работы прийдётся выполнять в каждом классе, но в базовом можно реализовать несколько инструментов, которые помогут сделать это быстро. Ещё момент. Вот это замечание не догма. В некоторых случаях переопределять системную логику нужно, но для этого нужны серьёзные основания и к тому же нужно учитывать все последствия. Так что если логика программы позволяет сохранить общепринятые правила - лучше так и поступить. Горячие клавиши являются способом быстрого вызова команд, но для каждой команды должен быть определён стандартный вызов, то есть какое-нибудь меню. Так вот: горячие клавиши лучше назначать для элементов меню для этого у класса System.Windows.Forms.ToolStripMenuItem есть свойство ShortcutKeys, которому можно присвоить значение прямо в дизайнере, вместо того, чтобы обрабатывать события клавиатуры. Вместо того, чтобы каждый раз обходить все контролы некоторого контейнера для сбора данных нужно создать коллекцию текстбоксов, с которых будет осуществляться чтение данных, а потом обходить эту коллекцию. Так же в базовой форме можно предусмотреть методы копирования и вставки данных. Я тут примерно набросал что можно сделать, код не проверял, но если нигде не ошибся - должен работать.
Метод FillTextBoxList следует вызвать создания списка текстбоксов. Сделать это можно в обработчике события Load базовой формы или в конструкторе производной формы, но после инициализации компонентов(последний вариант может создать небольшие проблемы в сучае если от той формы будет ещё что-то производится, хотя и это не страшно). Для копирования внутри класса лучше всего создать статическое поле. Вот примерный шаблон того, что можно сделать в производном классе.
Ну а что до способов вызова методов копирования и вставки - здесь всё ограничивается только твоей фантазией. Кроме того очень рекомендую при вставке предусмотреть возможность отмены вставки(Undo) хотябы на один ход. Для этого просто нужно создать ещё одно поле - строковый массив(не статический) и копировать в него данные перед вставкой. Потомучто если что-то случайно вставишь не туда - данные будут потеряны. ЗЫ Код не проверял, так что если будут глюки и сам не разберёшься - пиши. Это сообщение отредактировал(а) diadiavova - 19.10.2008, 22:33 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
||||
|
|||||
| omankit |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 13.10.2008 Репутация: нет Всего: нет |
Ну да форма то известна сразу. Проблема в основном в том что я не могу получить контрол активный. По значению activecontrol мне выдается контейнер!!! А что дальше то делать как контрол получить из которого послали KeyUp? Переберать все контейнеры ища активный контрол через EditingControl? Да и в коллекции контролов видно только контейнер! Приходится выбирать его брать сплитпанел2 например и перебирать коллекцию контролов этой панели! Самое плохое что эти контейнеры различаются от формы к форме!
|
|||
|
||||
| MasterOfCode |
|
|||
|
elwin ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 24.4.2008 Где: World.Russia.Tyum en Репутация: 4 Всего: 27 |
Почему бы не подписаться на событие KeyUp у textBox'a тогда не надо определять что за контрол и задача определение активности так же отпадет -------------------- ![]() |
|||
|
||||
| diadiavova |
|
||||||||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Ну здесь как раз всё просто. У обработчика события два параматра. Первый(sender) - как раз ссылка на объект инициировавший событие. Так что, если ты подписан на событие киап самого контрола - то и городушки городить не стоит. А для того, чтобы на него подписаться при обходе текстбоксов надо сделать примерно так
Я тут переделал функцию заполнения коллекции из предыдущего примера, но если тебе это не понадобится просто можешь не добавлять ткстбоксы в коллекцию а только определить обработчик события.
Метод FillTextBoxList обходит все контролы некоторого контейнера и вложенных в него контейнеров. В этом вся фишка. Ты просто передаёшь ей контейне как аргумент а она его обходит. Можно сделать что-то в таком роде
Можно при желании оформить всё в виде функции, которая будет выдавать линейный список контролов, но делать это в обработчике события не советую. Операция затратная и лишний раз её лучше не выполнять. Лучше всего обойти список по необходимости и всё что нужно добавить в коллекцию и потом пользоваться. Они может и различаются, но имеют общего предка. Я это учёл.
Ты хоть проверь работает или нет. Это такая штука, что независимо от того, сколько раз ты это делал - всегда лучше испытать код, а я этого не сделал. Это сообщение отредактировал(а) diadiavova - 20.10.2008, 11:59 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
||||||||||
|
|||||||||||
| diadiavova |
|
||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Я извиняюсь в этом коде допустил ошибку
Скопировал его с предыдущего примера, поменял имя метода, а внутри самого метода этого не сделал Я имел в виду это
Обход осуществляется рекурсивно, так что метод вызывает сам себя, и второго параметра у него естественно нет. Это сообщение отредактировал(а) diadiavova - 23.10.2008, 19:45 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
||||
|
|||||
| omankit |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 13.10.2008 Репутация: нет Всего: нет |
Хм а SplitterPanel не ловит а она в самом начале
--------------------------- Немного подумав вот что накатал:
diadiavova ОГРОМНОЕ СПАСИБО ЗА ИНТЕРЕСНЫЕ МЫСЛИ И ПОДСКАЗКИ!!!!!!!! Это сообщение отредактировал(а) omankit - 20.10.2008, 15:17 |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Я просто не посмотрел на иерархию, положился на память. SplitterPanel действительно не происходит от ContainerControl, вместо него в коде следует использовать System.Windows.Forms.ScrollableControl или вообще можно ограничиться Control, потомучто свойство Controls наследуетса именно от него. В таком виде всё будет ловиться.
Если ты назначаешь обработчик в коде, то инструкция Handles не нужна. Всё сделал не так как я писал. Если всё работает - это не значит, что код хороший. В таком виде как у тебя всё будет тормозить. Я ведь уже писал, что не следует обходить все контролы при копировании, потомучто рекурсия - дорогое удовольствие. Создай список и обходи его если нужно. Но лучше обрабатывать события самих текстбоксов. Обходишь рекурсивно форму один раз подписываешься не события нужных контролов, а после этого в обработчике идентифицируешь отправителя события по параметру sender. Сделаешь ещё несколько таких тормозных кодов - с прогой вообще невозможно будет работать. И ещё раз повторю, что обработка событий клавиатуры для создания шоткатов - плохая идея. Старайся максимально использовать стандартные приёмы. Хотя, если есть желание наступить на эти грабли самому - твоё дело. Это сообщение отредактировал(а) diadiavova - 23.10.2008, 19:44 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| omankit |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 13.10.2008 Репутация: нет Всего: нет |
а стандартно то как??? как стандартно сделать все это дело? и о каком списке речь? всмысле мне на каждом текстбоксе в каждой форме все делать? как обойти и подписаться?
Добавлено через 1 минуту и 30 секунд я не понимаю потому что не копирует в буфер по умолчанию да и мышью не выделяет |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Да я ведь несколько сообщений назад привёл пример. Там я как раз обхожу контролы, и если это текст бокс подписываюсь на ег событие(конструкция AddHandler - просмотри тему). Обработчик один для всех текстбоксов. Но в нём проводится обработка сендера(первого параметра).
Вот привожу цитату, клацни по изображению лупы в ней, чтобы прокрутить страницу в нужное место
ЗЫ Судя по всему произошло то о чём я написал. Начались тормоза и прочие непредсказуемые явления. Самое хреновое в этом всём, что поначалу таккие проблемы можно и не заметить, а потом всё равно скажутся. Добавлено через 7 минут и 54 секунды Не копирует потомучто надо обрабатывать событие того объекта, который тебя интересует()в твоём случае текстбокса. А ты обрабатываешь событие формы. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| omankit |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 13.10.2008 Репутация: нет Всего: нет |
Ну этот глюк с копированием (то что выделить мышью нельзя и буфер сам не работает) уже давно к сожалению не я писал приложение с начала даже не могу представить где это дело слетает. А на счет хендлера попробую в понедельник до меня смысл дошел я и не знал что так можно спасибки.
|
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |