Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование форм, Излишняя реализация 
:(
    Опции темы
voodoo_alik
Дата 14.9.2007, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 13.4.2007

Репутация: нет
Всего: нет



Подскажи всезнающий All !!!

Есть форма А, на ней две кнопки Exit и Join, есть меню, а так-же комбобоксы, листбоксы и т.д....
Я создаю новую форму в проекте, назовём её форма "Б", затем наследуюсь от формы "А".

Вопрос, как исбавиться от излишней реализации, т.е. мне нужно оставить на форме "Б" только одну кнопку Exit и меню, а всё остальное убрать ?

Пердпологаю, что нужно в событие form_load уничтожать ненужные объекты.... Только как ? Dispose() ?

Спасибо...

Это сообщение отредактировал(а) voodoo_alik - 14.9.2007, 19:14
PM MAIL   Вверх
iad
Дата 14.9.2007, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 10.9.2007
Где: Москов

Репутация: нет
Всего: -2



Изврат имхо. Продумать иерархию классов проще чем потом в наследниках удалять возможности предков..
PM MAIL   Вверх
voodoo_alik
Дата 14.9.2007, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 13.4.2007

Репутация: нет
Всего: нет



Понимаю что изврат smile)))

Дело всё в том, что когда начинал писать проект, то необходимоть была только в двух формах, а сейчас появилась нужда ещё и в третей и в четвёртой... Если бы знал что так всё будет, то создал бы нормальную родительскую, а сейчас весь проект переделывать под это в лом...  легче наследоваться от стандартной form smile 

Попробовал так:

в конструкторе дочерней:

foreach (Control c in this.Controls)
{
  (if c.name != "Exit" && c.name != "MenuStrip")
  c.Dispose();
}

почему-то не сработало...
PM MAIL   Вверх
yar
Дата 14.9.2007, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 8.9.2007
Где: Одесса, Украина

Репутация: нет
Всего: 8



Хм )). Думаю, лучше внести изменения в иерархию, чем "бороться" с ней в дочерних классах.
Можно, например, создать новую родительскую форму, общую для всех, например BaseForm с кнопкой и меню.
Затем в той, которая сейчас является родительской изменить родителя на BaseForm, и добавить туда остальные контролы.
В итоге, для всех форм проекта не нужно будет менять родителя. А форму "Б" можно будет наследовать от BaseForm, и не беспокоиться об удалении ненужных контролов.

ps: 
всё-таки удалить контрол с формы можно с помощью Controls.Remove(control)

Это сообщение отредактировал(а) yar - 14.9.2007, 20:09
--------------------
Если бы строители возводили здания так, как программисты пишут программы, первый же дятел уничтожил бы мировую цивилизацию.Джеральд Вайнберг
PM MAIL WWW   Вверх
voodoo_alik
Дата 15.9.2007, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 13.4.2007

Репутация: нет
Всего: нет



2 ласт:
А там куча кода и в иерархию очень тяжело внести изменения (я не говорю что не возможно...). Хотелось бы научится удалять избыточные контролы на всякий случай... 8-P

И всё-же, может это и лишнее, но неплохо было-бы разобраться...

Интеренсно узнать, может кто из спецов подскажет, почему при таком коде,
в конструкторе формы:

froeach (Control c in this.Controls)
c.Dispose();

Удаляются не все контролы, которые пренадлежат форме, а только часть, остальные продолжают висеть на ней(форме) и получается что Dispose или foreach не работает для остальных...

Простите, может быть это ламерское (  8-P  ) наблюдение, но не совсем понятно почему так происходит, попробуйте сами сделать то же самое...

PM MAIL   Вверх
yar
Дата 15.9.2007, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 8.9.2007
Где: Одесса, Украина

Репутация: нет
Всего: 8



Цитата(voodoo_alik @  15.9.2007,  02:11 Найти цитируемый пост)
Удаляются не все контролы, которые пренадлежат форме, а только часть, остальные продолжают висеть на ней(форме) и получается что Dispose или foreach не работает для остальных...


Потому что коллекция модифицируется во время цикла по ней. 
--------------------
Если бы строители возводили здания так, как программисты пишут программы, первый же дятел уничтожил бы мировую цивилизацию.Джеральд Вайнберг
PM MAIL WWW   Вверх
voodoo_alik
Дата 15.9.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 13.4.2007

Репутация: нет
Всего: нет



Так и понял...
Вот решение 

Код

ArrayList al = new ArrayList();
            foreach (Control c in this.Controls)
                if (c.Name != "button4" && c.Name != "menuStrip1")
                    al.Add©;

            for (int i = 0; i < al.Count; i++)
                this.Controls.Remove((Control)al[i]);


Это сообщение отредактировал(а) voodoo_alik - 15.9.2007, 11:23
PM MAIL   Вверх
iad
Дата 15.9.2007, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 10.9.2007
Где: Москов

Репутация: нет
Всего: -2



Цитата(voodoo_alik @  15.9.2007,  12:23 Найти цитируемый пост)
Вот решение
 Работает и слава Богу.. Но по моему так делать нельзя. Мы удаляем контрол, который возможно где-то в дебрях кода предка може использоваться и в последствии могут возникнуть ненужные эффекты.. Я бы просто сделал ненужные контролы невидимыми - риска заполучить неприятности будет меньше..

PM MAIL   Вверх
ivashkanet
Дата 19.9.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



Цитата(iad @  15.9.2007,  20:36 Найти цитируемый пост)
Но по моему так делать нельзя.

Именно!

Зачем наследоваться от А? Почему бы не наследовать В от класса Form и положить на него кнопку и меню? 

А то что ты сделал противоречит ООП. Наследник НЕ должен ничего удалять из предка, только расширять его функциональность.
PM MAIL WWW ICQ   Вверх
Tauler
Дата 27.9.2007, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 29.6.2007

Репутация: нет
Всего: нет



Цитата(voodoo_alik @ 14.9.2007,  19:44)
Понимаю что изврат smile)))

Дело всё в том, что когда начинал писать проект, то необходимоть была только в двух формах, а сейчас появилась нужда ещё и в третей и в четвёртой... Если бы знал что так всё будет, то создал бы нормальную родительскую, а сейчас весь проект переделывать под это в лом...  легче наследоваться от стандартной form smile 

Попробовал так:

в конструкторе дочерней:

foreach (Control c in this.Controls)
{
  (if c.name != "Exit" && c.name != "MenuStrip")
  c.Dispose();
}

почему-то не сработало...

надо this.Remove ©

Добавлено через 1 минуту и 24 секунды
юлин, "с"  в копирайт превратил  smile
this.Remove (  c  );

Dispose - это для GС, а он когда хочет тогда и запускается
PM MAIL   Вверх
mr.DUDA
Дата 29.9.2007, 00:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Цитата(Tauler @  27.9.2007,  18:36 Найти цитируемый пост)
Dispose - это для GС, а он когда хочет тогда и запускается

а вот и нет, метод Dispose вызывается и отрабатывает непосредственно сразу же.


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0768 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.