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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Гляньте код скажите что сделано не грамотно? С точки зрения ООП 
:(
    Опции темы
WaReZMEN
Дата 4.8.2008, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот сел накидал... незнаю но что то мне подсказывает что сделал что то не так хотя все работает хочу выслушать критику smile и дельные советы

Главная форма
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Prog
{
    public partial class FMain : Form
    {
        MngConstruction ConMng;

        public FMain()
        {
            InitializeComponent();
            ConMng = new MngConstruction(this,300,400);
        }

        private void FMain_Paint(object sender, PaintEventArgs e)
        {
            ConMng.Paint();
        }

        private void FMain_MouseDown(object sender, MouseEventArgs e)
        {
            ConMng.Paint();
        }
    }
}


Основной и единственный Класс

Код

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;





namespace Prog
{
    
   public class Const
   {
       public const int ptPROFILE_LEFT = 1;
       public const int ptPROFILE_TOP = 2;       
       public const int ptPROFILE_RIGHT = 3;
       public const int ptPROFILE_BOTTOM = 4;
       public const int ptPROFILE_IMPOST_VERT = 10;
       public const int ptPROFILE_IMPOST_HORIZONT = 11;
   }

   public class MngConstruction
   {
        private Form parentForm;
        private int Otstup = 10;
        public TConstraction MainConstr;


        public int Width;
        public int Height;
        public Point MousePoint;

        public ArrayList ObjectList = new ArrayList();
       
        public MngConstruction(Form ParentForm, int W, int H)
        {
            this.parentForm = ParentForm;
            this.Width = W;
            this.Height = H;
            this.MainConstr = new TConstraction(Otstup, Otstup, this.Width + Otstup, this.Height + Otstup, this);

        }

        public void Paint()
        {
            MousePoint=parentForm.PointToClient(Cursor.Position); 

            SolidBrush myBrush = new SolidBrush(Color.White);
            SolidBrush myFill = new SolidBrush(Color.YellowGreen);
            myFill.Color = Color.FromArgb(213, 235, 255);
            Pen LinePen = new Pen(Color.Black);
            Graphics PanelGraphics = parentForm.CreateGraphics();

            for (int i = 0; i < ObjectList.Count; i++)
            {
                if (ObjectList[i] is TProfil)
                {
                    (ObjectList[i] as TProfil).SelectObject();
                    if ((ObjectList[i] as TProfil).isSelected)  
                        myBrush.Color = Color.FromArgb(182, 209, 255);
                    else
                        myBrush.Color = myFill.Color = Color.FromArgb(250, 250, 250);

                    PanelGraphics.FillPolygon(myBrush, (ObjectList[i] as TProfil).maspoints);
                    PanelGraphics.DrawPolygon(LinePen, (ObjectList[i] as TProfil).maspoints);
                }
            }
            myFill.Dispose();
            myBrush.Dispose();
            LinePen.Dispose();
            PanelGraphics.Dispose();
        }
   }

   public class TConstraction
    {
        public Point BeginOrdinate;
        public Point EndOrdinate;
        public MngConstruction parent;

        private TProfil Profil_Left;
        private TProfil Profil_Top;
        private TProfil Profil_Right;
        private TProfil Profil_Bottom;
        
//       MouseEventArgs e
       

        public TConstraction(int StartX, int StartY, int W, int H, MngConstruction Parent)
        {
            parent = Parent;
            BeginOrdinate.X = StartX; //Начало координат окна
            BeginOrdinate.Y = StartY; //Начало координат окна
            EndOrdinate.X = BeginOrdinate.X + W; //Ширина
            EndOrdinate.Y = BeginOrdinate.Y + H; //Высота      

            Profil_Left = new TProfil(Const.ptPROFILE_LEFT, this);
            Profil_Top = new TProfil(Const.ptPROFILE_TOP, this);
            Profil_Right = new TProfil(Const.ptPROFILE_RIGHT, this);
            Profil_Bottom = new TProfil(Const.ptPROFILE_BOTTOM, this);

            parent.ObjectList.Add(this);
        }


    }

   public class TProfil 
    {
        private int fat = 28;
        private Boolean selected = false;
        private TConstraction parent;
        private int profiltype;
        
        public Point[] maspoints = new Point[4]; 

        public void SelectObject()
        {
            GraphicsPath path = new GraphicsPath();
            path.AddPolygon(this.maspoints);                              
            
            Region Reg = new Region(path);
            if (Reg.IsVisible(parent.parent.MousePoint) == true)
                this.isSelected = true;
            else
                this.isSelected = false;
            path.Dispose();
            Reg.Dispose();
        }
      
        public TProfil(int  ProfilType, TConstraction Parent)
        {
            this.parent = Parent;
            
            this.profiltype = ProfilType;
            this.Recalc();
            this.parent.parent.ObjectList.Add(this);
            
        }
 
        public int Fat
        {
            get
            {
                return fat;
            }
            set
            {
                fat = value;
            }
        }

        public Boolean isSelected
        {
            get
            {
                return selected;
            }
            set
            {
                selected = value;
            }
        }

        public void Recalc()
        {
            switch (profiltype)
            {
                case Const.ptPROFILE_LEFT:
                        this.maspoints[0] = new Point(parent.BeginOrdinate.X, parent.BeginOrdinate.Y);
                        this.maspoints[1] = new Point(parent.BeginOrdinate.X + Fat, parent.BeginOrdinate.Y + Fat);
                        this.maspoints[2] = new Point(parent.BeginOrdinate.X + Fat, parent.BeginOrdinate.Y + parent.EndOrdinate.Y - Fat);
                        this.maspoints[3] = new Point(parent.BeginOrdinate.X, parent.BeginOrdinate.Y + parent.EndOrdinate.Y);
                     break;
                case Const.ptPROFILE_TOP:
                        this.maspoints[0] = new Point(parent.BeginOrdinate.X, parent.BeginOrdinate.Y);
                        this.maspoints[1] = new Point(parent.BeginOrdinate.X + parent.EndOrdinate.X, parent.BeginOrdinate.Y);
                        this.maspoints[2] = new Point(parent.BeginOrdinate.X + parent.EndOrdinate.X - Fat, parent.BeginOrdinate.Y + Fat);
                        this.maspoints[3] = new Point(parent.BeginOrdinate.X + Fat, parent.BeginOrdinate.Y + Fat);
                     break;
                case Const.ptPROFILE_RIGHT:
                        this.maspoints[0] = new Point(parent.BeginOrdinate.X + parent.EndOrdinate.X - Fat, parent.BeginOrdinate.Y + Fat);
                        this.maspoints[1] = new Point(parent.BeginOrdinate.X + parent.EndOrdinate.X, parent.BeginOrdinate.Y);
                        this.maspoints[2] = new Point(parent.BeginOrdinate.X + parent.EndOrdinate.X, parent.BeginOrdinate.Y + parent.EndOrdinate.Y);
                        this.maspoints[3] = new Point(parent.BeginOrdinate.X + parent.EndOrdinate.X - Fat, parent.BeginOrdinate.Y + parent.EndOrdinate.Y - Fat);
                     break;
                case Const.ptPROFILE_BOTTOM:
                        this.maspoints[0] = new Point(parent.BeginOrdinate.X, parent.BeginOrdinate.Y + parent.EndOrdinate.Y);
                        this.maspoints[1] = new Point(parent.BeginOrdinate.X + parent.EndOrdinate.X, parent.BeginOrdinate.Y + parent.EndOrdinate.Y);
                        this.maspoints[2] = new Point(parent.BeginOrdinate.X + parent.EndOrdinate.X - Fat, parent.BeginOrdinate.Y + parent.EndOrdinate.Y - Fat);
                        this.maspoints[3] = new Point(parent.BeginOrdinate.X + Fat, parent.BeginOrdinate.Y + parent.EndOrdinate.Y - Fat);
                     break;
            }

        }

    }


 }




P.S. Всю жизнь писал на дельфи поетому не придераитесь к именам класса и переменным smile 

PM MAIL ICQ   Вверх
mr.DUDA
Дата 4.8.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Мелкие придирки:
- ArrayList заменить на List<TProfil> объектов 
- в обработчике MouseDown вызывать не Paint класса, а метод Refresh() формы
- в метод Paint передавать ссылку на Graphics (брать из e), вместо того чтобы создавать графикс с пом. CreateGraphics



--------------------
user posted image
PM MAIL WWW   Вверх
jonie
Дата 4.8.2008, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



1)  MngConstruction ConMng; - можно сделать readonly
2) не особо тут много ооп... есть паттерны вроде observer (publish/subscriber), и другие... хотя теже яйца только боком...


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


Опытный
**


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

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



mr.DUDA
Цитата

 ArrayList заменить на List<TProfil> объектов 

Просто еще не весь код так как в  ArrayList будут не только TProfil но и прочие классы чуток позже дапишу покажу...
Про MouseDown и Graphics спасибо учту. И еще стоит ли в класс MngConstruction
 форму передовать?
jonie, спасибо за совет!
PM MAIL ICQ   Вверх
WaReZMEN
Дата 5.8.2008, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот последняя версия

Главная форма
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Prog
{
    public partial class FMain : Form
    {
        MngConstruction ConMng;

        public FMain()
        {
            InitializeComponent();
            ConMng = new MngConstruction(300,400);
        }

        private void FMain_Paint(object sender, PaintEventArgs e)            
        {
            ConMng.Paint(e.Graphics);            
        }

        private void FMain_MouseDown(object sender, MouseEventArgs e)
        {
            ConMng.MousePoint = e.Location;
            Refresh();            
        }
    }
}


Класс

Код

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace Prog
{
    
   public class Const
   {
       public const int ptPROFILE_LEFT = 1;
       public const int ptPROFILE_TOP = 2;       
       public const int ptPROFILE_RIGHT = 3;
       public const int ptPROFILE_BOTTOM = 4;
       public const int alCenter = 10;
       public const int alBottom = 11;
       public const int alLeft = 12;
       public const int alRigth = 13;
       public const int alTop = 14;
       public const int imHorizontal = 100;
       public const int imVertical = 101;
   }

   public class MngConstruction 
   {    
        private int Otstup = 10;
        public TConstraction MainConstr;


        public int Width;
        public int Height;
        public Point MousePoint;

        public ArrayList ObjectList = new ArrayList();
       
        public MngConstruction(int W, int H)
        {
            this.Width = W;
            this.Height = H;
            this.MainConstr = new TConstraction(Otstup, Otstup, this.Width + Otstup, this.Height + Otstup, this);
        }

        public void Paint(Graphics PanelGraphics)
        {
            SolidBrush myBrush = new SolidBrush(Color.White);
            SolidBrush myFill = new SolidBrush(Color.YellowGreen);
            myFill.Color = Color.FromArgb(213, 235, 255);
            Pen LinePen = new Pen(Color.Black);

            for (int i = 0; i < ObjectList.Count; i++)
            {
                
                this.SelectObject(ObjectList[i] as TConstructionElement);

                if (ObjectList[i] is TProfil)
                {
                    
                    if ((ObjectList[i] as TProfil).isSelected)  
                        myBrush.Color = Color.FromArgb(182, 209, 255);
                    else
                        myBrush.Color = myFill.Color = Color.FromArgb(250, 250, 250);

                    PanelGraphics.FillPolygon(myBrush, (ObjectList[i] as TProfil).maspoints);
                    PanelGraphics.DrawPolygon(LinePen, (ObjectList[i] as TProfil).maspoints);
                }
                if (ObjectList[i] is TInfill)
                {
                    if ((ObjectList[i] as TInfill).isSelected) 
                        myFill.Color = Color.FromArgb(255, 227, 191);
                    else 
                        myFill.Color = myFill.Color = Color.FromArgb(213, 235, 255);
                    PanelGraphics.FillPolygon(myFill, (ObjectList[i] as TInfill).maspoints);
                    PanelGraphics.DrawPolygon(LinePen, (ObjectList[i] as TInfill).maspoints);
                }

                if (ObjectList[i] is TImpost)
                {
                    if ((ObjectList[i] as TImpost).isSelected) 
                        myFill.Color = Color.FromArgb(182, 209, 255);
                    else 
                        myFill.Color = myFill.Color = Color.FromArgb(250, 250, 250);
                    PanelGraphics.FillPolygon(myFill, (ObjectList[i] as TImpost).maspoints);
                    PanelGraphics.DrawPolygon(LinePen, (ObjectList[i] as TImpost).maspoints);
                }
                
            }
            myFill.Dispose();
            myBrush.Dispose();
            LinePen.Dispose();
        }

        public void SelectObject(TConstructionElement Element)
         {
            
            GraphicsPath path = new GraphicsPath();
            path.AddPolygon(Element.maspoints);
            
            Region Reg = new Region(path);
            if (Reg.IsVisible(this.MousePoint) == true)
                Element.isSelected = true;
            else
                Element.isSelected = false;
            path.Dispose();
            Reg.Dispose();
         }
    
   }

   public class TConstraction : TConstructionElement
    {

        public MngConstruction ParentMngConst;

        private TProfil Profil_Left;
        private TProfil Profil_Top;
        private TProfil Profil_Right;
        private TProfil Profil_Bottom;
        private TInfill Infill;

        public TConstraction(int StartX, int StartY, int W, int H, MngConstruction ParentMngConstruction)
        {
            this.ParentMngConst = ParentMngConstruction;
            this.BeginOrdinate.X = StartX; 
            this.BeginOrdinate.Y = StartY; 
            this.EndOrdinate.X = BeginOrdinate.X + W; 
            this.EndOrdinate.Y = BeginOrdinate.Y + H;      

            this.Profil_Left = new TProfil(Const.ptPROFILE_LEFT, this);
            this.Profil_Top = new TProfil(Const.ptPROFILE_TOP, this);
            this.Profil_Right = new TProfil(Const.ptPROFILE_RIGHT, this);
            this.Profil_Bottom = new TProfil(Const.ptPROFILE_BOTTOM, this);
            this.Infill = new TInfill(Const.alCenter, this);
            this.ParentMngConst.ObjectList.Add(this);
        }

        

    }

   public class TProfil : TConstructionElement
    {      
        private int profiltype;

        public TProfil(int ProfilType, TConstraction ParentConstraction)
        {
            this.Parent = ParentConstraction;
            
            this.profiltype = ProfilType;
            this.Recalc();
            this.Parent.ParentMngConst.ObjectList.Add(this);
            
        }
 

        private void Recalc()
        {
            switch (profiltype)
            {
                case Const.ptPROFILE_LEFT:
                        this.maspoints[0] = new Point(Parent.BeginOrdinate.X, Parent.BeginOrdinate.Y);
                        this.maspoints[1] = new Point(Parent.BeginOrdinate.X + Fat, Parent.BeginOrdinate.Y + Fat);
                        this.maspoints[2] = new Point(Parent.BeginOrdinate.X + Fat, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y - Fat);
                        this.maspoints[3] = new Point(Parent.BeginOrdinate.X, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y);
                     break;
                case Const.ptPROFILE_TOP:
                        this.maspoints[0] = new Point(Parent.BeginOrdinate.X, Parent.BeginOrdinate.Y);
                        this.maspoints[1] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X, Parent.BeginOrdinate.Y);
                        this.maspoints[2] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X - Fat, Parent.BeginOrdinate.Y + Fat);
                        this.maspoints[3] = new Point(Parent.BeginOrdinate.X + Fat, Parent.BeginOrdinate.Y + Fat);
                     break;
                case Const.ptPROFILE_RIGHT:
                        this.maspoints[0] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X - Fat, Parent.BeginOrdinate.Y + Fat);
                        this.maspoints[1] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X, Parent.BeginOrdinate.Y);
                        this.maspoints[2] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y);
                        this.maspoints[3] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X - Fat, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y - Fat);
                     break;
                case Const.ptPROFILE_BOTTOM:
                        this.maspoints[0] = new Point(Parent.BeginOrdinate.X, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y);
                        this.maspoints[1] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y);
                        this.maspoints[2] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X - Fat, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y - Fat);
                        this.maspoints[3] = new Point(Parent.BeginOrdinate.X + Fat, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y - Fat);
                     break;
            }

        }

    }

   public class TInfill : TConstructionElement
   {
       private int infillalign;
       public TImpost Impost;
       public TInfill Infill1;
       public TInfill Infill2;

       public TInfill(int InfillAlign, TConstraction ParentConstraction)
       {
           this.infillalign = InfillAlign;
           this.Parent = ParentConstraction;
           this.Recalc();
           this.Parent.ParentMngConst.ObjectList.Add(this);
       }

       private void Recalc()
       {   
           TConstraction c;
           switch (infillalign)
           {               
               case Const.alCenter:
                        c = this.Parent;
                        this.maspoints[0] = new Point(c.BeginOrdinate.X + Fat, c.BeginOrdinate.Y + Fat);
                        this.maspoints[1] = new Point(c.BeginOrdinate.X + c.EndOrdinate.X - Fat, c.BeginOrdinate.Y + Fat);
                        this.maspoints[2] = new Point(c.BeginOrdinate.X + c.EndOrdinate.X - Fat, c.BeginOrdinate.Y + c.EndOrdinate.Y - Fat);
                        this.maspoints[3] = new Point(c.BeginOrdinate.X + Fat, c.BeginOrdinate.Y + c.EndOrdinate.Y - Fat);
                        this.BeginOrdinate = this.maspoints[0];
                        this.EndOrdinate = this.maspoints[2];
                        this.Width = this.maspoints[1].X - this.maspoints[0].X;
                        this.Height = this.maspoints[3].Y - this.maspoints[0].Y;
                   break;
               case Const.alLeft:
                   break;
               case Const.alTop:
                   break;
               case Const.alRigth:
                   break;
               case Const.alBottom:
                   break;
           }

       }


   }
  
   public class TImpost : TConstructionElement
   {
       private int imposttype;
       private TInfill parentinfill;
       private int x;
       private int y;

       public TImpost(int ImpostType, TInfill ParentInfill, TConstraction ParentConstraction, int X, int Y)
       {
           this.Parent = ParentConstraction;
           this.parentinfill = ParentInfill;
           this.x = X;
           this.y = Y;
           this.imposttype = ImpostType;
           this.Recalc();
           this.Parent.ParentMngConst.ObjectList.Add(this);
       }

       public void Recalc()
       {
           switch (this.imposttype)
           {
               case Const.imVertical:
                   this.maspoints[0] = new Point(x - (Fat / 2), parentinfill.BeginOrdinate.Y);
                   this.maspoints[1] = new Point(x + (Fat / 2), parentinfill.BeginOrdinate.Y);
                   this.maspoints[2] = new Point(x + (Fat / 2), parentinfill.BeginOrdinate.Y + parentinfill.Height);
                   this.maspoints[3] = new Point(x - (Fat / 2), parentinfill.BeginOrdinate.Y + parentinfill.Height);
                   this.BeginOrdinate = this.maspoints[0];
                   this.EndOrdinate = this.maspoints[2];
                   this.Width = this.maspoints[1].X - this.maspoints[0].X;
                   this.Height = this.maspoints[3].Y - this.maspoints[0].Y;
                   break;
               case Const.imHorizontal:
                   this.maspoints[0] = new Point(parentinfill.BeginOrdinate.X, y - (Fat / 2));
                   this.maspoints[1] = new Point(parentinfill.EndOrdinate.X, y - (Fat / 2));
                   this.maspoints[2] = new Point(parentinfill.EndOrdinate.X, y + (Fat / 2));
                   this.maspoints[3] = new Point(parentinfill.BeginOrdinate.X, y + (Fat / 2));
                   this.BeginOrdinate = this.maspoints[0];
                   this.EndOrdinate = this.maspoints[2];
                   this.Width = this.maspoints[1].X - this.maspoints[0].X;
                   this.Height = this.maspoints[3].Y - this.maspoints[0].Y;
                   break;
           }
       }

   }

   public class TConstructionElement
   {
       private int fat = 28;
       private Boolean selected = false;
       private TConstraction parent;       
       private int width;
       private int height;

       public Point BeginOrdinate;
       public Point EndOrdinate;
       public Point[] maspoints = new Point[4];

       public int Fat
       {
           get
           {
               return fat;
           }
           set
           {
               fat = value;
           }
       }
       public Boolean isSelected
       {
           get
           {
               return selected;
           }
           set
           {
               selected = value;
           }
       }
       public TConstraction Parent
       {
           get
           {
               return parent;
           }
           set
           {
               parent = value;
           }
       }
       public int Width
       {
           get
           {
               return width;
           }
           set
           {
               width = value;
           }
       }
       public int Height
       {
           get
           {
               return height;
           }
           set
           {
               height = value;
           }
       }
   }
 }



Сдесь добавил еще класс TInfill ну и сделал класс TConstructionElement в нем основные своиства каторые есть почти во всех остальных... еще подумываю пренести сюда метод Recalc с пораметром. Что скажете??? Мне чесно нужно мнения грамотных людей.
PM MAIL ICQ   Вверх
jonie
Дата 5.8.2008, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



слету : public const int alRigth = 13; -- в enum, жИвотное)!


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


Опытный
**


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

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



jonie, чаго???
PM MAIL ICQ   Вверх
source777
Дата 5.8.2008, 14:01 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(jonie @  5.8.2008,  09:54 Найти цитируемый пост)
public const int alRigth = 13; -- в enum, жИвотное)! 
+много

WaReZMEN, что это за безобразие 
Цитата

public class Const ...

Класс должен быть одним единственным АТД, а не кучкой констант или переменных...

Цитата

ConMng = new MngConstruction(300,400);
в обработчик Form.OnLoad перенеси.


Дублирование кода сплошь и рядом, например, фрагменты:
Цитата

                    if ((ObjectList[i] as TInfill).isSelected) 
                        myFill.Color = Color.FromArgb(255, 227, 191);
                     else 
                        myFill.Color = myFill.Color = Color.FromArgb(213, 235, 255);
                    PanelGraphics.FillPolygon(myFill, (ObjectList[i] as TInfill).maspoints);
                    PanelGraphics.DrawPolygon(LinePen, (ObjectList[i] as TInfill).maspoints);


Цитата

                        this.maspoints[0] = new Point(Parent.BeginOrdinate.X, Parent.BeginOrdinate.Y);
                        this.maspoints[1] = new Point(Parent.BeginOrdinate.X + Fat, Parent.BeginOrdinate.Y + Fat);
                        this.maspoints[2] = new Point(Parent.BeginOrdinate.X + Fat, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y - Fat);
                        this.maspoints[3] = new Point(Parent.BeginOrdinate.X, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y);


и им подобные многократно встречаются с незначительными вариациями...

P.S. Это не ООП вообще, это лишь кодирование с использованием классов, как языковой конструкции. Ты только посмотри сколько у тебя в коде блоков switch!!! 



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


Опытный
**


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

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



source777,  c enum разобрался. 
public class Const ... я поискал по нету был именно такои савет... Я  понимаю что глупость но на тот мамент я других вариантов не знал....
Код

if ((ObjectList[i] as TInfill).isSelected) 
                        myFill.Color = Color.FromArgb(255, 227, 191);
                     else 
                        myFill.Color = myFill.Color = Color.FromArgb(213, 235, 255);
                    PanelGraphics.FillPolygon(myFill, (ObjectList[i] as TInfill).maspoints);
                    PanelGraphics.DrawPolygon(LinePen, (ObjectList[i] as TInfill).maspoints);


Cдесь убрть сложновато пока даже не вижу как...

а вот 
Код

this.maspoints[0] = new Point(Parent.BeginOrdinate.X, Parent.BeginOrdinate.Y);
                        this.maspoints[1] = new Point(Parent.BeginOrdinate.X + Fat, Parent.BeginOrdinate.Y + Fat);
                        this.maspoints[2] = new Point(Parent.BeginOrdinate.X + Fat, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y - Fat);
                        this.maspoints[3] = new Point(Parent.BeginOrdinate.X, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y);


Ну от этого никуда не денешся я б с удовольствием сделал переращет какнибудь по другому но подругому не вижу как!
P.S.  А куда денешся от switch????. В месте с критикои хотелось бы и реальной помощи smile

Это сообщение отредактировал(а) WaReZMEN - 6.8.2008, 02:23
PM MAIL ICQ   Вверх
mr.DUDA
Дата 6.8.2008, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Цитата(WaReZMEN @  4.8.2008,  23:51 Найти цитируемый пост)
Просто еще не весь код так как в  ArrayList будут не только TProfil но и прочие классы чуток позже дапишу покажу...

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


--------------------
user posted image
PM MAIL WWW   Вверх
WaReZMEN
Дата 6.8.2008, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mr.DUDA, Ок учту.
PM MAIL ICQ   Вверх
source777
Дата 6.8.2008, 11:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(WaReZMEN @  5.8.2008,  23:57 Найти цитируемый пост)
Cдесь убрть сложновато пока даже не вижу как...

Ничего сложного тут нет, даже можно сказать, что всё элементарно:
1) читаем, что тебе насоветовал mr.DUDA
2) Заменяем
Цитата

                if (ObjectList[i] is TProfil)
                {
                    
                    if ((ObjectList[i] as TProfil).isSelected)  
                        myBrush.Color = Color.FromArgb(182, 209, 255);
                    else
                        myBrush.Color = myFill.Color = Color.FromArgb(250, 250, 250);
                    PanelGraphics.FillPolygon(myBrush, (ObjectList[i] as TProfil).maspoints);
                    PanelGraphics.DrawPolygon(LinePen, (ObjectList[i] as TProfil).maspoints);
                }
                if (ObjectList[i] is TInfill)
                {
                    if ((ObjectList[i] as TInfill).isSelected) 
                        myFill.Color = Color.FromArgb(255, 227, 191);
                    else 
                        myFill.Color = myFill.Color = Color.FromArgb(213, 235, 255);
                    PanelGraphics.FillPolygon(myFill, (ObjectList[i] as TInfill).maspoints);
                    PanelGraphics.DrawPolygon(LinePen, (ObjectList[i] as TInfill).maspoints);
                }
                if (ObjectList[i] is TImpost)
                {
                    if ((ObjectList[i] as TImpost).isSelected) 
                        myFill.Color = Color.FromArgb(182, 209, 255);
                    else 
                        myFill.Color = myFill.Color = Color.FromArgb(250, 250, 250);
                    PanelGraphics.FillPolygon(myFill, (ObjectList[i] as TImpost).maspoints);
                    PanelGraphics.DrawPolygon(LinePen, (ObjectList[i] as TImpost).maspoints);
                }

на
Код
            
                    myBrush.Color = myFill.Color = ObjectList[i].Color;
                    PanelGraphics.FillPolygon(myBrush, ObjectList[i].maspoints);
                    PanelGraphics.DrawPolygon(LinePen, ObjectList[i].maspoints);

3) дивимся как работает шайтан-машина под названием "полиморфизм".



Цитата(WaReZMEN @  5.8.2008,  23:57 Найти цитируемый пост)
А куда денешся от switch?
Блин, ну ты про ООП почитай хоть маленько, именно про ООП, а не про синтаксис классов... Про паттерн State для начала, например.


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


Опытный
**


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

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



source777

Цитата

3) дивимся как работает шайтан-машина под названием "полиморфизм".




Цитата(WaReZMEN @  5.8.2008,  23:57 ) 
А куда денешся от switch? 

Блин, ну ты про ООП почитай хоть маленько, именно про ООП, а не про синтаксис классов... Про паттерн State для начала, например. 



Возможно все это и поможет но по части расчета координат вообще не вижу иного способа.... как там все сложнее чем есть сеичас... позже выложу последний код щас пока подправлю что вы говорите. Кстате спасибо огромное за советы!!!
PM MAIL ICQ   Вверх
source777
Дата 6.8.2008, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(WaReZMEN @  6.8.2008,  12:18 Найти цитируемый пост)
там все сложнее чем есть сеичас.
 Значит сделай, чтобы стало проще. Главное понять, что ты сам всё усложняешь...

Это сообщение отредактировал(а) source777 - 6.8.2008, 13:14


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


Опытный
**


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

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



source777, а де лучше о  паттерн State  почитать???
PM MAIL ICQ   Вверх
QryStaL
Дата 6.8.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


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

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





--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
source777
Дата 6.8.2008, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(WaReZMEN @  6.8.2008,  14:12 Найти цитируемый пост)
source777, а де лучше о  паттерн State  почитать??? 

В книгах по ООА/П, а для начала и статья сгодится...




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


Опытный
**


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

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



Не об ООП, но нехорошо:

Код

if (ObjectList[i] is TImpost)
     {
         if ((ObjectList[i] as TImpost).isSelected) 



потому что дважды производится преобразование к типу.

Нужно:

Код

TImpost tempTI = ObjectList[i] as TImpost;
if (tempTI != null)
     {
         if (tempTI.isSelected) 




Подробности:

As is или история о том как не надо писать код
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
source777
Дата 6.8.2008, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Skynin @  6.8.2008,  20:02 Найти цитируемый пост)
потому что дважды производится преобразование к типу.
да нет, это нехорошо совсем по другой причине: тут вообще в приведении типов никакой надобности нет, а в твоём варианте оно осталось! надобности нет и в публичном свойстве isSelected, это все детали реализации класса и на показ их незачем выставлять, эту логику необходимо перенести в свойство, возвращающее цвет в зависимости от состояния.



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


Опытный
**


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

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



source777
Цитата(source777 @  7.8.2008,  04:21 Найти цитируемый пост)
надобности нет и в публичном свойстве isSelected, это все детали реализации класса и на показ их незачем выставлять, эту логику необходимо перенести в свойство, возвращающее цвет в зависимости от состояния


Я вот подумывал об этом но теперь точно именно так и сделаю... smile
PM MAIL ICQ   Вверх
WaReZMEN
Дата 7.8.2008, 04:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот последняя версия на текущий момент
класс
Код

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace Prog
{
   public enum Const
    {
        none = 0,
        ptPROFILE_LEFT = 1,
        ptPROFILE_TOP = 2,
        ptPROFILE_RIGHT = 3,
        ptPROFILE_BOTTOM = 4,
        alCenter = 10,
        alBottom = 11,
        alLeft = 12,
        alRigth = 13,
        alTop = 14,
        imHorizontal = 100,
        imVertical = 101,
        stMouseDown=201

    }

   public class MngConstruction 
   {    
        private int Otstup = 10;
        public TConstraction MainConstr;

        public int Width;
        public int Height;
        public Point mousepoint;
        public Const mousestatus=Const.none;
         

//        public ArrayList ObjectList = new ArrayList();
        public List<TConstructionElement> ObjectList = new List<TConstructionElement>();
        public MngConstruction(int W, int H)
        {
            this.Width = W;
            this.Height = H;
            this.MainConstr = new TConstraction(Otstup, Otstup, this.Width + Otstup, this.Height + Otstup, this);
        }

        public Point MousePoint
        {
            get
            {
                return mousepoint;
            }
            set
            {
                mousepoint = value;
                
                SelectObject();
                if ((mousestatus == Const.imHorizontal) || (mousestatus == Const.imVertical))
                {
                    this.DropImpost(mousestatus);
                    mousestatus = Const.none;
                }

            }
        }

        public Const MouseStatus
        {
            get { return mousestatus; }
            set { mousestatus = value;}
        }       

        public void Paint(Graphics PanelGraphics)
        {
            SolidBrush myBrush = new SolidBrush(Color.Yellow);
            SolidBrush myFill = new SolidBrush(Color.Yellow);
            Pen LinePen = new Pen(Color.Black);

            for (int i = 0; i < ObjectList.Count; i++)
            {
                myBrush.Color = ObjectList[i].ActivColor;
                myFill.Color=ObjectList[i].ActivColor;
                PanelGraphics.FillPolygon(myBrush, ObjectList[i].maspoints);
                PanelGraphics.DrawPolygon(LinePen, ObjectList[i].maspoints);
            }

            LinePen.Dispose();
            myBrush.Dispose();
            myFill.Dispose();
        }

        public void SelectObject()
         {
             this.Deselect();
             for (int i = ObjectList.Count - 1; i >= 0; i--)
                 {                   
                     GraphicsPath path = new GraphicsPath();
                     path.AddPolygon(ObjectList[i].maspoints);

                     Region Reg = new Region(path);
                     if (Reg.IsVisible(this.MousePoint) == true)
                     {
                         ObjectList[i].isSelected = true;
                         break;
                     }
                     else
                         ObjectList[i].isSelected = false;
                     path.Dispose();
                     Reg.Dispose();
                 }
         }

        public void Deselect()
        {

            for (int i = ObjectList.Count - 1; i >= 0; i--)
            {
                if (ObjectList[i].isSelected) ObjectList[i].isSelected = false;
            }
        }

        public void DropImpost(Const ImpostType)
        {
            TInfill tmpInfill;
            for (int i = ObjectList.Count - 1; i >= 0; i--)
            {
              if (ObjectList[i] is TInfill)
                 if (ObjectList[i].isSelected)
                     {


                         tmpInfill = (ObjectList[i] as TInfill);

                         tmpInfill.Impost = new TImpost(ImpostType, tmpInfill, tmpInfill.Parent);
                            if (ImpostType == Const.imVertical)
                            {
                                tmpInfill.Infill1 = new TInfill(Const.alLeft, tmpInfill.Parent);
                                tmpInfill.Infill1.parentInfill = tmpInfill;
                                tmpInfill.Infill1.Recalc();
                                tmpInfill.Infill2 = new TInfill(Const.alRigth, tmpInfill.Parent);
                                tmpInfill.Infill2.parentInfill = tmpInfill;
                                tmpInfill.Infill2.Recalc();
                            }
                            else
                                if (ImpostType == Const.imHorizontal)
                                {
                                    tmpInfill.Infill1 = new TInfill(Const.alTop, tmpInfill.Parent);
                                    tmpInfill.Infill1.parentInfill = tmpInfill;
                                    tmpInfill.Infill1.Recalc();
                                    tmpInfill.Infill2 = new TInfill(Const.alBottom, tmpInfill.Parent);
                                    tmpInfill.Infill2.parentInfill = tmpInfill;
                                    tmpInfill.Infill2.Recalc();
                                }
                            break;
                       


                    }
            }
            
        }

        public void MoveImpost(Point NewPosImpost)
        {
            for (int i = ObjectList.Count - 1; i >= 0; i--)
            {
                if (ObjectList[i] is TImpost)
                    if (ObjectList[i].isSelected)
                    {
                        (ObjectList[i] as TImpost).X = NewPosImpost.X;
                        (ObjectList[i] as TImpost).Y = NewPosImpost.Y;
                        (ObjectList[i] as TImpost).Recalc();
                        (ObjectList[i] as TImpost).parentinfill.Infill1.Recalc();
                        (ObjectList[i] as TImpost).parentinfill.Infill2.Recalc();                         
                         break;
                    }
            }
        }

        
   }

   public class TConstraction : TConstructionElement
    {

        public MngConstruction ParentMngConst;

        private TProfil Profil_Left;
        private TProfil Profil_Top;
        private TProfil Profil_Right;
        private TProfil Profil_Bottom;
        private TInfill Infill;

        public TConstraction() { }
        public TConstraction(int StartX, int StartY, int W, int H, MngConstruction ParentMngConstruction) 
        {
            this.ParentMngConst = ParentMngConstruction;
            this.BeginOrdinate.X = StartX; 
            this.BeginOrdinate.Y = StartY; 
            this.EndOrdinate.X = BeginOrdinate.X + W; 
            this.EndOrdinate.Y = BeginOrdinate.Y + H;      

            this.Profil_Left = new TProfil(Const.ptPROFILE_LEFT, this);
            this.Profil_Top = new TProfil(Const.ptPROFILE_TOP, this);
            this.Profil_Right = new TProfil(Const.ptPROFILE_RIGHT, this);
            this.Profil_Bottom = new TProfil(Const.ptPROFILE_BOTTOM, this);
            this.Infill = new TInfill(Const.alCenter, this);
            this.Infill.Recalc();
            this.ParentMngConst.ObjectList.Add(this);
        }

        

    }

   public class TProfil : TConstructionElement
    {
       private Const profiltype;

       public TProfil(Const ProfilType, TConstraction ParentConstraction)
        {
            this.Parent = ParentConstraction;
            
            this.profiltype = ProfilType;
            this.Recalc();
            this.Parent.ParentMngConst.ObjectList.Add(this);
        }
 

        private void Recalc()
        {
            switch (profiltype)
            {
                case Const.ptPROFILE_LEFT:
                        this.maspoints[0] = new Point(Parent.BeginOrdinate.X, Parent.BeginOrdinate.Y);
                        this.maspoints[1] = new Point(Parent.BeginOrdinate.X + Fat, Parent.BeginOrdinate.Y + Fat);
                        this.maspoints[2] = new Point(Parent.BeginOrdinate.X + Fat, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y - Fat);
                        this.maspoints[3] = new Point(Parent.BeginOrdinate.X, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y);
                     break;
                case Const.ptPROFILE_TOP:
                        this.maspoints[0] = new Point(Parent.BeginOrdinate.X, Parent.BeginOrdinate.Y);
                        this.maspoints[1] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X, Parent.BeginOrdinate.Y);
                        this.maspoints[2] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X - Fat, Parent.BeginOrdinate.Y + Fat);
                        this.maspoints[3] = new Point(Parent.BeginOrdinate.X + Fat, Parent.BeginOrdinate.Y + Fat);
                     break;
                case Const.ptPROFILE_RIGHT:
                        this.maspoints[0] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X - Fat, Parent.BeginOrdinate.Y + Fat);
                        this.maspoints[1] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X, Parent.BeginOrdinate.Y);
                        this.maspoints[2] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y);
                        this.maspoints[3] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X - Fat, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y - Fat);
                     break;
                case Const.ptPROFILE_BOTTOM:
                        this.maspoints[0] = new Point(Parent.BeginOrdinate.X, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y);
                        this.maspoints[1] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y);
                        this.maspoints[2] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X - Fat, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y - Fat);
                        this.maspoints[3] = new Point(Parent.BeginOrdinate.X + Fat, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y - Fat);
                     break;
            }

        }

    }

   public class TInfill : TConstructionElement 
   {
       private Const infillalign;
       public TImpost Impost;
       public TInfill Infill1;
       public TInfill Infill2;
       public TInfill parentInfill;

       public TInfill(Const InfillAlign, TConstraction ParentConstraction)
       {
           this.infillalign = InfillAlign;
           this.Parent = ParentConstraction;

           this.Parent.ParentMngConst.ObjectList.Add(this);
           
           this.DeselectColor = Color.FromArgb(213, 235, 255);
           this.SelectColor = Color.FromArgb(255, 227, 191);
           this.ActivColor = this.DeselectColor;
       }

       public void Recalc()
       {   
           TConstraction c;
           TImpost imp;
           TInfill inf;
           switch (infillalign)
           {               
               case Const.alCenter:
                        c = this.Parent;
                        this.maspoints[0] = new Point(c.BeginOrdinate.X + Fat, c.BeginOrdinate.Y + Fat);
                        this.maspoints[1] = new Point(c.BeginOrdinate.X + c.EndOrdinate.X - Fat, c.BeginOrdinate.Y + Fat);
                        this.maspoints[2] = new Point(c.BeginOrdinate.X + c.EndOrdinate.X - Fat, c.BeginOrdinate.Y + c.EndOrdinate.Y - Fat);
                        this.maspoints[3] = new Point(c.BeginOrdinate.X + Fat, c.BeginOrdinate.Y + c.EndOrdinate.Y - Fat);
                        this.BeginOrdinate = this.maspoints[0];
                        this.EndOrdinate = this.maspoints[2];
                        this.Width = this.maspoints[1].X - this.maspoints[0].X;
                        this.Height = this.maspoints[3].Y - this.maspoints[0].Y;
                   break;
               case Const.alLeft:
                   imp = this.parentInfill.Impost;
                   inf = this.parentInfill;
                   this.maspoints[0] = new Point(inf.BeginOrdinate.X, inf.BeginOrdinate.Y);
                   this.maspoints[1] = new Point(imp.BeginOrdinate.X, imp.BeginOrdinate.Y);
                   this.maspoints[2] = new Point(imp.BeginOrdinate.X, inf.EndOrdinate.Y);
                   this.maspoints[3] = new Point(inf.BeginOrdinate.X, inf.EndOrdinate.Y);
                   this.BeginOrdinate = this.maspoints[0];
                   this.EndOrdinate = this.maspoints[2];
                   this.Width = this.maspoints[1].X - this.maspoints[0].X;
                   this.Height = this.maspoints[3].Y - this.maspoints[0].Y;  
                   break;
               case Const.alTop:
                   imp = this.parentInfill.Impost;
                   inf = this.parentInfill;
                   this.maspoints[0] = new Point(inf.BeginOrdinate.X, inf.BeginOrdinate.Y);
                   this.maspoints[1] = new Point(inf.EndOrdinate.X, inf.BeginOrdinate.Y);
                   this.maspoints[2] = new Point(imp.EndOrdinate.X, imp.BeginOrdinate.Y);
                   this.maspoints[3] = new Point(imp.BeginOrdinate.X, imp.BeginOrdinate.Y);
                   this.BeginOrdinate = this.maspoints[0];
                   this.EndOrdinate = this.maspoints[2];
                   this.Width = this.maspoints[1].X - this.maspoints[0].X;
                   this.Height = this.maspoints[3].Y - this.maspoints[0].Y;
                   break;
               case Const.alRigth:
                   imp = this.parentInfill.Impost;
                   inf = this.parentInfill;
                   this.maspoints[0] = new Point(imp.EndOrdinate.X, imp.BeginOrdinate.Y);
                   this.maspoints[1] = new Point(inf.EndOrdinate.X, inf.BeginOrdinate.Y);
                   this.maspoints[2] = new Point(inf.EndOrdinate.X, inf.EndOrdinate.Y);
                   this.maspoints[3] = new Point(imp.EndOrdinate.X, imp.EndOrdinate.Y);
                   this.BeginOrdinate = this.maspoints[0];
                   this.EndOrdinate = this.maspoints[2];
                   this.Width = this.maspoints[1].X - this.maspoints[0].X;
                   this.Height = this.maspoints[3].Y - this.maspoints[0].Y;
                   break;
               case Const.alBottom:
                   imp = this.parentInfill.Impost;
                   inf = this.parentInfill;
                   this.maspoints[0] = new Point(imp.BeginOrdinate.X, imp.EndOrdinate.Y);
                   this.maspoints[1] = new Point(imp.EndOrdinate.X, imp.EndOrdinate.Y);
                   this.maspoints[2] = new Point(inf.EndOrdinate.X, inf.EndOrdinate.Y);
                   this.maspoints[3] = new Point(imp.BeginOrdinate.X, inf.EndOrdinate.Y);
                   this.BeginOrdinate = this.maspoints[0];
                   this.EndOrdinate = this.maspoints[2];
                   this.Width = this.maspoints[1].X - this.maspoints[0].X;
                   this.Height = this.maspoints[3].Y - this.maspoints[0].Y;
                   break;
           }
           if (this.Impost != null) this.Impost.Recalc();
           if (this.Infill1 != null) this.Infill1.Recalc();
           if (this.Infill2 != null) this.Infill2.Recalc();


       }


   }
  
   public class TImpost : TConstructionElement
   {
       private Const imposttype;
       public TInfill parentinfill;
       public int X;
       public int Y;

       public TImpost(Const ImpostType, TInfill ParentInfill, TConstraction ParentConstraction)
       {
           this.Parent = ParentConstraction;
           this.parentinfill = ParentInfill;
           this.X = Parent.ParentMngConst.MousePoint.X;
           this.Y = Parent.ParentMngConst.MousePoint.Y;
           this.imposttype = ImpostType;
           this.Recalc();
           this.Parent.ParentMngConst.ObjectList.Add(this);
       }

       public void Recalc()
       {
           switch (this.imposttype)
           {
               case Const.imVertical:
                   this.maspoints[0] = new Point(X - (Fat / 2), parentinfill.BeginOrdinate.Y);
                   this.maspoints[1] = new Point(X + (Fat / 2), parentinfill.BeginOrdinate.Y);
                   this.maspoints[2] = new Point(X + (Fat / 2), parentinfill.BeginOrdinate.Y + parentinfill.Height);
                   this.maspoints[3] = new Point(X - (Fat / 2), parentinfill.BeginOrdinate.Y + parentinfill.Height);
                   this.BeginOrdinate = this.maspoints[0];
                   this.EndOrdinate = this.maspoints[2];
                   this.Width = this.maspoints[1].X - this.maspoints[0].X;
                   this.Height = this.maspoints[3].Y - this.maspoints[0].Y;
                   break;
               case Const.imHorizontal:
                   this.maspoints[0] = new Point(parentinfill.BeginOrdinate.X, Y - (Fat / 2));
                   this.maspoints[1] = new Point(parentinfill.EndOrdinate.X, Y - (Fat / 2));
                   this.maspoints[2] = new Point(parentinfill.EndOrdinate.X, Y + (Fat / 2));
                   this.maspoints[3] = new Point(parentinfill.BeginOrdinate.X, Y + (Fat / 2));
                   this.BeginOrdinate = this.maspoints[0];
                   this.EndOrdinate = this.maspoints[2];
                   this.Width = this.maspoints[1].X - this.maspoints[0].X;
                   this.Height = this.maspoints[3].Y - this.maspoints[0].Y;
                   break;
           }
       }

   }

   public class TConstructionElement
   {
       private int fat = 28;
       private Boolean selected = false;
       private TConstraction parent;       
       private int width;
       private int height;

       public Point BeginOrdinate;
       public Point EndOrdinate;
       public Point[] maspoints = new Point[4];

       public Color SelectColor = Color.FromArgb(182, 209, 255);
       public Color DeselectColor=Color.FromArgb(250, 250, 250);
       public Color ActivColor;
       
       

       public int Fat
       {
           get    { return fat;   }
           set { fat = value;  }
       }
       public Boolean isSelected
       {
           get { return selected;
               if (selected == true) ActivColor = SelectColor; else ActivColor = DeselectColor;
                 }
           set  {  selected = value;
               if (selected == true) ActivColor = SelectColor; else ActivColor = DeselectColor;       
                 }
       }
       public TConstraction Parent
       {
           get  {   return parent; }
           set {     parent = value; }
       }
       public int Width
       {
           get {  return width; }
           set {  width = value; }
       }
       public int Height
       {
           get { return height; }
           set  { height = value; }
       }
   }


 }

 

Вот форма

Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Prog
{
    public partial class FMain : Form
    {
        MngConstruction ConMng;

        public FMain()
        {
            InitializeComponent();
        }

        private void FMain_Paint(object sender, PaintEventArgs e)            
        {
            ConMng.Paint(e.Graphics);            
        }

        private void FMain_MouseDown(object sender, MouseEventArgs e)
        {
            if((ConMng.MouseStatus != Const.imHorizontal) & (ConMng.MouseStatus != Const.imVertical))
               ConMng.MouseStatus = Const.stMouseDown;
            ConMng.MousePoint = e.Location;
            Refresh();            
        }

        private void FMain_Load(object sender, EventArgs e)
        {
            ConMng = new MngConstruction(300, 400);            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ConMng.MouseStatus = Const.imVertical;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            ConMng.MouseStatus = Const.imHorizontal;
        }

        private void FMain_MouseMove(object sender, MouseEventArgs e)
        {
            if (ConMng.MouseStatus == Const.stMouseDown)
            {
                ConMng.MoveImpost(e.Location);
                Text = "X=" + e.Location.X.ToString() + " Y=" + e.Location.Y.ToString();
                Refresh();
            }
        }

        private void FMain_MouseUp(object sender, MouseEventArgs e)
        {
            ConMng.MouseStatus = Const.none;
        }

    }
}


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


Эксперт
***


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

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



Цитата(WaReZMEN @  7.8.2008,  04:17 Найти цитируемый пост)
   public enum Const
    {
        none = 0,
        ptPROFILE_LEFT = 1,
        ptPROFILE_TOP = 2,
        ptPROFILE_RIGHT = 3,
        ptPROFILE_BOTTOM = 4,
        alCenter = 10,
        alBottom = 11,
        alLeft = 12,
        alRigth = 13,
        alTop = 14,
        imHorizontal = 100,
        imVertical = 101,
        stMouseDown=201
    }

Я вот не пойму ты - совсем ку-ку или прикидываешься? Какой семантический смысл у твоего enum Const ??? Это безумная свалка констант, а не перечисление получилась...

P.S. Работа над ошибками не проведена, по прежнему не используется ООП, вообщем крепкая двойка за код!


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


Let's do some .NET
****


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

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



ггг ) из одного этого безумного enum-a гораздо логичнее сделать четыре,  хотя бы разделённых по смыслу )


source777, ну что вы так уж сразу двойки ставите) человек же только учится) так и желание отбить не долго...


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


Эксперт
***


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

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



Partizan, поздравляю с 1000-ым сообщением  smile 
Цитата(Partizan @  7.8.2008,  12:02 Найти цитируемый пост)
source777, ну что вы так уж сразу двойки ставите) человек же только учится) так и желание отбить не долго... 
А это промежуточная оценка, её можно и исправить, если начать думать, а не вставлять сюда каждый день здоровенные куски кода, которые друг от друга ничем концептуально не отличаются...

P.S. Лучше бы он взял маленький кусок своего кода строчек на 100 и довёл его до ума, а не плодил дурнопахнущий код... Тем более что его уже невозможно читать: все классы кроме формы в одном файле, ни единого комментария... А имена переменных - это вообще отдельный ужос, чего только myBrush стоит или tmpInfill.Infill1...


Это сообщение отредактировал(а) source777 - 7.8.2008, 13:18


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


Опытный
**


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

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



source777, нивижу большого отличия от 4-х enum-a... и кстате к названию просил не предиратся  смотрите первый топ....
ну я стораюсь юзать ООП но что еще осталось поскажите ....
Partizan, стараюсь двоикои меня не испугаеш... ядумаю строшнеее без ответов в теме две недели smile
PM MAIL ICQ   Вверх
source777
Дата 7.8.2008, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(WaReZMEN @  7.8.2008,  13:15 Найти цитируемый пост)
к названию просил не предиратся  смотрите первый топ....
Это не придирки, это очень важный момент, а первый топ я смотрел... Жаль только, что из-за таких вот прецедентов ходят слухи, что Delphi-программисты ничего кроме  расставления кнопок по формам не умеют...

Цитата(WaReZMEN @  7.8.2008,  13:15 Найти цитируемый пост)
source777, нивижу большого отличия от 4-х enum-a...
Значит не прикидываешься...
Что значит Const.alCenter ?  С таким же успехом можно было везде в коде вместо него 10 писать! От замены магического числа на магическое слово ничего не поменялось... Ты не сможешь объявить, находясь в здравом уме, переменную типа Const!!! 
А введя перечисление Alignment, ты смог бы использовать семантически ясную запись типа: Alignment.Center.

Цитата(WaReZMEN @  7.8.2008,  13:15 Найти цитируемый пост)
ну я стораюсь юзать ООП но что еще осталось поскажите ....
Да всё осталось... ты же ничего по сути не исправил.. только синтаксис в паре мест изменил.
90% кода, который ты сюда выкладываешь, никуда не годится, но кто ж будет тебе описывать все недоразумения 500 строк кода, если хочешь можешь выделить любой метод, и я тебе по нему конкретно накидаю кучу замечаний...
Попробуй написать с нуля, но на сей раз с учётом ООП... Потому что из запорожца мерседес всё равно не сделать...



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


Let's do some .NET
****


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

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



Цитата

Лучше бы он взял маленький кусок своего кода строчек на 100 и довёл его до ума


Ну раз уж на то пошло, то чтобы добиться OOP-style, надо сначала спроектировать приложение, выделить сущности, взаимоотношения между ними..use cases нарисовать в конце концов...а 100 строк доводить "до ума" смысла нет...ибо дабы приложение таки соответствовало концепции ООП, его надо пересматривать в корне и постепенно изменять в сторону ООП...то есть я говорю о том, что взор разработчика должен затрагивать всю систему в целом...как бы воспарить над ней и посмотреть сверху: а какое же оно сейчас моё приложение и какое оно должно быть...а ограничиваться 100 строками кода - эт ни к чему не приведёт smile


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


Эксперт
***


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

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



Цитата(Partizan @  7.8.2008,  13:49 Найти цитируемый пост)
то есть я говорю о том, что взор разработчика должен затрагивать всю систему в целом...как бы воспарить над ней и посмотреть сверху: а какое же оно сейчас моё приложение и какое оно должно быть...
Ну правильно, давайте теперь на форум постить листинги по 5-50 тыс. строк и спрашивать, что в них не так с точки зрения ООП... Может всё-таки для начала нужно концепции ООП изучить на небольшом объёме кода?

P.S. А насчёт системы в целом, это UML-диаграммы надо смотреть, код для этой цели вообще не катит...


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


Let's do some .NET
****


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

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



source777, на самом деле топик изначально некорректно задан)


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


Эксперт
***


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

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



Цитата(Partizan @  7.8.2008,  14:57 Найти цитируемый пост)
source777, на самом деле топик изначально некорректно задан) 
Это точно, а в названии темы запятая пропущена и "не" отдельно написано. smile  Что уже неграмотно, а мы этот момент как-то упустили из виду...



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


Эксперт
***


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

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



WaReZMEN, вот тебе список вопросов, пока ты для своего кода не ответишь на все эти вопросы положительно, разговаривать с тобой будет бесполезно...

user posted image

P.S. И добавь комментарии к методам и классам!!!


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


Опытный
**


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

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



source777, слов нет. Ну я ведь просил не придерется к названиям та как изменить их дело 10 секунд а на данном этапе мне и так понятно что и они обозначают. Я прекрасно понимаю, что здесь можно долго возражать. В дельфи делалось все проще создал юнит там константы объявил и юзаи их де нужно.  По поводу списка вопросов вопросы конечно интересные постараюсь ответить.  Тем неимение спасибо, что так раскритиковали заставляет задуматься тем ли я занимаюсь… Мож на сварщика пойти… 
Вот enum переделал так лучше?
Код

       public enum Align //Для Профилеи и Инфилов
    {
        None = 0,
        Center = 1,
        Left = 2,
        Top = 3,
        Rigth = 4,
        Bottom = 5
    }

    public enum Orientation //Для Импостов
    {
        Horizontal = 100,
        Vertical = 101
    }

   public enum MouseState //Для мыши 
    {
       msNone=0,       
       msImpostHorizontal = 200,
       msImpostVertical = 201,
       msMouseDown = 202
    }



Цитата

А имена переменных - это вообще отдельный ужос, чего только myBrush стоит или tmpInfill.Infill1...

Ну имена переменных слабость вечно полчаса сидишь и думаешь как назвать... myBrush ну а как к примеры вы бы назвали??? tmpInfill ну да здесь глупо конечно был еще один вариант xInfill smile 
Infill1 и Infill2 ну здесь вообще другие варианты просто отпадают ибо у каждого infil может быть еще два...



Это сообщение отредактировал(а) WaReZMEN - 8.8.2008, 02:32
PM MAIL ICQ   Вверх
Skynin
Дата 8.8.2008, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(source777)

да нет, это нехорошо совсем по другой причине: тут вообще в приведении типов никакой надобности нет, а в твоём варианте оно осталось!

Я сразу написал, что не бо ООП мое замечание. Потому что в задачу не вникал, чтобы указать где что-то можно реализовать. Такие куски кода разве что будучи тим-лидером буду исследовать.

Цитата(WaReZMEN)

myBrush ну а как к примеры вы бы назвали???

Приставка my в названиях мне вообще непонятна. К чему "Мои документы", ..., myBrush, myCollection и т.д.? Понятно что если я написал то оно и так - My.

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

Цитата

так раскритиковали заставляет задуматься тем ли я занимаюсь… Мож на сварщика пойти… 

Может smile

Но тут решать нужно - чем больше нравится заниматься.

А насчет критики - то напрасно удивляетесь. Иного и быть не могло, даже если бы написали красивейший код.

Для того чтобы научиться писать в стиле ООП быстро и надежно (а не долго, от проекта к проекту по капле выдавливая из себя "процедуриста", и периодически впадая обратно) берете - Smalltalk(Cincom'овский например) - и вперед. Там либо ничего не напишете, либо в ООП.
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
WaReZMEN
Дата 8.8.2008, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Skynin
Цитата

А насчет критики - то напрасно удивляетесь. Иного и быть не могло, даже если бы написали красивейший код.

Я не против критики smile это просто шутка была... мне какраз критика и нужна...
PM MAIL ICQ   Вверх
source777
Дата 8.8.2008, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(WaReZMEN @  8.8.2008,  00:03 Найти цитируемый пост)
я ведь просил не придерется к названиям та как изменить их дело 10 секунд
Это тебе пока так кажется, а практика показывает, что утверждение "как вы лодку назовёте - так она и поплывёт" вполне применимо к программированию, точнее к именованию идентификаторов. Ведь именно идентификаторы определяют под каким углом зрения ты будешь смотреть на код...

Цитата(WaReZMEN @  8.8.2008,  00:03 Найти цитируемый пост)
Ну имена переменных слабость вечно полчаса сидишь и думаешь как назвать... myBrush ну а как к примеры вы бы назвали??? tmpInfill ну да здесь глупо конечно был еще один вариант xInfill smile 

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

Цитата(WaReZMEN @  8.8.2008,  00:03 Найти цитируемый пост)

Infill1 и Infill2 ну здесь вообще другие варианты просто отпадают ибо у каждого infil может быть еще два...
"У каждого заполнения может быть ещё два заполнения" - по твоему это нормальная фраза?

Добавлено через 5 минут и 10 секунд
Цитата(WaReZMEN @  8.8.2008,  00:03 Найти цитируемый пост)
Вот enum переделал так лучше?
гораздо лучше, ещё бы приставку ms убрать из значений MouseState, и Align заменить на Alignment, всё-таки существительные в данном случае предпочтительнее.



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


Опытный
**


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

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



source777
Цитата

"У каждого заполнения может быть ещё два заполнения" - по твоему это нормальная фраза?

Фраза может и не очень, но отражает суровую действительность... Так как что структура такова что самого начала работы программы у нас есть только одно заполнение когда мы кидаем на него Импост наш инфил грубо говоря делится на две части справа от импоста и слева. Так вот мне кажется, что такая структура правильна. Иначе придется сперва заполнение делить на множество вообще на мои взгляд так проще (с двумя инфилами) 
по поводу  Alignment ну я так и сделал сначала а потом посмотрел что в Делфи к примеру это свойство отвевает за выравнивание, а меня как бы к чему прилипает (глупо конечно звучит ) а MouseState уже убрал smile
Может, поможете мне решить проблему с методом Recalc

Код

           private void Recalc()
       {
            switch (profilAlignment)
            {
                case Alignment.Left:
                        this.maspoints[0] = new Point(Parent.BeginOrdinate.X, Parent.BeginOrdinate.Y);
                        this.maspoints[1] = new Point(Parent.BeginOrdinate.X + Fat, Parent.BeginOrdinate.Y + Fat);
                        this.maspoints[2] = new Point(Parent.BeginOrdinate.X + Fat, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y - Fat);
                        this.maspoints[3] = new Point(Parent.BeginOrdinate.X, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y);
                     break;
                case Alignment.Top:
                        this.maspoints[0] = new Point(Parent.BeginOrdinate.X, Parent.BeginOrdinate.Y);
                        this.maspoints[1] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X, Parent.BeginOrdinate.Y);
                        this.maspoints[2] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X - Fat, Parent.BeginOrdinate.Y + Fat);
                        this.maspoints[3] = new Point(Parent.BeginOrdinate.X + Fat, Parent.BeginOrdinate.Y + Fat);
                     break;
                case Alignment.Rigth:
                        this.maspoints[0] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X - Fat, Parent.BeginOrdinate.Y + Fat);
                        this.maspoints[1] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X, Parent.BeginOrdinate.Y);
                        this.maspoints[2] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y);
                        this.maspoints[3] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X - Fat, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y - Fat);
                     break;
                case Alignment.Bottom:
                        this.maspoints[0] = new Point(Parent.BeginOrdinate.X, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y);
                        this.maspoints[1] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y);
                        this.maspoints[2] = new Point(Parent.BeginOrdinate.X + Parent.EndOrdinate.X - Fat, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y - Fat);
                        this.maspoints[3] = new Point(Parent.BeginOrdinate.X + Fat, Parent.BeginOrdinate.Y + Parent.EndOrdinate.Y - Fat);
                     break;
            }

        }


Все говорили что много switch и что нужно юзать паттерн State. Почитал я  думаю что сдесь он не уместен. Если не прав растолкуйте.
 Скажу лишь,  что это метод вызывается только при созданий экземпляра класса TPrifil это груба говоря, рама окна. 

Это сообщение отредактировал(а) WaReZMEN - 8.8.2008, 12:21
PM MAIL ICQ   Вверх
source777
Дата 8.8.2008, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(WaReZMEN @  8.8.2008,  11:42 Найти цитируемый пост)
Так как что структура такова что самого начала работы программы 
Это всё отмазы, если структура - плохая, то надо сделать хорошую исходя из задачи, а не исходя из структуры. Ты можешь хоть описать, что ты делаешь, нормальным русским языком? Или ты думаешь, что кто-то понял твой код?  smile  smile  smile 

Цитата(WaReZMEN @  8.8.2008,  11:42 Найти цитируемый пост)
Скажу лишь,  что это метод вызывается только при созданий экземпляра класса TPrifil это груба говоря, рама окна. 
метод - рама? метод - это действие! Зачем нужен этот метод?  Что такое maspoints? Что такое Parent? Почему maspoints нельзя заменить на набор вычисляемых свойств? Почему maspoints пересоздаются каждый раз? Они устанавливаются разными методами? Так не должно быть должны быть центральные точки управления! А глобальных переменных быть не должно!!!
 




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


Опытный
**


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

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



source777, еслиб запустили мои код то уивидели бы что я делаю... Это примитивный конструктор пластиковых окон.

Цитата

метод - рама? метод - это действие! Зачем нужен этот метод?  Что такое maspoints?   

Вообщем каждое окно состоит из рамы (я предпоситаю слово каробка TConstraction)  стекл (или запонения TInfill) и импостов TImpost перегородок разделяющих раму онка и соответствено стекла (в место одного большого) два поменьше... рама (каробка) состоит из   4-х профилеи (всмысле пластиковых профилеи TProfill). Метод Recal (деиствие или как вы его называете...) для меня это грубо говоря процедура расчета координат профиля для его графического отображения точки он записывает в maspoint... 
Цитата

Что такое Parent?

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

Почему maspoints пересоздаются каждый раз?Они устанавливаются разными методами? 

Насамом деле он создается только один раз для конкретного профиля. в дольшеишем нет пересчета...

Цитата

Так не должно быть должны быть центральные точки управления! А глобальных переменных быть не должно!!!

Центральные точки управления чего?
P.S. Вот скрин программы... user posted image
Планируется еще створки добавить предпологаю что класс створок будет наследоватся от TConstraction.

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


Эксперт
***


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

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



Pane - оконное стекло
WindowFrame - оконная рама
Separator - перегородка-разделитель
Profile - профиль

Ну демонстрируй, как ты за 10 сек, меняешь имена классов...

Цитата(WaReZMEN @  8.8.2008,  13:20 Найти цитируемый пост)
Насамом деле он создается только один раз для конкретного профиля. в дольшеишем нет пересчета...
С какого хрена maspoints не private??? Она просто обязана быть private!!! Нафига метод назван ReCalc, если нет никакого пересчёта? Зачем нужен этот метод? Убери его...

Цитата(WaReZMEN @  8.8.2008,  13:20 Найти цитируемый пост)
source777, еслиб запустили мои код то уивидели бы что я делаю...
Как в анекдоте:
Цитата

У быдло-кодера спрашивают: "Что ты пишешь?", а он отвечает: "Понятия не имею, сейчас запущу и увижу..."

Так что запомни: если код надо выполнить, чтобы понять, что он делает, то этот код необходимо выбросить!!!


Цитата(WaReZMEN @  8.8.2008,  13:20 Найти цитируемый пост)
Это примитивный конструктор пластиковых окон.

Ну хоть что-то удалось из тебя выжать... 
Уже можно сказать, что отношения наследования тут нет!
А есть класс Window, в него включены экземпляры классов WindowFrame,  Separator,  List<Profile>, List<Pane>.
У всех классов (Window, WindowFrame,  Separator,  Profile, Pane) есть св-ва TopLeftPoint, Width и Height и метод Draw, их можно взять у IDrawable, причём эти свойства read-only(исключение для Separator, который можно двигать, и Pane, геометрические св-ва которого меняются в зависимости от Separator) и устанавливаются в конструкторе. Дальше всё вполне просто, возможно ты даже справишься с реализацией самостоятельно.


Цитата(WaReZMEN @  8.8.2008,  13:20 Найти цитируемый пост)
Центральные точки управления чего?
Failed. Центральные точки управления ЧЕМ? Сложностью естественно.



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


Опытный
**


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

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



Цитата

Pane - оконное стекло
WindowFrame - оконная рама
Separator - перегородка-разделитель
Profile - профиль


Названия эти не мной придуманы так они насамом деле называются в производстве оконных пластиковых конструкциях...

Цитата

С какого хрена maspoints не private??? Она просто обязана быть private!!! 

Ну потому как был метод Paint в классе MngConstruction (он типа управляющий класс)...
Цитата

Нафига метод назван ReCalc, если нет никакого пересчёта? Зачем нужен этот метод? Убери его... 

Я упоминул что в будущем будет створка и если мы будем двигать Импост или как вы его назавали Separator то естествено створка будет пересчитыватся....  а вообще можно посомтреть мою прогу работающую на дельфе http://primokna.ru/PrimOknaSoft.exe ну это если интересно...

Цитата

Ну хоть что-то удалось из тебя выжать... 
Уже можно сказать, что отношения наследования тут нет!
А есть класс Window, в него включены экземпляры классов WindowFrame,  Separator,  List<Profile>, List<Pane>.
У всех классов (Window, WindowFrame,  Separator,  Profile, Pane) есть св-ва TopLeftPoint, Width и Height и метод Draw, их можно взять у IDrawable, причём эти свойства read-only(исключение для Separator, который можно двигать, и Pane, геометрические св-ва которого меняются в зависимости от Separator) и устанавливаются в конструкторе. Дальше всё вполне просто, возможно ты даже справишься с реализацией самостоятельно.

За это спасибо! Вот только мне лично кажется что  к примеру импост (Separator) можно унаследовать  от Profile створку от WindowFrame... может я и не прав конечно... 
Так осталось не понятно как быть с расчетом координат для Profile и прочих элементов?

Это сообщение отредактировал(а) WaReZMEN - 8.8.2008, 14:57
PM MAIL ICQ   Вверх
source777
Дата 8.8.2008, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(WaReZMEN @  8.8.2008,  14:56 Найти цитируемый пост)
Так осталось не понятно как быть с расчетом координат для Profile и прочих элементов?
Не использовать все эти координаты, там явная избыточность у тебя с точки зрения математики, а нужный базис я тебе указал: координаты угла, ширина и высота.



Цитата(WaReZMEN @  8.8.2008,  14:56 Найти цитируемый пост)
Вот только мне лично кажется что  к примеру импост (Separator) можно унаследовать  от Profile створку от WindowFrame... может я и не прав конечно... 
Наследовать можно лишь в одном случае - если между классами существует отношение "является". А теперь подумай: перегородка является профилем? створка является оконной рамой?



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


Идущий в даль
**


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

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



Спустил твою прогу, не очень понятно что делает.Особенно когда щелкаю на раму, ну становятся синего цвета. ну ладно написано "примитивный".
А допиши метод FMain_Paint так:
Код

 private void FMain_Paint(object sender, PaintEventArgs e)            
        {
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.UserPaint, true);

            ConMng.Paint(e.Graphics);            
        }

Небудет так графика мерцать.  smile

Это сообщение отредактировал(а) SKrivosein - 8.8.2008, 15:56


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
QryStaL
Дата 8.8.2008, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


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

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



Эта тема уже разрослась до неимоверных пределов. Я думаю, обсуждение в таком же ключе мало чем поможет - надо перепроектировать. Автору неплохо бы изучить ООП, построить диаграмму классов, взаимодействий и потом уже заняться кодированием.


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
Partizan
Дата 8.8.2008, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


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

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



QryStaL, а я как раз подумал, что автору следовало бы создать новый топик в разделе о проектировании ПО и запостить туда предметную область. Я думаю, что такие корифеи системного анализа как ida, помогут.


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


Опытный
**


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

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



SKrivosein
Цитата

Особенно когда щелкаю на раму, ну становятся синего цвета 

это выделения в будущем можно будет посмотреть размеры и тип выбраного профиля.... За код против мерцания отдельное спасибо smile
source777 ,
Цитата

А теперь подумай: перегородка является профилем? створка является оконной рамой?

Вот если чесно профиль делается из тогоже что и перегородка зазница между ними в ом что у профеля углы скошены а у перегоротки прямые ну и ее можно двигать... Рама тоже 4-х угольная как и створка более того в створке тоже может быть несколько стекл и перегоротка. Воообщем если говорите не нужно наследовать значит не буду... По поводу названий Pane не совсем верно так как в окнах не обязательно стекло может быть... Вообще в пластиковых окнах есть понятие заполнения в него входят стеклопаке (несколько стекл 2-3 и больше) а также сендвич-панель ну прочие не буду вдаватся в детали....
QryStaL
Цитата

надо перепроектировать

Ну этим я какраз токи я занялся... по поводу ООП ну какбы я знаю что это такое и с чам это едят...
Partizan, ну мне то ножно не готовое решения я хочу понять как должно быть. как говорилось выше программа то работает (просьба не кречать про говнокодерство) и я щас разбераюсь как по правельному должен быть написан подобный код вот и все... 

Это сообщение отредактировал(а) WaReZMEN - 9.8.2008, 01:20
PM MAIL ICQ   Вверх
Partizan
Дата 9.8.2008, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


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

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



WaReZMEN, а с чего вы взяли что в разделе о проектировании дают готовые решения? всего-то помогут нормальную структуру классов сделать...


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


Опытный
**


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

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



Partizan, я что то не видал такого раздела...
Цитата(Partizan @  9.8.2008,  09:10 Найти цитируемый пост)
нормальную структуру классов сделать

Ну так я это и пытаюсь сделать следовательно для меня это и будет готовое ришение... 

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


Let's do some .NET
****


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

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



Ладно, не хотите прислушаться, разбирайтесь сами....


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


Опытный
**


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

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



Partizan, я ж говорю не видал такого раздела скажите де н я почитаю что там пишут мож сам все поиму...
source777 , если я правельно все понял то получается что то вроде этого 
user posted image

Это сообщение отредактировал(а) WaReZMEN - 9.8.2008, 02:25
PM MAIL ICQ   Вверх
Partizan
Дата 9.8.2008, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


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

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





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


Опытный
**


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

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



Partizan, спасибо почитаю... 
PM MAIL ICQ   Вверх
source777
Дата 9.8.2008, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(WaReZMEN @  9.8.2008,  00:55 Найти цитируемый пост)
Вот если чесно профиль делается из тогоже что и перегородка зазница между ними в ом что у профеля углы скошены а у перегоротки прямые ну и ее можно двигать... 
Это всё равно, что сказать, ружьё делается из стали и труба делается из стали, а разница между ними только в том, что у ружья ещё есть приклад и оно стреляет... Ты считаешь это нормальное док-во того, что ружьё является трубой? 


Цитата(WaReZMEN @  9.8.2008,  00:55 Найти цитируемый пост)
Воообщем если говорите не нужно наследовать значит не буду...
Я не говорю, что не надо использовать наследование вообще, но пока не доказано, что объекты связаны отношением "является" наложить запрет на использование наследования вполне разумно.

Цитата(WaReZMEN @  9.8.2008,  01:56 Найти цитируемый пост)
source777 , если я правельно все понял то получается что то вроде этого
Пока да, можно ещё ввести абстрактный класс между интерфейсом и конкретными классами для общей реализации свойств... 
+ на схеме не отражена композиция в классе Window, о которой я уже говорил.



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


Опытный
**


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

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



source777
Цитата(source777 @  10.8.2008,  00:01 Найти цитируемый пост)
Пока да, можно ещё ввести абстрактный класс между интерфейсом и конкретными классами для общей реализации свойств... 
+ на схеме не отражена композиция в классе Window, о которой я уже говорил.

о Window ну да пока не сделал... По поводу абстрактного класса уже сделал.
source777,  Спасибо огромное за то что помогаете мне разобратся да и вспомнить что к чему! +
PM MAIL ICQ   Вверх
WaReZMEN
Дата 10.8.2008, 06:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



source777
Вот накидал побыстрому 
user posted image
Тока чесно не понимаю нафтга интерфеис использовать? 

 вот код

Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace WinConstructor
{    
    

    public interface IDrawable
    {
         int Width //Ширина
        { get;}

         int Height //Высота
        { get;}

         Point[] TopLeftPoint
        { get;}

         void Draw();
    }

    public class WindowFrame : WindowComponent
    {
    }

    public class Separator : WindowComponent
    {
    }

    public class Profile : WindowComponent
    {

    }

    public class Pane : WindowComponent
    {
    }

    public class Window : WindowComponent
    {
        private WindowFrame WinFrame;
        private List<Separator> SeparatorList = new List<Separator>();
        private List<Profile> ProfileList = new List<Profile>();
        private List<Pane> PaneList = new List<Pane>();
    }

    public abstract class WindowComponent : IDrawable
    {
        private int height;
        private int width;
        private Point[] topleftpoint;

        public int Height
        {
            get { return height; }
            set { height = value; }
        }

        public int Width
        {
            get { return width; }
            set { width = value; }
        }

        public Point[] TopLeftPoint
        {
            get { return topleftpoint; }
            set { topleftpoint = value; }
        }

        public void Draw()
        {
            throw new System.NotImplementedException();
        }
    }
}


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


Эксперт
***


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

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



Цитата
Тока чесно не понимаю нафтга интерфеис использовать? 
Ну интерфейсы обычно для повторного использования в разных проектах вводятся, если ничего похожего ты не планируешь делать, то можешь обойтись абстрактным классом.

P.S. Следующим шагом, спроектируй публичные методы своих классов и опиши их действия на псевдокоде, максимально детализируй псевдокод, но с учётом того, что псевдокод не зависит от языка программирования!


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


Опытный
**


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

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



source777
Цитата(source777 @  11.8.2008,  18:12 Найти цитируемый пост)
действия на псевдокоде, максимально детализируй псевдокод

Что имеется ввиду под псевдокодом?

Вот последняя диаграмма 
user posted image

Это сообщение отредактировал(а) WaReZMEN - 11.8.2008, 10:39
PM MAIL ICQ   Вверх
nagg
Дата 11.8.2008, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Рекоммендую почитать товарища Макконнелла с его "блокбастером"  - Совершенный Код (вопросы по типу "нафига интерфейс" отпадут сами собой)


ЗЫ: и про псевдокод там есть : )


Это сообщение отредактировал(а) nagg - 11.8.2008, 10:24
--------------------
I am the State...
PM MAIL WWW ICQ Skype   Вверх
WaReZMEN
Дата 11.8.2008, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



nagg, попобобнее де о
Цитата(nagg @  11.8.2008,  18:22 Найти цитируемый пост)
Макконнелла с его "блокбастером"  - Совершенный Код 


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


Эксперт
***


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

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



Цитата(WaReZMEN @  11.8.2008,  11:16 Найти цитируемый пост)
попобобнее де о
Стив Макконнелл "The Code Complete" оно же "Совершенный код", кстати список вопросов по качеству классов(см.выше), как раз оттуда smile

Цитата(WaReZMEN @  11.8.2008,  10:22 Найти цитируемый пост)
Что имеется ввиду под псевдокодом?
Запись алгоритма на естественном языке, в нашем случае, на русском. Описывать надо то, что будет делать код, а не как он это будет делать.


Это сообщение отредактировал(а) source777 - 11.8.2008, 12:27


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


Опытный
**


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

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



source777, это прям в редакторе тоесть какбы каментрий в классе?
так ?
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace WinConstructor
{    
    
 
    public class WindowFrame : WindowComponent
    {
        public  WindowFrame()
        {
            //Создание рамы
        }

        public void Draw(Graphics Canvas)
        {
            //рисование
        }
    }

    public class Separator : WindowComponent
    {
        public  Separator()
        {
            //Создание разделителя
        }

        public void Move()
        {
         //Перемещение расдилоителя
        }

        public void Draw(Graphics Canvas)
        {
            //рисование
        }
    }

    public class Profile : WindowComponent
    {

        public Profile()
        {
            //Создание профиля 
        }

        public void Draw(Graphics Canvas)
        {
            //Рисование
        }
    }

    public class Pane : WindowComponent
    {
        public  Pane()
        {
            //создание окна
        }

        public void Calc()
        {
          // Сдесь бутет расчет координат стекла с учетом раздилителеи и перемещения разделителя  
        }

        public void Draw(Graphics Canvas)
        {
            //Рисование стекла
        }
    }

    public class Window : WindowComponent //Главный класс
    {
        private WindowFrame WinFrame; 
        private List<Separator> SeparatorList = new List<Separator>();
        private List<Profile> ProfileList = new List<Profile>();
        private List<Pane> PaneList = new List<Pane>();

        public Window()
        { //Конструктор класса сдесь буте создоватся окно без разделителеи только рама и стекло
            this.Width = 100;
            this.Height = 200;
        }

        public void DropSeparator()
        {
            //Добовление разделителя он может быть горизонтальным и вертикальным
        }
    }

    public abstract class WindowComponent 
    {
        private int height;
        private int width;
        private Point topleftpoint;
        private bool select;

        public int Height
        {
            get { return height; }
            set { height = value; }
        }

        public int Width
        {
            get { return width; }
            set { width = value; }
        }

        public Point TopLeftPoint
        {
            get { return topleftpoint; }
            set { topleftpoint = value; }
        }

        public bool Selected
        {
            get { return select; }
            set { select = value; }
        }

        public void Draw(Graphics Canvas)
        {

        }
    }
}



Это сообщение отредактировал(а) WaReZMEN - 11.8.2008, 13:04
PM MAIL ICQ   Вверх
source777
Дата 11.8.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(WaReZMEN @  11.8.2008,  12:38 Найти цитируемый пост)
source777, это прям в редакторе тоесть какбы каментрий в классе?
так ?
Нет, не так. Теперь стало очевидно, что ты не умеешь писать комментарии... Пора учиться... Пиши псевдокод, который будет оставаться, после написания кода, в виде комментариев.

Пример:
Код

         public void Draw(Graphics Canvas)
        {
            // Создаём кисть для заливки и карандаш для обводки контура
            // Инициализируем их цвета свойствами рамы
            // Строим полигон, используя геометрические свойства рамы
            // Заливаем полигон рамы кистью заливки.
        }

........
позже псевдо-код превращается в реальный код, каждой строке псевдокода обычно соответствует 1-7 строк реального кода.
Код

         public void Draw(Graphics canvas)
        {
            // Создаём кисть для заливки и карандаш для обводки контура
            // Инициализируем их цвета свойствами рамы
            SolidBrush fillingBrush = new SolidBrush(this.FillingColor);
            Pen contourPen = new Pen(this.ContourColor);
            // Строим полигон, используя геометрические свойства рамы
            this.DrawPoligon(canvas, fillingBrush);
            // Заливаем полигон рамы кистью заливки.
            this.FillPoligon(canvas, contourPen);
        }

........
Псевдокод помог нам понять, что инициализировать кисти и карандаши жёлтым цветом бессмысленно и не нужно, а также что процедуры построения и заливки полигона лучше централизовать, и создав тем самым точку управления, вынести в базовый класс. Более того, мы видим, что сам метод Draw стал настолько ясным и универсальным, что и сам подлежит выносу в базовый класс как невиртуальный. Методы же DrawPoligon и FillPoligon следует сделать виртуальными.

P.S. Идея ясна? теперь пиши псевдокод для всех остальных методов... реальный код пока не пиши (ни в коем случае)!!!.


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


Опытный
**


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

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



Вот написал

Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace WinConstructor
{

    public enum Alignment //Для Профилеи и стекл
    {
        None = 0,
        Client = 1,
        Left = 2,
        Top = 3,
        Rigth = 4,
        Bottom = 5
    }

    public enum Orientation //Для разделителей (Импостов)
    {
        Horizontal = 100,
        Vertical = 101
    }

    public enum MouseState //Для мыши 
    {
        msNone = 0,
        msImpostHorizontal = 200,
        msImpostVertical = 201,
        msMouseDown = 202
    }
  
 
    public class WindowFrame : WindowComponent
    {
        private List<Profile> ProfileList = new List<Profile>();

        public  WindowFrame() //Создание рамы
        {
           // Задаем размеры рамы
           // Создаем 4 профиля           
        }
    }

    public class Separator : WindowComponent
    {
        public  Separator()
        {
            // Задаем радительское стекло
            // Задем координаты ценрта разделителя
            // Задаем тип разделителя
            // Задаем цвета заливки, карандаша и цвет выделенного разделителя
            // Расчитываем координаты разделителя
            // Добавляем разделитель в список
        }

        public void Move() // Перемещение расдилителя
        {
            // Определяем какой разделитель выделен 
            // Задаем новые координаты центра выделеного профиля
            // Пересчитываем координаты профиля
            // Пересчитываем координате смеждых стекл
           
        }
       
        override public void DrawPoligon(Graphics Canvas, SolidBrush FillingBrush)
        {
            // Определяем тип расделителя
            // Расчитываем координаты расделителя
            // Рисуем расделитель
        }

        override public void FillPoligon(Graphics Canvas, Pen BorderPen)
        {
            // Заливаем расделитель
            // Рисуем границу расделителя
        }
    }

    public class Profile : WindowComponent
    {

        public Profile()
        {
            // Задаём положения  профиля
            // Задаем цвета заливки, карандаша и цвет выделенного профиля
            // Запомнинаем радительскую раму
            // Расчитываем координаты профилей 
            // Добавляем профиль в список
        }

        override public void DrawPoligon(Graphics Canvas, SolidBrush FillingBrush)
        {
            // Определяем тип выравнивания
            // Расчитываем координаты профиля
            // Рисуем профиль
        }

        override public void FillPoligon(Graphics Canvas, Pen BorderPen)
        {
            // Заливаем профиль
            // Рисуем границу профиля
        }
    }

    public class Pane : WindowComponent
    {
        public Pane(Alignment PaneAlignment)
        {
            // Задаём выравнивание стекла 
            // Задаем цвета заливки, карандаша и цвет выделенного стекла
            // Запомнинаем радительскую раму
            // Расчитываем координаты стекла 
            // Добавляем стекло в список
        }

        override public void DrawPoligon(Graphics Canvas, SolidBrush FillingBrush)
        {
            // Определяем тип выравнивания
            // Расчитываем координаты стекла
            // Рисуем стекло
        }

        override public void FillPoligon(Graphics Canvas, Pen BorderPen)
        {
            // Заливаем стекло
            // Рисуем границу стекла
        }
    }

    public class Window : WindowComponent 
    {
        private WindowFrame WinFrame;
        private List<Separator> SeparatorList = new List<Separator>();
//        private List<Profile> ProfileList = new List<Profile>();//Решил перенести этот список в класс WindowFrame
        private List<Pane> PaneList = new List<Pane>();

        public Window()
        {  
            //Задаем размеры основной конструкций
            //Создаем раму
            //Создаем стекло
        }

        public void DropSeparator(Orientation ImpostOrientation)
        {
            //Передераем все стекла
            //Определяем какое стекло выделено
            //Создаем разделитель (Импост) превязаный к этому стеклу
            //Создаем еще два стекла родитель каторых выделеное стекло
            //Определяем тип разделителя (Вертикальный-горизонтальный)
        }
    }

    public abstract class WindowComponent 
    {
        private int height;
        private int width;
        private Point topleftpoint;
        private bool select;

        public int Height
        {
            get { return height; }
            set { height = value; }
        }

        public int Width
        {
            get { return width; }
            set { width = value; }
        }

        public Point TopLeftPoint
        {
            get { return topleftpoint; }
            set { topleftpoint = value; }
        }

        public bool Selected
        {
            get { return select; }
            set { select = value; }
        }

        public void Draw(Graphics Canvas)
        {
            // Создаём кисть для заливки и карандаш для обводки контура
            // Инициализируем их цвета свойствами рамы
            // Строим полигон, используя геометрические свойства рамы
            // Заливаем полигон рамы кистью заливки.            
        }

        virtual public void DrawPoligon(Graphics Canvas, SolidBrush FillingBrush)
        {
            // Расчет полигона и его рисование
        }

        virtual public void FillPoligon(Graphics Canvas, Pen BorderPen)
        {
            // Заливка полигона
        }
         
    }

Так теперь диаграма классов выглядит
user posted image

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


Эксперт
***


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

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



Цитата(WaReZMEN @  12.8.2008,  02:22 Найти цитируемый пост)
DropSeparator
Название метода предполагает, что он удаляет разделитель, что не согласуется с псевдокодом, надо чтобы согласовалось! либо переименовывай в AddSeparator, либо меняй псевдо-код.

В целом уже гораздо лучше, теперь следует выделить каждый класс в отдельный одноимённый файл, затем реализуй абстрактный класс и класс рамы. Кстати методы FillPoligon и DrawPoligon в абстрактном классе надо пометить как abstract, а не virtual... т.к. они на уровне абстрактного класса не могут иметь адекватной реализации.



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


Опытный
**


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

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



source777, Так сделал что дальше?
PM MAIL ICQ   Вверх
source777
Дата 12.8.2008, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ну если уверен в реализации, то реализуй остальные классы...


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


Опытный
**


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

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



source777
Вот реализайция абстрактного класса мне правда кажется нужно еще добавить масив с 4мя координатами для профилеи, стекл и перегоротки. А поповоду класса Рама его нет смысла деть без реализаций класса Профиль.
Код

    public abstract class WindowComponent
    {
        private int height;
        private int width;
        private Point topleftpoint;
        private bool select;
        private Color fillingcolor;
        private Color bordercolor;

        public int Height
        {
            get { return height; }
            set { height = value; }
        }

        public Color FillingColor
        {
            get { return fillingcolor; }
            set { fillingcolor = value; }
        }

        public Color BorderColor
        {
            get { return bordercolor; }
            set { bordercolor = value; }
        }

        public int Width
        {
            get { return width; }
            set { width = value; }
        }

        public Point TopLeftPoint
        {
            get { return topleftpoint; }
            set { topleftpoint = value; }
        }

        public bool Selected
        {
            get { return select; }
            set { select = value; }
        }

        public void Draw(Graphics Canvas)
        {
            // Создаём кисть для заливки и карандаш для обводки контура
            SolidBrush FillingBrush = new SolidBrush(this.FillingColor);
            Pen BorderPen = new Pen(this.BorderColor);
            // Строим полигон, используя геометрические свойства рамы
            this.DrawPoligon(Canvas, FillingBrush);
            // Заливаем полигон рамы кистью заливки. 
            this.FillPoligon(Canvas, BorderPen);
        }

        abstract public void DrawPoligon(Graphics Canvas, SolidBrush FillingBrush);


        abstract public void FillPoligon(Graphics Canvas, Pen BorderPen);

    }

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


Эксперт
***


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

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



Цитата(WaReZMEN @  12.8.2008,  13:27 Найти цитируемый пост)
мне правда кажется нужно еще добавить масив с 4мя координатами для профилеи, стекл и перегоротки.
Методы DrawPolygon и FillPolygon будут делегировать расчёт координат методу GetPolygonPoints(), который в свою очередь вернёт массив точек, сохранять этот массив нигде не надо. Кстати переименуй Poligon в Polygon... а то орфографическая ошибочка вышла.. smile 



Цитата(WaReZMEN @  12.8.2008,  13:27 Найти цитируемый пост)
А поповоду класса Рама его нет смысла деть без реализаций класса Профиль.
Ну и что тебя останавливает? кстати обоснуй связь этих классов. Ведь если рама - это лишь коллекция профилей и ничего больше, значит рамы нет! есть только коллекция профилей, а в этом случае сам класс рамы следует удалить согласно принципу "Бритва Оккама".



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


Опытный
**


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

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



source777, а можно сдесь поподробнее?

Цитата

Методы DrawPolygon и FillPolygon будут делегировать расчёт координат методу GetPolygonPoints(), который в свою очередь вернёт массив точек, сохранять этот массив нигде не надо.


Это сообщение отредактировал(а) WaReZMEN - 14.8.2008, 00:54
PM MAIL ICQ   Вверх
WaReZMEN
Дата 14.8.2008, 02:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот класс Профиль
Код

   public class Profile : WindowComponent
    {
        private Alignment profileAlign;
        private WindowFrame parent;

        public Profile(Alignment Align, WindowFrame Parent)
        {
            // Задаём положения  профиля
            this.profileAlign = Align;
            // Задаем цвета заливки, карандаша и цвет выделенного профиля
            this.BorderColor = Color.Black;
            this.FillingColor = Color.FromArgb(250, 250, 250);
            this.FillingSelectColor = Color.FromArgb(182, 209, 255);
            // Запомнинаем радительскую раму
            this.parent = Parent;            
            // Добавляем профиль в список
            this.parent.ProfileList.Add(this);
        }

        public override void DrawPolygon(Graphics Canvas, SolidBrush FillingBrush)
        {
            // Определяем тип выравнивания
            // Расчитываем координаты профиля
            // Рисуем профиль
        }

        public override void FillPolygon(Graphics Canvas, Pen BorderPen)
        {
            // Заливаем профиль
            // Рисуем границу профиля
        }
    }



Это сообщение отредактировал(а) WaReZMEN - 14.8.2008, 02:28
PM MAIL ICQ   Вверх
source777
Дата 14.8.2008, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(WaReZMEN @  14.8.2008,  02:28 Найти цитируемый пост)
            this.BorderColor = Color.Black;
            this.FillingColor = Color.FromArgb(250, 250, 250);
            this.FillingSelectColor = Color.FromArgb(182, 209, 255);
Что за магические числа? так не пойдёт!




Цитата(WaReZMEN @  13.8.2008,  10:20 Найти цитируемый пост)
а можно сдесь поподробнее?
Подробнее может быть лишь готовый код, а это ты должен сделать сам.



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


Опытный
**


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

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



source777
Цитата(source777 @  14.8.2008,  18:16 Найти цитируемый пост)
Что за магические числа? так не пойдёт!

Это цвета smile
Я не думаю что существует названия для всех цветов RGB smile. Или имелось ввиду что нужно сделать какието переменные???
PM MAIL ICQ   Вверх
source777
Дата 14.8.2008, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(WaReZMEN @  14.8.2008,  14:27 Найти цитируемый пост)
Или имелось ввиду что нужно сделать какието переменные??? 
Не переменные а константы, если это действительно константы! Запомни, в коде методов допустимо только два числа 0 и 1, никаких других чисел внутри методов быть не должно! Причём название константы должно означать её смысл, а не значение, поэтому Color.Black тоже не подойдёт!



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


Опытный
**


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

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



source777, а разве не понято из левои части

            this.BorderColor = Color.Black;
            this.FillingColor = Color.FromArgb(250, 250, 250);
            this.FillingSelectColor = Color.FromArgb(182, 209, 255);
Я конечно вынесу от с названиями этих цветов будут деиствительно проблемы smile
Спасибо что все еще расказываете что да как smile
PM MAIL ICQ   Вверх
mihryak
Дата 15.8.2008, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(source777 @  14.8.2008,  23:13 Найти цитируемый пост)
в коде методов допустимо только два числа 0 и 1, никаких других чисел внутри методов быть не должно! 

а я вот пополам делю порой, это смертельно?  smile

а с цветами я бы вместо констант
Код

private const int FillingColorRedValue = 250;
private const int FillingColorBlueValue = 250;
private const int FillingColorGreenValue = 250;

использовал всё же readonly
Код

private static readonly Color fillingColor = Color.FromArgb(250, 250, 250);

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


Эксперт
***


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

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



Цитата(mihryak @  15.8.2008,  00:50 Найти цитируемый пост)
а я вот пополам делю порой, это смертельно?  smile
нет конечно, естественно это утверждение было специально усилено для большего воспитательного эффекта. Изредка допустимы и другие числа, но лишь изредка.



Это сообщение отредактировал(а) source777 - 15.8.2008, 11:03


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


Intellectual feast
**


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

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



Цитата(source777 @  15.8.2008,  10:27 Найти цитируемый пост)
readonly следует использовать, если цвета считываются из настроек, иначе константу:

Вообще-то константами могут быть только примитивные типы, т.к. значение вычисляется при компиляции. В данном случае правильно использовать readonly.

Аккуратнее советуйте  smile 


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
source777
Дата 15.8.2008, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(QryStaL @  15.8.2008,  10:36 Найти цитируемый пост)
Аккуратнее советуйте  smile  
Спасибо за исправление.  smile 



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


Опытный
**


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

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



source777
Цитата(source777 @  12.8.2008,  21:56 Найти цитируемый пост)
Методы DrawPolygon и FillPolygon будут делегировать расчёт координат методу GetPolygonPoints(), который в свою очередь вернёт массив точек, сохранять этот массив нигде не надо. 


Если точки масива не где не сохранять то как я узнаю при выделение попал ли указатель мыши в заданый полигон????

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


Эксперт
***


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

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



Цитата(WaReZMEN @  17.8.2008,  23:46 Найти цитируемый пост)
Если точки масива не где не сохранять то как я узнаю при выделение попал ли указатель мыши в заданый полигон????

Спросишь у того объекта, который знает!


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


Новичок



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

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



source777, не могли бы Вы написать список книг по ООП и программированию вообще, которые Вы считаете просто обязательными для прочтения программисту?
Макконнелл, например, для меня упущение.

Это сообщение отредактировал(а) Ivan182 - 27.8.2008, 13:30
PM MAIL   Вверх
source777
Дата 27.8.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Ivan182 @  27.8.2008,  13:13 Найти цитируемый пост)
source777, не могли бы Вы написать список книг по ООП и программированию вообще, которые Вы считаете просто обязательными для прочтения программисту?

Я бы особо выделил следующие книги:
1) Совершенный код. Макконнелл
2) Рефакторинг... Фаулер
3) Приемы объектно-ориентированного проектирования... GoF
4) Применение DDD и шаблонов проектирования... Нильссон
5) Применение UML 2.0 и шаблонов проектирования. Ларман
6) Рефакторинг с использованием шаблонов. Кериевски
7) Архитектура корпоративных программных приложений. Фаулер

Также можно порекомендовать книги товарищей Гради Буч, Джеймс Рамбо, Ивар Якобсон по ООП и UML, хотя лично мне их стиль изложения не особо импонирует...
+ книги по алгоритмам (Кнут, Кормен)
+ позновательное ("Психбольница в руках пациентов" Купер, "Профессиональная разработка программного обеспечения" Макконнелл, etc.)


Этот список не столько обязательной(это разве что первые 3 книги) литературы, сколько желательной, т.к. чтобы прочитать всё что я тут указал нужен не 1 год внимательного чтения smile 
P.S. Я сам ещё не весь этот список осилил... smile 



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


Опытный
**


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

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



Цитата(source777 @  27.8.2008,  17:45 Найти цитируемый пост)
Совершенный код. Макконнелл

заказал smile


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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