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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача делегатом данных, для функции, которая выполняется 
:(
    Опции темы
lankin
Дата 20.8.2008, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В общем суть в следующем:
есть некая форма с кнопкой и в ней функция:

Код

public class first
{
    public void someFunction(string s)
    {
        //что то делаем
    }
}


по нажатию той кнопки выскакивает окно с textBox - это обычный поисковик. В нем мы вносим какую-то фразу, заводим делегата и вызываем метод основной формы someFunction, передавая ему введенные данные.

Код

public class Search
{
    delegate searchdelegate(string s)      //-------объявляем делегат
    public btnOK_Click(object s, Events args)  //-------по нажатию ОК
    {
        first f = new first();                      //-------объявляем экземпляр класса first
        searchdelegate dlg = new searchdelegate(f.someFunction);   //-------через делегат вызываем отработку нашей функции
        //закрываем нафиг поисковик
    }
}


вопрос - как мне передать в ту функцию введеную нами вручную строку в поисковике???
PM MAIL   Вверх
lankin
Дата 20.8.2008, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Или может можно так сделать?

Код

public class first
{
    public void someFunction(string s)
    {
        Search srch = new Search();                      //----объявляем экземпляр того класса
        string s = srch.Controls["textBox1"].Text;  //----просто вытаскиваем из поисковика строку нам нужную
        //что то делаем
    }
}

public class Search
{
    delegate searchdelegate                           //-------объявляем делегат
    public btnOK_Click(object s, Events args)  //-------по нажатию ОК
    {
        first f = new first();                                 //-------объявляем экземпляр класса first
        searchdelegate dlg = new searchdelegate(f.someFunction);   //-------через делегат вызываем отработку нашей функции
        //закрываем нафиг поисковик
    }
}


Или может есть вообще другой метод попроще???

Это сообщение отредактировал(а) lankin - 20.8.2008, 16:31
PM MAIL   Вверх
mihryak
Дата 20.8.2008, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



если эти классы - действительно формы, то оба решения плохи
зачем для каких-то вычислений создавать форму? форму показывать надо, она по большому счёту и считать-то ничего считать не должна уметь

Добавлено через 10 минут и 6 секунд
а вообще твоя задача подходит под паттерн "стратегия"
упрощённо он выглядит так:
Код

        public interface ISearchPerformer
        {
            void Search(string value);
        }

        public class Performer : ISearchPerformer
        {
            #region ISearchPerformer Members

            public void Search(string value)
            {
                // some actions here
            }

            #endregion
        }

        public class Context
        {
            private readonly ISearchPerformer searchPerformer;
            private string searchString;

            public Context(ISearchPerformer searchPerformer)
            {
                this.searchPerformer = searchPerformer;
            }

            public string SearchString
            {
                get { return searchString; }
                set { searchString = value; }
            }

            public void Search()
            {
                searchPerformer.Search(SearchString);
            }
        }

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


Шустрый
*


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

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



lankin 
Код

public class Search
{
    delegate searchdelegate(string s)      //-------объявляем делегат
    public btnOK_Click(object s, Events args)  //-------по нажатию ОК
    {
        first f = new first();                      //-------объявляем экземпляр класса first
        searchdelegate dlg = new searchdelegate(f.someFunction);   //-------через делегат вызываем отработку нашей функции
        dlg.Invoke("Example"); 
        //закрываем нафиг поисковик
    }
}


строкой 
Код

searchdelegate dlg = new searchdelegate(f.someFunction);
 
ты только создал указатель на метод
Чтоб выполнить синхронно необходимо 
Код

dlg.Invoke("Example");
 или асинхронный вызов 
Код

dlg.BeginInvoke("Example", null, null);
 (2 нала если тебе не интересно поведение после выполнения f.someFunction) 

Сори если не совсем чисто объяснил
PM MAIL WWW Skype   Вверх
mihryak
Дата 20.8.2008, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mullih @  20.8.2008,  22:10 Найти цитируемый пост)
Чтоб выполнить синхронно необходимо 
1:    
Код
dlg.Invoke("Example");

тогда уж проще
Код

dlg("Example");

 smile 


Это сообщение отредактировал(а) mihryak - 20.8.2008, 22:00
PM MAIL ICQ   Вверх
lankin
Дата 21.8.2008, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



О! То, что нужно. Спасибо большое smile

Добавлено через 2 минуты и 37 секунд
Кстати. В чем принципиальная разница между синхронным и асинхронным методами?
PM MAIL   Вверх
Partizan
Дата 21.8.2008, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


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

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



lankin,

Это сообщение отредактировал(а) Partizan - 21.8.2008, 10:29

Присоединённый файл ( Кол-во скачиваний: 108 )
Присоединённый файл  2.JPG 755,49 Kb


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
lankin
Дата 21.8.2008, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо
PM MAIL   Вверх
lankin
Дата 21.8.2008, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Еще такой вопрос:

я в класе Search создал свойство GetSearchString

Код


public class Search
{
    delegate searchdelegate(string s)      //-------объявляем делегат
    string result=string.Empty;
    public btnOK_Click(object s, Events args)  //-------по нажатию ОК
    {
        result = textBox1.Text;
        first f = new first();                      //-------объявляем экземпляр класса first
        searchdelegate dlg = new searchdelegate(f.someFunction);   //-------через делегат вызываем отработку нашей функции
        dlg.Invoke(); 
        //закрываем нафиг поисковик
    }
//---вот это свойство
    public string GetSearchString
    {
       get 
            {               
                return result;
            }
    }
}



Затем в првом классе такую строчку добавил
Код


public class first
{
    public void someFunction(string s)
    {
        Search srch = new Search();                      //----объявляем экземпляр того класса
        //string s = srch.Controls["textBox1"].Text;  //----просто вытаскиваем из поисковика строку нам нужную        
        string ss = srch.GetSearchString;
        //что то делаем
    }
}


В итоге что происходит - я вызываю делегатом из класса search метод someFunction() класса First. Далее в этом методе создается объект класса Search и через его свойство узнаем то, что ввели руками при поиске(то, что есть в textBox1).
Так вот при обращении к свойству возвращается пустая строка, хотя в textBox1 что-то введено. Почему??? Для нового объекта класса будет будто новая форма создаваться чтоли и тextBox1 там не будет заполнен?

Это сообщение отредактировал(а) lankin - 21.8.2008, 16:57
PM MAIL   Вверх
mullih
Дата 21.8.2008, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

public class first
{
    public void someFunction(string s)
    {
        Search srch = new Search();                      //----объявляем экземпляр того класса
        //string s = srch.Controls["textBox1"].Text;  //----просто вытаскиваем из поисковика строку нам нужную        
        string ss = srch.GetSearchString;
        //что то делаем
    }
}


ты создал новый объект и соответсвенно поле result=string.Empty;

Передай в параметр текущий объект, либо сделай свойство статическое либо примени фабричный метод для Search либо что еще в зависимости от твоих потребностей (как я понимаю просто строки в someFunction ты кидать не хошь)

Код

public class Search
{
    delegate searchdelegate(Search sch)      //-------объявляем делегат
    string result=string.Empty;
    public btnOK_Click(object s, Events args)  //-------по нажатию ОК
    {
        result = textBox1.Text;
        first f = new first();                      //-------объявляем экземпляр класса first
        searchdelegate dlg = new searchdelegate(f.someFunction);   //-------через делегат вызываем отработку нашей функции
        dlg.Invoke(this); 
        //закрываем нафиг поисковик
    }
//---вот это свойство
    public string GetSearchString
    {
       get 
            {               
                return result;
            }
    }
}

public class first
{
    public void someFunction(Search srch)
    {
        //Search srch = new Search();                      //----объявляем экземпляр того класса
        //string s = srch.Controls["textBox1"].Text;  //----просто вытаскиваем из поисковика строку нам нужную        
        string ss = srch.GetSearchString;  //твоя строка
        //что то делаем
    }
}


Код

public class Search
{
    delegate searchdelegate(string s)      //-------объявляем делегат
    string static result=string.Empty;
    public btnOK_Click(object s, Events args)  //-------по нажатию ОК
    {
        result = textBox1.Text;
        first f = new first();                      //-------объявляем экземпляр класса first
        searchdelegate dlg = new searchdelegate(f.someFunction);   //-------через делегат вызываем отработку нашей функции
        dlg.Invoke(this); 
        //закрываем нафиг поисковик
    }
//---вот это свойство
    public static string GetSearchString
    {
       get 
            {               
                return result;
            }
    }
}

public class first
{
    public void someFunction(string s)
    {
        //Search srch = new Search();                      //----объявляем экземпляр того класса
        //string s = srch.Controls["textBox1"].Text;  //----просто вытаскиваем из поисковика строку нам нужную        
        string ss = Search.GetSearchString;  //твоя строка
        //что то делаем
    }
}


Код

public class Search
{
    private Search(){} 

        private static Search instance;
        public static Search Instance
        {
            get
            {
                if (instance == null)
                    instance = new TenantsControl();
                return instance;
            }
        }

    delegate searchdelegate(string s)      //-------объявляем делегат
    string result=string.Empty;
    public btnOK_Click(object s, Events args)  //-------по нажатию ОК
    {
        result = textBox1.Text;
        first f = new first();                      //-------объявляем экземпляр класса first
        searchdelegate dlg = new searchdelegate(f.someFunction);   //-------через делегат вызываем отработку нашей функции
        dlg.Invoke(); 
        //закрываем нафиг поисковик
    }
//---вот это свойство
    public string GetSearchString
    {
       get 
            {               
                return result;
            }
    }
}
public class first
{
    public void someFunction(string s)
    {
        //Search srch = new Search();                      //----объявляем экземпляр того класса
        //string s = srch.Controls["textBox1"].Text;  //----просто вытаскиваем из поисковика строку нам нужную        
        string ss = Search.Instance.GetSearchString;
        //что то делаем
    }
}

PM MAIL WWW Skype   Вверх
lankin
Дата 22.8.2008, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mullih, спасибо за подробное и наглядное объяснение smile 

А можно пояснение одно? В частности, что означает this в этой строке:

Код

dlg.Invoke(this); 


Что туда передается?

PM MAIL   Вверх
lankin
Дата 22.8.2008, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Еще вопрос: если мы заводим в классе Search экземпляр класса First, то значит и у него будут только исходные значения?
PM MAIL   Вверх
lankin
Дата 22.8.2008, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В общем я сделал все иначе:

Код

public class first
{
    private void btnSearch_Click(object sender, EventArgs e) //--вызываем поисковик (класс Search)
    {
        SearchObject find = new SearchObject(grid1);  //---объявляем экземпляр класса Search(поисковика) и, поскольку
                                                    //мы будем искать по элементу grid - его и передаем.
        find.ShowDialog(Background.FindForm());     //---вызываем диалоговое окно поисковика.
    }    
}
public class  Search
{
    //---объявляем переменные
    private GridControl searchGrid = new GridControl();              
    public delegate void Mydelegate(GridControl searchGrid);
    private string result = string.Empty;
    //---конструктор
    public SearchObject(GridControl tempGrid)
    {
        InitializeComponent();
        searchGrid = tempGrid;
    }
    //---на форме поисковика есть textBox, в который мы чтонить вписываем и есть кнопка "искать"
    public void btnSearch_Click(object sender, EventArgs e)
    {
        result=textBox.Text;                                 //---снимаем что мы там написали
        Mydelegate dlgt = new Mydelegate(searchInGrid);  //----объявляем делегата
        this.searchGrid.BeginInvoke(dlgt, searchGrid);       //-----выполняем здесь же, передавая в функцию в качестве параметра текущий
                                                               //объект класса First                              
    }
    private void searchInGrid(GridControl searchGrid)
    {
        //---ну и тут собссно поиск по гриду
    }
}


работает. получается, что делегатом вызывается не функция родительского класса, а текущего класса, просто из родительского мы передали текущий объект(Grid).
Так может и нафиг делегат не нужен?

Это сообщение отредактировал(а) lankin - 22.8.2008, 15:10
PM MAIL   Вверх
mullih
Дата 22.8.2008, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



this это указатель на объект текущего класса.

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

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


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

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


 




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


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

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