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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [С#.NET] Дуступ к контролам формы из своего класса, Не могу получить доступ 
:(
    Опции темы
DDK
Дата 17.4.2008, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть форма (стандартно Form1) и свой класс (MyClass1, допустим). На форме есть листбокс, в классе формы создал функцию добавления записи в лог:
Код

public static void WriteToLog(string err)
{
      string datenow = DateTime.Now.ToString();
      LogBox.Items.Add("[" + datenow + "] " + err);
}


Пробелма в том, что при обращении к этой функции из другого класса (моего MyClass1) путём 
Код

Form1.WriteToLog()
, предварительно подключив в этом классе 
Код

using WindowsApplication1

то возникает ошибка: Error    An object reference is required for the nonstatic field, method, or property 'WindowsApplication1.Form1.LogBox'    <...>\Form1.cs    

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

PM MAIL   Вверх
Voyager
Дата 17.4.2008, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно применить Singleton smile
Убери static из метода, сделай глобальную переменную static типа Form1 frm, проинициализируй ее, тогда и сможешь писать через frm.WriteToLog().
PM   Вверх
jonie
Дата 18.4.2008, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



... но это не совсем нормальный и правильный метод (в случае например формы - много ресурсов имхо слишком требует)
просто передавай своему классу ссылку на объект класса Form1
Код

class Form1:Form
{
   Form1()
  { 
    MyClass c = new MyClass(this);
    c.foo();
  }
}
...
class MyClass{
  Form1 parentFrm;
  public foo()
  {
   parentFrm.ListBox1.блаблабла 
  }
  public MyClass(Form1 frm)
  {
     parentFrm = frm;
  }
}


Это сообщение отредактировал(а) jonie - 18.4.2008, 00:06


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
DDK
Дата 18.4.2008, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



jonie
Спасибо! Сначала долго не получалось, пока не дошёл умом, что передача указателя this при вызове моего класса - весьма необходимая процедура, ибо без этого указатель не будет определён smile Всё работает!
PM MAIL   Вверх
source777
Дата 18.4.2008, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

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



Цитата(jonie @  18.4.2008,  00:05 Найти цитируемый пост)
просто передавай своему классу ссылку на объект класса Form1
это  просто абсолютно smile 
К чему такая связность? Гораздо логичнее, удобнее и правильнее выделить функциональность логгера в отдельный static класс, а по мере надобности можно делать с этим инкапсулированным логом всё что угодно: записывать в файл, отображать в к-н компоненте на форме, посылать по e-mail, etc. 



Цитата(DDK @  18.4.2008,  00:59 Найти цитируемый пост)
Сначала долго не получалось, пока не дошёл умом, что передача указателя this при вызове моего класса - весьма необходимая процедура
Лучше забудь про эту "необходимую" процедуру, ибо она разве что в качестве примера плохого дизайна может использоваться...



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
source777
Дата 18.4.2008, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

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



Чтобы не быть голословным я тут по-быстрому накидал каркас того, что нужно:
Код

// Logger.cs
using System;
using System.Text;

namespace Logger
{
    delegate void OnStringAdding(string s);

    enum MsgLevel
    {
       Notice, Warning, Error      
    }

    static class Logger
    {
        private static StringBuilder log = new StringBuilder(4096);
        private static OnStringAdding Callback = null;
        public static void SetCallback(OnStringAdding callback)
        {
            Callback = callback;
        }
        public static void Add(string msg, MsgLevel level)
        {
            string new_line = level.ToString()+": "+msg;
            log.AppendLine(new_line);
            if (Callback != null) Callback.Invoke(new_line);
        }
    }
}


Ну и пример использования:
Код

// Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace Logger
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void AddLogMsgIntoListBox(string msg)
        {
            listBox1.Items.Add(msg);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Logger.Add("button1.Click", MsgLevel.Notice);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Logger.SetCallback(AddLogMsgIntoListBox);
            Logger.Add("Form1.Load", MsgLevel.Notice);
        }
    }
}



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
jonie
Дата 18.4.2008, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



а лучше взять log4net и посмотреть как стоит сделать, чем городить велосипеды.
я говорил не про логер.. да и в принципе речь не только про логер была)



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
source777
Дата 18.4.2008, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

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



Цитата(jonie @  18.4.2008,  21:18 Найти цитируемый пост)
я говорил не про логер.. да и в принципе речь не только про логер была)
Автор вроде чётко сформулировал вопрос:
Цитата(DDK @  17.4.2008,  23:27 Найти цитируемый пост)
я просто хочу сделать функцию, пишущую лог, к кторой без проблем можно обратиться отовсюду

Так что не знаю про что ты говорил, но передавать в свой класс, который с самой формой ничего делать не будет, ссылку на форму - это безумие чистой воды, прикинь, если я захочу вместо ListBox1 использовать textBox7? И это ещё самые невинные грабли твоего подхода... 

Цитата(jonie @  18.4.2008,  21:18 Найти цитируемый пост)
а лучше взять log4net и посмотреть как стоит сделать, чем городить велосипеды.
Ничего, иногда полезно, тем более что log4net не является стандартом... К тому же нафиг мне скачивать 8 Мб ненужного функционала? с моим подключением к инету я быстрее напишу весь нужный мне функционал логгера, чем эта годзилла скачается...


Это сообщение отредактировал(а) source777 - 18.4.2008, 21:46


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
jonie
Дата 19.4.2008, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



source777 да я про заголовок темы сам. впрочем все все поняли) тут человек не понимает даже основы....
Цитата

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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
alver
Дата 19.5.2008, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Подскажите. Ситуация та же, что у DDK.
Класс вынесен в отдельный файл. Почему не работает, если я, допустим, хочу использовать методы класса в обработчиках событий, но класс там не виден. Пример:
Код

public partial class Form1 : Form
{
 public Form1()
 {
   InitializeComponent();
   file_class FIL = new file_class(this);
 }
}
 private void Form1_Load(object sender, EventArgs e)
 {
   FIL.open();
 }
}



Это сообщение отредактировал(а) alver - 19.5.2008, 15:39
PM MAIL GTalk Jabber   Вверх
Rififi
Дата 19.5.2008, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

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



alver, 
потому что область видимости локальной переменной 'c' ограничивается конструктором Form1
PM MAIL   Вверх
alver
Дата 19.5.2008, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Rififi @ 19.5.2008,  15:36)
alver, 
потому что область видимости локальной переменной 'c' ограничивается конструктором Form1

А как сделать так, чтоб и форма в класс передавалась и класс можно было использовать везде?
PM MAIL GTalk Jabber   Вверх
Rififi
Дата 19.5.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

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



Цитата(source777 @  18.4.2008,  21:44 Найти цитируемый пост)
К тому же нафиг мне скачивать 8 Мб ненужного функционала?

FYI, рантайм-часть log4net состоит из одной dll размером 270kb

Добавлено через 8 минут и 56 секунд
alver, 
в теме всё уже ответили
для лоджера - нужно перепроектировать дизайн. Надо передавать не форму, а интерфейс, который реализует необходимую функциональность.

и класс можно было использовать везде? 
в общем случае воспользоваться паттерном Singletone
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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