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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пользовательский компонент 
:(
    Опции темы
TYUS
Дата 19.6.2010, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте! Помогите, пожалуйста, разобраться. Написала компонент FuncGrafic построения графика функции на основе PictureBox.  У компонента есть свойство Points массив точек типа PointF. Устанавливаю компонент на форму. И по кнопке BitButton ввожу новые значения в Points, массив заполняется, но изображение компонента в зависимости от изменений массива точек не меняется. Как решить эту проблему подскажите, пожалуйста. Заранее благодарна 
PM MAIL   Вверх
diadiavova
Дата 21.6.2010, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



А почему не воспользоваться готовым контролом?
http://www.microsoft.com/downloads/details...a8-910ae6ea442c
http://code.msdn.microsoft.com/mschart




--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
jonie
Дата 21.6.2010, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

У компонента есть свойство Points массив точек типа PointF. Устанавливаю компонент на форму. И по кнопке BitButton ввожу новые значения в Points, массив заполняется, но изображение компонента в зависимости от изменений массива точек не меняется
Если у вас просто массив, то надо как-то говорить компоненту "пора перерисоваться"... вероятно вы этого не делаете. Оформите массив свойством, и сделайте при изменении его перерисовку грфика. Т.е. нечто вроде:
Код

class MyMegaPlotter {
private double[] points;
public double[] Points {get {....} set { points = value; RepaintAll(); }
}
конечно, "по уму" хорошо бы при изменении конкретного элемента массива делать отрисовку, но тогда надо рисовать свой класс, где перегружать индексатор (this[int index]), и уже из него вызывать событие "коллекция изменена" (например, реализовава INotifyPropertyChanged или свой event....


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


Новичок



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

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



Цитата

Оформите массив свойством, и сделайте при изменении его перерисовку грфика. Т.е. нечто вроде:Код

class MyMegaPlotter {
private double[] points;
public double[] Points {get {....} set { points = value; RepaintAll(); }
}

Я так и делаю, но очевидно, что -то не учитываю. Потому что, рисую я BitMap - е ,  BitMap создается, но пустой

Добавлено через 1 минуту и 51 секунду
Цитата

А почему не воспользоваться готовым контролом?
http://www.microsoft.com/downloads/details...a8-910ae6ea442c
http://code.msdn.microsoft.com/mschart

Спасибо за ссылочки, я изучаю С# и потому надо создать компонент самой
PM MAIL   Вверх
diadiavova
Дата 22.6.2010, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(TYUS @  22.6.2010,  21:09 Найти цитируемый пост)
Спасибо за ссылочки, я изучаю С# и потому надо создать компонент самой 

Тогда всё стандартно: прорисовку надо выполнять в методе OnPaint (или если это делается не в производном классе, то в обработчике события Paint), а при изменении содержимого, которое надо прорисовать, вызывается метод Invalidate контрола(это необязательно должен быть пикчербокс, даже лучшее сли не он smile )


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
TYUS
Дата 23.6.2010, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Тогда всё стандартно: прорисовку надо выполнять в методе OnPaint (или если это делается не в производном классе, то в обработчике события Paint), а при изменении содержимого, которое надо прорисовать, вызывается метод Invalidate контрола(это необязательно должен быть пикчербокс, даже лучшее сли не он  )

Дело в том, что компонент отображает график функции, пока массив точек формируется в самом массиве, когда я выношу формирование массива из компонента и ввод значений происходит с помощью свойства Points компонента, не смотря на то , что свойство компонента Points заполняется массивом точек, отрисовки не происходит. Я понимаю, что не правильно формирую свойство компонента, но нигде не могу найти примера
PM MAIL   Вверх
jonie
Дата 24.6.2010, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Нарисовал поясняющий пример.
Собственно думаю по нему станет понятно что когда вызывается и, главное, зачем....
Код

    class Program
    {
        class Point
        {
            public delegate void Changed(Point pt);
            public event Changed OnChanged;

            private void FirechangedEvent(string descr)
            {
                Console.WriteLine("Точка поменялась (" + descr + ")");
                if (null != OnChanged)
                    OnChanged(this);
            }
            private int x, y;

            public int X { get { return x; } set { if (x != value) { x = value; FirechangedEvent("X"); } } }
            public int Y { get { return y; } set { if (y != value) { y = value; FirechangedEvent("Y"); } } }

            public override string ToString()
            {
                return "{"+X + ";" + Y + "}";
            }
        }

        class PointArray
        {
            public delegate void Changed(PointArray pa, Point pt);  //объект, и что поменялось в нём
            public event Changed OnChanged;

            private void p_OnChanged(Point pt)
            {
                FirechangedEvent(pt, "Поменяли");
            }

            private void FirechangedEvent(Point pt, string descr)
            {
                Console.WriteLine("Массив поменялся :" + descr + " (Изменилась точка " + pt + ")");
                if (null != OnChanged)
                    OnChanged(this, pt);
            }

            private readonly List<Point> points = new List<Point>();

            public Point this[int idx]
            {
                get { return points[idx]; }
            }

            public void Add(Point p) { points.Add(p); p.OnChanged += p_OnChanged; FirechangedEvent(p, "Добавили"); }

            public void Remove(Point p) { points.Remove(p); p.OnChanged -= p_OnChanged; FirechangedEvent(p, "Удалили"); }

            public int Count { get { return points.Count; } }
        }

        class Plotter
        {
            PointArray pa = new PointArray();

            public Plotter()
            {
                pa.OnChanged += new PointArray.Changed(pa_OnChanged);
            }

            void pa_OnChanged(PointArray pa, Point pt)
            {
                Console.WriteLine("Надо перерисоваться!");
            }

            public void ReinitPlotter()
            {
                //1. чистим старый массив
                while( pa.Count> 0)
                {
                 pa.Remove(pa[0]);
                }

                //2. добавляем новые
                Random rnd = new Random();
                for (int i = 0; i < 5 ; i++)
                {
                    var pt = new Point { X = rnd.Next(10), Y = rnd.Next(10) };
                 pa.Add( pt );
                }
            }
        }

        static void Main(string[] args)
        {
            Plotter pt = new Plotter();
            pt.ReinitPlotter();
            Console.WriteLine("Переинициализируемсмя ...");
            pt.ReinitPlotter();
        }
    }




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


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



TYUS, из последнего поста я ничего не понял. Что значит 
Цитата(TYUS @  23.6.2010,  23:38 Найти цитируемый пост)
 массив точек формируется в самом массиве

???
Это всё равно, что сказать "вода кипит в самой воде". Фраза лишена смысла.
Цитата(TYUS @  23.6.2010,  23:38 Найти цитируемый пост)
ввод значений происходит с помощью свойства Points 

Что такое свойство Points? Это массив точек что ли? Какого типа свойство? smile 
Если нужно чтобы через свойство Points вводился массив точек и тут же отображался в виде линиии, проходящей через эти точки, то сделать надо примерно так
Код

    public partial class Chart : Control
    {
        public Chart()
        {
            InitializeComponent();
        }

        protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);
            if (Points != null)
            {
                pe.Graphics.Clear(Color.White);
                pe.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                pe.Graphics.DrawCurve(new Pen(Color.Red,2),this.Points);
            }
        }
        private Point[] points;
        public Point[] Points 
        {
            get
            {
                return points;
            }
            set
            {
                points = value;
                this.Invalidate();
            }
        }
    }



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
TYUS
Дата 25.6.2010, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



jonie, спасибо попробую

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

Цитата(TYUS @  23.6.2010,  23:38 ) 
 массив точек формируется в самом массиве 


???
Это всё равно, что сказать "вода кипит в самой воде". Фраза лишена смысла.

 это опечатка, я имела ввиду массив точек формируется в самом компоненте 


Цитата

Что такое свойство Points? Это массив точек что ли? Какого типа свойство?  

Я писала, что свойство Points -  это массив точек типа PointF

Добавлено через 7 минут и 27 секунд
Сегодня поняла, в чем проблема, но как ее решить не знаю. Как выяснилось,  в приложении я заполняю свойство FuncGrafic1.Points (где FuncGrafic1 и есть мой компонент), массивом точек, проверила, оно действительно заполнено, но в компонент этот массив точек не передается, в компоненте пустой массив точек, соответственно ничего не прорисовывается.  Если массив прописывать в самом компоненте в свойстве, все прорисовывается, а из вне почему-то не берет
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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