| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > [C#] В одном классе вызвать метод другого |
| Автор: Rockie 20.9.2007, 17:54 | ||||||
| Здравствуйте! Как вызвать в одном классе нестатический метод другого класса? Вот пример.
Сразу скажу что http://forum.vingrad.ru/forum/topic-52713.html#st_60_view_0 смотрел. При объявлении метода MethodFromForm1 с модификатором const я во-первых ловлю кучу ошибок в этих функциях
А во-вторых я не хочу открывать их полностью. Также нашел такой вариант как
Вродже бы выход из положения, но у меня на даном этапе не работает Ну и в конце концов я http://www.gotdotnet.ru/Forums/Web/435549.aspx вычитал , что можно при инициализации myTextBox передать ему ссылку на Form1. Вот скажите пожалуйста как это сделать. Либо если у вас есть - какие-то еще способы. |
| Автор: yar 20.9.2007, 18:25 | ||
В этом конкретном случае можно воспользоваться свойсвом контрола TopLevelControl, таким образом получив ссылку на форму.
|
| Автор: Experimenter 20.9.2007, 18:39 | ||
не прокатывает так? |
| Автор: matkir 20.9.2007, 18:54 | ||||
вот как можно сделать:
основное окно
|
| Автор: Experimenter 20.9.2007, 19:08 |
| matkir жжот, про свойства-то забыли? так красивее выглядит... |
| Автор: tol05 21.9.2007, 23:01 | ||||||||
yar, нет нельзя. Если контрол будет не на форме, а на панели или в другом контейнере, что ты получишь?
статики - это зло....
Да можно. ИМХО - достаточно эффективный и простой способ. Alek86, привел пример передачи ссылки на форму при создании контрола.
Я могу сказать, для чего это мне может быть нужно Если у меня будет 100 контролов, который из которых должен реагировать на 10-20 событий формы, то я НИКОГДА не буду привязывать обработчики контрола к событиям формы руками Контрол имеет свое постоянное поведение, зависящее от состояния и поведения формы. Все это реализуется через закрытый интерфейс контрола, именно таким способом. |
| Автор: yar 21.9.2007, 23:10 | ||||
Получу ссылку на форму:
|
| Автор: tol05 22.9.2007, 12:48 |
| да, признаю, что когда писал, не перечитал мануал по этому свойству. Похоже вернется именно форма... Но все равно не стал бы использовать TopLevelControl. И не только из-за духа противоречия (хотя и он присутствует Любая конкретика ИМХО всегда вредна. Это враг дальнейшего сопровождения, масштабируемости, версионирования... Пример: взаимодействие дочерних форм MDI-приложения с контролами главной формы... Как при использовании TopLevelControl контрол сможет получить ссылку на форму, его НЕ СОДЕРЖАЩУЮ? "Похоже вернется именно форма..." Но какая? |
| Автор: yar 22.9.2007, 13:40 |
| tol05, Так или иначе, для того, чтобы выбрать лучший вариант, необходимо иметь хотя бы несколько альтернатив А ещё есть Control.FindForm(), он работает правильно и в MDI-интерфейсе, возвращая ссылку не на MDI-контейнер, как TopLevelControl, а непосредственно на форму, на которой содержится наш контрол. Так что, кажется мне, передача контролу в конструкторе ссылки на содержащую его форму является избыточной. Поэтому, что использовать, зависит от того, ссылку на какую форму мы хотим получить |
| Автор: Alek86 22.9.2007, 13:53 | ||||||
ну, иногда это зло необходимое. к примеру Format у String (так, кажется). больше ведь никуда не приткнешь.
я в шарпе не очень опытен, можно поподробнее? не лучше бы было подписаться на события в таком случае? как раз из-за того, что:
|
| Автор: tol05 22.9.2007, 21:50 | ||||||
неудачный пример. При каждой манипуляции со строкой создается новая строка, это всем известно. Как же можно вызывать экземплярный метод у объекта, который уже при выполнении этого метода должен стать мусором? Т.е. сам себя сделать мусором. Вот поэтому и статические методы....
Ты не понял. Я имел в виду следующее: при разработке контрола необходимо определить его поведение и состояние. При определении поведения разрабатывается как открытый интерфейс, так и закрытый. Часть поведенческих функций зависит от конкретной ситуации при использовании контрола. Это выносится в открытый интерфейс и клиент, использующий контрол в своем ПО, сам настраивает поведение контрола (через инициализацию свойств, привязку обработчиков к событиям и т.д.) Но есть определенная часть поведения контрола, определенная один раз и навсегда разработчиком самого контрола (например, фокус на кнопке прорисовывается пунктиром, в текстбоксе - поле ввода меняет цвет, в форме - подсвечивается заголовок...) Вот это поведение тоже надо программировать и программировать в закрытом интерфейсе контрола. Но текстбокс, к примеру, должен знать когда ему поменять цвет поля ввода, а кнопка должна знать. когда ей нарисовать на себе пунктир. Т.е. контрол должен подписаться на внешнее событие (сообщение, это неважно), и быть готовым его принять и обработать. Но как это сделать? Я когда-то писал в лог (надо было Заканчиваю. Поэтому я и говорил, что передавая ссылку на форму в контрол мы обеспечиваем контрол всем необходимым и он может сам, внутри себя подписаться на все, что ему нужно. Этим мы убиваем двух зайцев: 1. избавляем программиста от ошибок, когда он в 20 контролах подписался на какое-то событие формы, а в 21 - забыл, или не на то подписался. К тому же, программисту меньше кода писать (это любят называть повторно-используемый код). 2. Обеспечиваем масштабируемость приложения, когда разработчик разработал новую версию контрола, положил его в dll и рассылает патч к своему старому приложению, или плагин. При этом НЕ НУЖНО перекомпилировать все приложение у клиентов всего мира, из-за того, что в новой версии контрол должен еще на пару событий подписаться... Старый контрол получал ссылку на форму и новый получает, а что они с этой ссылкой делают - это их внутреннее дело, не влияющее на работу формы и старого кода. Вот такое мое личное мнение А по поводу конкретики - развиваю мысль о MDI. Создано 10 дочерних форм, они все - одного класса. Контрол один и находится на родительской форме. Это label. Мне нужно сделать, чтобы при создании дочерней формы label отображал надпись с информацией о форме. Я не хочу, чтобы клиент разрабатывал этот код и писал что ему вздумывается, я сам напишу, только дай мне ссылку на создаваемую форму. Как я ее получу через TopLevelControl? или черезControl.FindForm()? Все, закончил, извините за длинный пост. |
| Автор: yar 22.9.2007, 22:37 | ||
| tol05, Хороший пост, спасибо
Но я говорил лишь о том, что если нам нужно получить ссылку именно на родительскую форму для данного контрола, то для этого уже предусмотрен механизм в виде FindForm(), и не нужно делать это самостоятельно. Если же нам нужна ссылка на какую-либо другую форму, как в этом примере, конечно, удобнее всего передавать её нашему label при создании. |
| Автор: Rockie 23.9.2007, 00:15 |
| У меня на форме группа контролов, приемущественно текстбоксы. Мне нужно вместо стандартного paste выполнять ряд своих дествий, причем при вставке в один из текстобксов он взаимодействует с другими, поэтому я отнаследовал свой класс текстбокса с чуть измененным функционалом и мне нужно было достучаться до других на форме. Впринцыпе первый предложенный вариант с TopLevelControl меня уже спас, но рассмотрю и все остальные варианты. Большое спасибо всем за информативные ответы! =) |