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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как вызвать метод одного класса, из метода другого класса ? 
:(
    Опции темы
-ser-
Дата 15.2.2005, 05:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как правильно вызвать функцию(метод) одного класса/формы (Form1) из метода другого класса/формы (Form2). А именно, через Form1 я открыл Form2 а теперь по нажатию кнопки на Form2 я хочу что-то сделать в моей открытой Form1. Как установить ссылку обекта на instance другого обекта.
Код
//Form2
...
private Form1 myForm1;

public Form2(Form1 form)
{  
   InitializeComponent();
   myForm1 = form;
}

public Form2() // стандартный констр.
{  
   InitializeComponent();
}

private void button1_Click(object sender, System.EventArgs e)  
{
   myForm1.menuItem1_Click(sender, e);//Object reference not set to an instance of an object !!.
}
понятно ошибка потому, что конструктор с параметром здесь не задействован, но если я удаляю стандартный конструктор, тогда не знаю как правильно вызвать Form2 из Form1.




--------------------
"Тонкая, однако, работа." 
PM MAIL ICQ   Вверх
Domestic Cat
Дата 15.2.2005, 05:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Приведи код где ты делаешь и показываешь Form2.


--------------------

PM   Вверх
-ser-
Дата 15.2.2005, 05:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код
//Form1
Form2 pf;
private void menuItem3_Click(object sender, System.EventArgs e)
{
  pf = new Form2();
  //pf.Parent = panel2;
  //pf.Dock = System.Windows.Forms.DockStyle.Fill;
  pf.Show();    
}




--------------------
"Тонкая, однако, работа." 
PM MAIL ICQ   Вверх
Domestic Cat
Дата 15.2.2005, 05:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Дык вместо
Код

pf = new Form2();


пиши

Код

pf = new Form2(this);

если это происходит в Form1.


--------------------

PM   Вверх
-ser-
Дата 15.2.2005, 05:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



спасибо, то что надо.


--------------------
"Тонкая, однако, работа." 
PM MAIL ICQ   Вверх
RedButterfly
Дата 16.9.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Учусь
*


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

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



Поднимаю тему.

Вопрос тот же самый: как вызвать метода одного класса из другого?

оба класса типа Public (и из одного namespace - если это имеет значение...)

например

Код

public class first { 

// тут есть метод наприме Count

public int Count () {
// возвращает количество чего-то там
}

}

и второй класса

public class Second {
 тут есть метод 
public void Load 
{
вот тут перед загрузкой нужно сначала посчитать  вызвав метод Count из класса First не создавая экземпляр класса First
}
}


возможно ли это вообще ?
ведь они не являются предок-наследник...
помогите пожалуйста ... а то мозги скоро потекут из ушей... smile 
PM MAIL ICQ Skype   Вверх
informatik
Дата 16.9.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

не создавая экземпляр класса First


если только обявить этот метод как static
и он будет оступен как First.Count()
 но тогда если создать экземпляр класса, то у экземпляра этого метода небудет...

Может есть другое решение данной проблемы, что ты именно хочешь сделать?? Какую функциональность реализовать?
--------------------
namespace informatik
PM MAIL   Вверх
QryStaL
Дата 16.9.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


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

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



Цитата(RedButterfly @  16.9.2008,  14:12 Найти цитируемый пост)
вызвав метод Count из класса First не создавая экземпляр класса First

подробнее про это ограничение. Надо вызвать метод уже существующего объекта?

Цитата(informatik @  16.9.2008,  14:23 Найти цитируемый пост)
сли создать экземпляр класса, то у экземпляра этого метода небудет...

У экземпляра не будет, но достучаться к нему через экземпляр можно будет.


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
RedButterfly
Дата 16.9.2008, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Учусь
*


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

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



Цитата(informatik @ 16.9.2008,  16:23)
Цитата

не создавая экземпляр класса First


если только обявить этот метод как static
и он будет оступен как First.Count()
 но тогда если создать экземпляр класса, то у экземпляра этого метода небудет...

Может есть другое решение данной проблемы, что ты именно хочешь сделать?? Какую функциональность реализовать?

в классе First метод Count считает количество проектов в базе...

а в классе Second в методе Load мне нужно создать массив...коллекцию...в-общем список 
этих самых проектов...и перед тем как "Загрузить" проверить - загружался ли этот проект, 
и если загружался - то есть есть в списке загруженных , то не создавать его (не делать  *** +++  = new ***)  
а вернуть уже созданный проект....то есть уже созданный экземпляр класса Second

поэтому мне нужно количество проектов, то есть метод Count = для определения размера массива.... smile 


попутно вопрос

вернуть уже созданный проект....то есть уже созданный экземпляр класса Second

вот это вообще реализуемо?...что-то мне кажется, что нет....

задачу объясняет программист-дельфист....





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


Бывалый
*


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

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



Цитата

вернуть уже созданный проект....то есть уже созданный экземпляр класса Second


Дабы незагружать уже загруженные экземпляры есть такой способ....

Пусть бут некий слой данных который обеспечивает функциональность по работе с базой и созданию экземпляров нужных классов, дак вот при создании экземпляров класса помещать ссылки на них в какой нить массив (благо в NET 2.0 есть для этого все средства). Далее при обращении снова к этому слою данных за Проектом с определенным ID слой данных (тоже некий класс или совокупность классов) проверяет а был ли загружен уже данный экземпляр и возвращет его не обращаясь к базе...

Добавлено через 1 минуту и 23 секунды
Т.е. задача решается при правильном проектировании классов, именно на это я хотел обратить внимание..
--------------------
namespace informatik
PM MAIL   Вверх
RedButterfly
Дата 16.9.2008, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Учусь
*


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

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



Цитата(QryStaL @ 16.9.2008,  16:52)
Цитата(RedButterfly @  16.9.2008,  14:12 Найти цитируемый пост)
вызвав метод Count из класса First не создавая экземпляр класса First

подробнее про это ограничение. Надо вызвать метод уже существующего объекта?

Цитата(informatik @  16.9.2008,  14:23 Найти цитируемый пост)
сли создать экземпляр класса, то у экземпляра этого метода небудет...

У экземпляра не будет, но достучаться к нему через экземпляр можно будет.


Надо вызвать метод уже существующего объекта?

Ответ: нет

даже есть сделать так:

Код

метод Load {
 First fi = new First();
int s = fi.Count();
все-равно не получается :(
я то думала раз сделала new  - создала экземпляр класса  (как я понимаю) то можно что-угодно вызывать из этого класса....
}


оказывается нет.... smile

Добавлено через 5 минут и 47 секунд
Цитата(informatik @ 16.9.2008,  17:14)
Цитата

вернуть уже созданный проект....то есть уже созданный экземпляр класса Second


Дабы незагружать уже загруженные экземпляры есть такой способ....

Пусть бут некий слой данных который обеспечивает функциональность по работе с базой и созданию экземпляров нужных классов, дак вот при создании экземпляров класса помещать ссылки на них в какой нить массив (благо в NET 2.0 есть для этого все средства). Далее при обращении снова к этому слою данных за Проектом с определенным ID слой данных (тоже некий класс или совокупность классов) проверяет а был ли загружен уже данный экземпляр и возвращет его не обращаясь к базе...

Добавлено @ 15:15
Т.е. задача решается при правильном проектировании классов, именно на это я хотел обратить внимание..

Что под этим следует понимать:

слой данных

в первом и втором случае?

и вот это:

возвращет его не обращаясь к базе...


чтобы вернуть новый экземпляр класса, нужно сделать new First название_экземпляра

а чтобы вернуть существующий что нужно сделать?


там получается массив...эээ...классов чтоли...?

что-то я запуталась :(
PM MAIL ICQ Skype   Вверх
informatik
Дата 16.9.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

а чтобы вернуть существующий что нужно сделать?

Его нужно для начала гдето сохранить чтобы иметь к нему доступ...

Цитата

там получается массив...эээ...классов чтоли...?


Именно так.

Добавлено @ 15:44
Ведь чтобы вернуть уже созданный экземпляр его надо гдето хранить... а иначе если на него небудет ссылок он будет уничтожен сборщиком мусора...

Добавлено @ 15:47
Цитата

Что под этим следует понимать:

слой данных



Класс или совокупность классов содержащих функционал для доступа к данным..т.е. обращение к базе ну и можно сюда же припахать создание экземпляров классов на основе данных БД....

Добавлено через 8 минут и 3 секунды
Цитата


Код

метод Load {
 First fi = new First();
int s = fi.Count();
все-равно не получается :(
я то думала раз сделала new  - создала экземпляр класса  (как я понимаю) то можно что-угодно вызывать из этого класса....
}



т.е. как это неполучается.... что за бред... этот код просто идеален  smile

Добавлено через 9 минут и 10 секунд
Что ты подразумеваешь под 'неполучается' ??

Что происходит то?? Какая то ошибка??

Это сообщение отредактировал(а) informatik - 16.9.2008, 15:49
--------------------
namespace informatik
PM MAIL   Вверх
RedButterfly
Дата 17.9.2008, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Учусь
*


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

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



Цитата(informatik @ 16.9.2008,  17:43)
Что ты подразумеваешь под 'неполучается' ??

Что происходит то?? Какая то ошибка??

да смотрела смотрела и поняла....пардон, ещё раз пардон, 

но

вот тут

Код

метод Load {
 First fi = new First();

// функция Count лезет в другую функцию, чтобы создать строку для подключения к базе....вот поэтому и не выходит....

int s = fi.Count();
}


ошибка моя ясна. 
 ох чую я, что классы построены не совсем правильно...

уважаемые, есть какие-нибудь "пособия" по правильному построению классов?
а то ведь ненормально это когда вызываешь метод другого класса, который лезет в ещё один метод того же класса...
PM MAIL ICQ Skype   Вверх
informatik
Дата 17.9.2008, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

а то ведь ненормально это когда вызываешь метод другого класса, который лезет в ещё один метод того же класса...


Абсолютно обычная ситуация... smile 

Цитата

уважаемые, есть какие-нибудь "пособия" по правильному построению классов?


Набери в гугле ООП, или Принципы объектно-ориентированного программирования.. и т.д..

Можешь зати на INTUIT.ru там много курсов и по ООП и конкретно его применение в C#.
--------------------
namespace informatik
PM MAIL   Вверх
Mayk
Дата 17.9.2008, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



Цитата(RedButterfly @  16.9.2008,  19:26 Найти цитируемый пост)
 First fi = new First();
int s = fi.Count();
все-равно не получается :(
я то думала раз сделала new  - создала экземпляр класса  (как я понимаю) то можно что-угодно вызывать из этого класса....

надо либо
Код

First* fi = new First();
int s = fi->Count();
delete fi;

либо
Код

First fi;
int s = fi.Count();


второй вариант предпочтительнее

Это сообщение отредактировал(а) Mayk - 17.9.2008, 07:45


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




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


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

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