КАК вызвать метод главной формы из мембера ?
От: nik0lay Россия  
Дата: 09.01.09 10:03
Оценка:
есть такая картина маслом:

namespace MyNamespace
{
  public partial class Form1 : Form
  {
    private Class1 _member;
    public Form1()
    {
      InitializeComponent();  
    }
    public void Method()
    {
      // some actions
    }

  }
  
  public class Class1 
  {
    public void SomeMethod
    {
      Method(); // КАК ВЫЗВАТЬ ЭТОТ МЕТОД???
    } 
  }
}


мне нужен любой способ вызвать этот метод, пофиг на дизайн...
в с++ можно было в конструкторе передать указатель на парента и дергать у него все public, а здесь никак...((
Подскажите плиз!
Все имена функций и классов изменены, любое совпадение является случайным.
Re: КАК вызвать метод главной формы из мембера ?
От: vitz  
Дата: 09.01.09 10:17
Оценка:
Здравствуйте, nik0lay, Вы писали:

N>есть такая картина маслом:


N>
N>namespace MyNamespace
N>{
N>  public partial class Form1 : Form
N>  {
N>    private Class1 _member;
N>    public Form1()
N>    {
N>      InitializeComponent();  
        _member = new Class1(this);
N>    }
N>    public void Method()
N>    {
N>      // some actions
N>    }

N>  }
  
N>  public class Class1 
N>  {
      Form1 m_parent;
      public Class1(Form1 parent)
      {
        m_parent = parent
      }
N>    public void SomeMethod()
N>    {
N>      m_parent.Method(); // КАК ВЫЗВАТЬ ЭТОТ МЕТОД???
N>    } 
N>  }
N>}
N>


N>мне нужен любой способ вызвать этот метод, пофиг на дизайн...

N>в с++ можно было в конструкторе передать указатель на парента и дергать у него все public, а здесь никак...((
N>Подскажите плиз!
Еще как...
Re[2]: КАК вызвать метод главной формы из мембера ?
От: nik0lay Россия  
Дата: 09.01.09 10:23
Оценка:
Здравствуйте, vitz, Вы писали:

V>Еще как...


чё?
Все имена функций и классов изменены, любое совпадение является случайным.
Re: КАК вызвать метод главной формы из мембера ?
От: Аноним  
Дата: 09.01.09 10:27
Оценка:
Здравствуйте, nik0lay, Вы писали:

N>есть такая картина маслом:


N>
N>namespace MyNamespace
N>{
N>  public partial class Form1 : Form
N>  {
N>    private Class1 _member;
N>    public Form1()
N>    {
N>      InitializeComponent();  
N>    }
N>    public void Method()
N>    {
N>      // some actions
N>    }

N>  }
  
N>  public class Class1 
N>  {
N>    public void SomeMethod
N>    {
N>      Method(); // КАК ВЫЗВАТЬ ЭТОТ МЕТОД???
N>    } 
N>  }
N>}
N>


N>мне нужен любой способ вызвать этот метод, пофиг на дизайн...

N>в с++ можно было в конструкторе передать указатель на парента и дергать у него все public, а здесь никак...((
N>Подскажите плиз!

Mojna paprobovats tak


public void SomeMethod
{
string FulltypeName = Assembly.GetExecutingAssembly().GetName().Name.ToString() + ".Form1";

Type tp = Type.GetType(FulltypeName);

object ob = Activator.CreateInstance(tp,NULL);
Type[] param = new Type[0];

MethodInfo mth = tp.GetMethod("Method", param);
mth.Invoke(ob, param);

}
Re[3]: КАК вызвать метод главной формы из мембера ?
От: vitz  
Дата: 09.01.09 10:30
Оценка:
Здравствуйте, nik0lay, Вы писали:

N>чё?

в с++ можно было в конструкторе передать указатель на парента и дергать у него все public, а здесь никак...(
всмысле "Еще как можно!", ну и код подправил для наглядности
Re[4]: КАК вызвать метод главной формы из мембера ?
От: nik0lay Россия  
Дата: 09.01.09 10:36
Оценка:
Здравствуйте, vitz, Вы писали:

V>Здравствуйте, nik0lay, Вы писали:


N>>чё?

V>в с++ можно было в конструкторе передать указатель на парента и дергать у него все public, а здесь никак...(
V>всмысле "Еще как можно!", ну и код подправил для наглядности

хаха ))) спасибо!
действительно можно ...
мозги уже наружу после бессонной ночи
Все имена функций и классов изменены, любое совпадение является случайным.
Re[2]: КАК вызвать метод главной формы из мембера ?
От: nik0lay Россия  
Дата: 09.01.09 10:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Mojna paprobovats tak


А>public void SomeMethod

А>{
А>string FulltypeName = Assembly.GetExecutingAssembly().GetName().Name.ToString() + ".Form1";

А> Type tp = Type.GetType(FulltypeName);


А>object ob = Activator.CreateInstance(tp,NULL);

А>Type[] param = new Type[0];

А> MethodInfo mth = tp.GetMethod("Method", param);

А> mth.Invoke(ob, param);

А>}


имхо это какаято жесть))
но на будущее обязательно запомню)
спасибо!
Все имена функций и классов изменены, любое совпадение является случайным.
Re[5]: КАК вызвать метод главной формы из мембера ?
От: vitz  
Дата: 09.01.09 10:38
Оценка:
Здравствуйте, nik0lay, Вы писали:

N>хаха ))) спасибо!

N>действительно можно ...
N>мозги уже наружу после бессонной ночи
Угу, у самого: Новый год и все такое
Re[3]: КАК вызвать метод главной формы из мембера ?
От: Paata_PP  
Дата: 09.01.09 11:15
Оценка:
N>имхо это какаято жесть))
N>но на будущее обязательно запомню)
N>спасибо!

Ia naverna smisl vaprosa ne ponial
Abiasnite padrobna pajaliusta
Re: КАК вызвать метод главной формы из мембера ?
От: BAHEK  
Дата: 10.01.09 21:15
Оценка: -1
Да, ребята, плохо вы учебники шерстите. Ладно, расскажу теорию от и до... Существует два типа классов — это статические и обычные, ссылочные. Данный класс Form1 не статический, плюс еще содержит нестатический класс Class1. Для статичееских классов создавать экземпляр, чтоб добраться до полей и методов не нужно. А вот для обычных — это обязательно. Чтобы вызвать нужный тебе метод, тебе необходимо иметь ссылку на этот класс.
Если не понятно — объясняю подробнее:
Class1
{
int pole = 0;

Method1()
{
//тело метода
}
}

static void Main()
{
Class1 cl1 = new Class1(); \\ Создаем экземпляр класса Class1. Ссылку на класс сохраняем в cl1
cl1.Method1() \\ Вызов метода
}
Теперь по нашей ситуации.
Если открыть в VS файл Program.cs там вы можете увидеть как создается новый экземпляр класса Form1, но ссылка на него не сохраняется.
Application.Run(new Form1()); \\ в скобках оператором new создан экземпляр класса Form1 и этот экземпляр передается как параметр методу Run класса Aplication.
Это можно исправить!
static class Program
{
Form1 frm;
static void Main()
{
frm = new Form1();
Application.Run(frm);
}
}
Если немного пораскинуть мозгами, то станет ясно, что ссылка на экземпляр сохранена в классе Program и добраться до этой ссылки не составит труда просто набрав Program.frm! Это мой любимый способ, поскольку совершенно не жрет ресурсы во время выполнения. + можно получить ссылку из любого класса.

Расскажу про другой спосов. В этой теме он был. Это использовать методы отражения. Очеть интересный способ поскольку позволяет выполнить даже private методы в любой сборке. сначала получить сборку — GetExecutingAssembly(), затем все методы или поля, что требуются. А потом через эти же методы отражения вызвать нужный метод. Нудно и расстачительно в плане ресурсов(если метод вызывается много раз).
Re[2]: КАК вызвать метод главной формы из мембера ?
От: nik0lay Россия  
Дата: 10.01.09 21:44
Оценка:
Здравствуйте, BAHEK, Вы писали:

BAH>Да, ребята, плохо вы учебники шерстите. Ладно, расскажу теорию от и до...

Спасибо за одолжение.

BAH>Существует два типа классов — это статические и обычные, ссылочные. Данный класс Form1 не статический, плюс еще содержит нестатический класс Class1. Для статичееских классов создавать экземпляр, чтоб добраться до полей и методов не нужно. А вот для обычных — это обязательно. Чтобы вызвать нужный тебе метод, тебе необходимо иметь ссылку на этот класс.

Очень хорошо. Теперь Вам осталось разобраться, зачем они вообще нужны, эти статические и "обычные" классы, и можно смело идти сдавать зачет по ООП и информатике.

BAH>Если немного пораскинуть мозгами, то станет ясно, что ссылка на экземпляр сохранена в классе Program и добраться до этой ссылки не составит труда просто набрав Program.frm! Это мой любимый способ, поскольку совершенно не жрет ресурсы во время выполнения. + можно получить ссылку из любого класса.

Отличная идея! Надо сделать _всё_ доступным _отовсюду_, забить на иерахии и вложенности классов, и процесс программирования не будет таким утомительным и сложным.

BAH>Очеть интересный способ поскольку позволяет выполнить даже private методы в любой сборке.

Правильно! Тормоза и private-мемберы придумали трусы. Предлагаю вообще отменить и то и другое

BAH>Нудно и расстачительно в плане ресурсов(если метод вызывается много раз).

Похоже экономия ресурсов — единственное что Вас заботит.

Общий итог — учите матчасть, автор.
минус 500 от кармы
Все имена функций и классов изменены, любое совпадение является случайным.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.