Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Вызов функции из всех экземпляров класса Добавлено: 16.11.08 12:20  

Автор вопроса:  FIX | ICQ: 348680795 
Имеется класс

Public Class Unit
    Private fRadius As Single
    Private fPosition As Point
    Private fPen As Pen
    Private fGraphics As Drawing.Graphics
    Private fRectangle As Drawing.Rectangle

    Public Sub New(ByRef pGraphics As System.Drawing.Graphics, ByVal pRadius As Single, ByVal pPosition As Point, ByVal pColor As Color, ByVal pWidth As Int16)
        fGraphics = pGraphics
        fRadius = pRadius
        fPosition = pPosition
        fPen = New Pen(pColor, pWidth)
        fRectangle = New Drawing.Rectangle(fPosition.X, fPosition.Y, fRadius, fRadius)
    End Sub

    Public Property Radius() As Single
        Get
            Return fRadius
        End Get
        Set(ByVal value As Single)
            fRadius = value
        End Set
    End Property

    Public Property Position() As Point
        Get
            Return fPosition
        End Get
        Set(ByVal value As Point)
            fPosition = value
            fRectangle = New Drawing.Rectangle(fPosition.X, fPosition.Y, fRadius, fRadius)
        End Set
    End Property

    Public Property ForeColor() As Color
        Get
            Return fPen.Color
        End Get
        Set(ByVal value As Color)
            fPen.Color = value
        End Set
    End Property

    Public Property Width() As Int16
        Get
            Return fPen.Width
        End Get
        Set(ByVal value As Int16)
            fPen.Width = value
        End Set
    End Property

    Public Sub Paint()
        fGraphics.DrawEllipse(fPen, fRectangle))
    End Sub

В ран-тайм я создаю сколько угодно экзмпляров класса, и для каждого приходится выполнять Sub Paint(), чтобы отобразить объект, можно ли это обойти и одной или несколькими строчками описать?

Ответить

  Ответы Всего ответов: 4  

Номер ответа: 1
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #1
Добавлено: 16.11.08 13:20
А нельзя в конструкторе вызывать Paint? =)

Ответить

Номер ответа: 2
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #2 Добавлено: 16.11.08 18:00
А нельзя в конструкторе вызывать Paint?

Разумеется нет.. Paint надо вызывать при каждой перерисовки формы..

FIX , архитектура класса в корне не верна. При таком подходе ты с перерисовкой замучаешься.
имхо.. правильней было бы сделать так..

  1.  
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Drawing;
  5. using System.Windows.Forms;
  6.  
  7. namespace WindowsFormsApplication1
  8. {
  9.     public partial class Form1 : Form
  10.     {
  11.         List<Shape> shapes = null;
  12.         Color[] colors = new Color[] { Color.Red, Color.Yellow, Color.Green, Color.Blue };
  13.         Random rnd = new Random(DateTime.Now.Millisecond);//randomize with seed
  14.  
  15.         public Form1()
  16.         {
  17.             InitializeComponent();
  18.             InitShapes();
  19.         }
  20.  
  21.         void InitShapes()
  22.         {
  23.             shapes = new List<Shape>();
  24.             for (int i = 0; i < 100; i++)
  25.             {
  26.                 int x = rnd.Next(Width);
  27.                 int y = rnd.Next(Height);
  28.                 Rectangle rect = new Rectangle(x, y, 50, 50);
  29.                 Color color = colors[rnd.Next(colors.Length)];
  30.                 /* create new instance  */
  31.                 Shape shape = new Shape(rect, color);
  32.                 /* add paint handler to shape */
  33.                 this.Paint += new PaintEventHandler(shape.Paint);
  34.                 shapes.Add(shape);
  35.             }
  36.         }
  37.  
  38.         protected override void OnClick(EventArgs e)
  39.         {
  40.             base.OnClick(e);
  41.             foreach (Shape shape in shapes)
  42.                 shape.Rect = new Rectangle(rnd.Next(Width), rnd.Next(Height), 50, 50);
  43.             this.Invalidate();
  44.         }
  45.     }
  46.  
  47.     /// <summary>
  48.     /// Test shape class
  49.     /// </summary>
  50.     public class Shape
  51.     {
  52.         Color color = Color.Empty;
  53.  
  54.         public Shape(Rectangle rect, Color color)
  55.         {
  56.             _Rectangle = rect;
  57.             this.color = color;
  58.         }
  59.  
  60.         private Rectangle _Rectangle = Rectangle.Empty;
  61.         public Rectangle Rect
  62.         {
  63.             get { return _Rectangle; }
  64.             set { _Rectangle = value; }
  65.         }
  66.         
  67.  
  68.         public virtual void Paint(object sender, PaintEventArgs e)
  69.         {
  70.             e.Graphics.FillRectangle(new SolidBrush(color), Rect);
  71.         }
  72.     }
  73. }



Набросал небольшой пример реализации Paint у дочерних объектов.. я думаю общая концепция понятна будет.

Ответить

Номер ответа: 3
Автор ответа:
 FIX



ICQ: 348680795 

Вопросов: 39
Ответов: 62
 Профиль | | #3 Добавлено: 16.11.08 22:36
EROSПохоже то что мне нужно. А можно на VB перевести пожалуйста? а то я с с# не в ладах

Ответить

Номер ответа: 4
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #4 Добавлено: 17.11.08 07:48
А можно на VB перевести пожалуйста?

Можно, но это уже не ко мне.. у меня нету VB по религиозным соображениям.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам