Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Отрисовка фигуры в форме Windows по координатам из исходного файла

Кто может детально объяснить код и предложить варианты улучшения/оптимизации?
Задачи:
• Отрисовка фигуры в форме Windows по координатам из исходного файла
• Заливка внутренних и внешних фигур разными цветами
• Сохранение внутренних фигур в новый файл

Класс File
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Drawing;
 
namespace WindowsFormsApplication1
{
    static class File
    {
        public static int LengthKoor;
        public static int LengthPoints;
        public static int[,] FiguresPoints = new int[LengthPoints, 4];
        public static Point[] Koordinats;
        public static Figure[] GetFigures(string wayKoor, string wayPoints)
        {
            LengthKoor = 0 ;
            LengthPoints=0;
            StreamReader FKoordinats = new StreamReader(@wayKoor);
            StreamReader FFigures = new StreamReader(@wayPoints);
            string line;
            while(FKoordinats.ReadLine() != null)
            {
                LengthKoor++;
            }
            while (FFigures.ReadLine() != null)
            {
                LengthPoints++;
            }
            FFigures.Close();
            FKoordinats.Close();
            FKoordinats = new StreamReader(@wayKoor);
            FFigures = new StreamReader(@wayPoints);
            Figure[] Figures = new Figure[LengthPoints];
            Koordinats= new Point[LengthKoor];
            Koordinats = new Point[LengthKoor];
            for (int i = 0; (line = FKoordinats.ReadLine()) != null; i++)
            {
                int x;
                int y;
                string word = null;
                int k = 0;
                for (int j = 0; line[j] != ' '; j++)
                {
                    word += line[j];
                    k++;
                }
                x = Convert.ToInt32(word);
                word = "";
                for (int j = k + 1; j < line.Length; j++)
                {
                    word += line[j];
                }
                y = Convert.ToInt32(word);
                Koordinats[i] = new Point(x, y);
            }
            double Xmax = Koordinats[0].X;
            double Xmin = Koordinats[0].X;
            double Ymax = Koordinats[0].Y;
            double Ymin = Koordinats[0].Y;
            for (int i = 0; i < Koordinats.Length; i++)
            {
                if (Koordinats[i].X > Xmax) { Xmax = Koordinats[i].X; }
                if (Koordinats[i].X < Xmin) { Xmin = Koordinats[i].X; }
                if (Koordinats[i].Y > Ymax) { Ymax = Koordinats[i].Y; }
                if (Koordinats[i].Y < Ymin) { Ymin = Koordinats[i].Y; }
            }
            for (int i = 0; i < Koordinats.Length; i++)
            {
                double X = ((Koordinats[i].X) / (Xmax - Xmin)) * 640+25;
                double Y = (1-((Koordinats[i].Y) / (Ymax - Ymin)))*640+25;
                Koordinats[i].X = (int)X;
                Koordinats[i].Y = (int)Y;
            }
            int[,] FiguresPointsBuf = new int[LengthPoints, 4];
            for (int i = 0; (line = FFigures.ReadLine()) != null; i++)
            {
                string word = "";
                int k = -1;
                for (int j = 0; j < 4; j++)
                {
                    for (int t = ++k; line[t] != ' '; t++)
                    {
                        word += line[t];
                        k++;
                        if (k >= line.Length) break;
                    }
                    FiguresPointsBuf[i, j] = Convert.ToInt32(word);
                    word = "";
                }
                FiguresPoints = FiguresPointsBuf;
                if (FiguresPoints[i, 3] == -1)
                {
                    Figures[i] = new Triangle(Koordinats[FiguresPoints[i, 0]], Koordinats[FiguresPoints[i, 1]],
                        Koordinats[FiguresPoints[i, 2]]);
                }
                else
                {
                    Figures[i] = new Rectangle(Koordinats[FiguresPoints[i, 0]], Koordinats[FiguresPoints[i, 1]],
                        Koordinats[FiguresPoints[i, 2]], Koordinats[FiguresPoints[i, 3]]);
                }
            }
            FFigures.Close();
            FKoordinats.Close();
            return Figures;
        }
        public static void Save()
        {
            Figure[] Figures = File.GetFigures(Form1.wayKoor, Form1.wayPoints);
            StreamWriter FFigures = new StreamWriter(@"newFigures.txt");
            Figures = File.SetIntern(Figures);
            for (int i = 0; i < LengthPoints; i++)
            {
                if (Figures[i].intern)
                {
                    FFigures.WriteLine(FiguresPoints[i,0].ToString()+" "+FiguresPoints[i,1].ToString()+" "+FiguresPoints[i,2].ToString()+" "+FiguresPoints[i,3].ToString());
                }
            }
            FFigures.Close();
        }
        public static Figure[] SetIntern(Figure[] Figures)
        {
            for (int i = 0; i < FiguresPoints.GetLength(0); i++)
            {
                bool[] intern;
                int[] Figura1;
                if (FiguresPoints[i,3]==-1)
                {
                    Figura1 = new int[3] { FiguresPoints[i, 0], FiguresPoints[i, 1], FiguresPoints[i, 2] };
                    intern=new bool[3]{false,false,false};
                }
                else 
                {
                    Figura1 = new int[4] { FiguresPoints[i, 0], FiguresPoints[i, 1], FiguresPoints[i, 2], FiguresPoints[i,3] };
                    intern=new bool[4]{false,false,false,false};
                }
                for (int j = 0; j < Figura1.Length; j++)
                {
                    for (int k = 0; k < FiguresPoints.GetLength(0); k++)
                    {
                        int[] Figura2; 
                        if (FiguresPoints[k,3]==-1)
                        {
                            Figura2 = new int[3] { FiguresPoints[k, 0], FiguresPoints[k, 1], FiguresPoints[k, 2] };
                        }
                        else
                        {
                            Figura2 = new int[4] { FiguresPoints[k, 0], FiguresPoints[k, 1], FiguresPoints[k, 2], FiguresPoints[k,3] };
                        }
                        if (i != k)
                        {
                            for (int s = 0; s < Figura2.Length; s++)
                            {
                                {
                                    if ((Figura1[j] == Figura2[s] && Figura1[(j + 1) % Figura1.Length] == Figura2[(s + 1) % Figura2.Length]) || (Figura1[(j + 1) % Figura1.Length] == Figura2[s] && Figura1[j] == Figura2[(s + 1) % Figura2.Length]))
                                    {
                                        intern[j] = true;
                                    }
                                }
                            }
                        }
                    }
                }
                if (FiguresPoints[i, 3] == -1)
                {
                    Figures[i].intern = intern[0] && intern[1] && intern[2];
                }
                else
                {
                    Figures[i].intern = intern[0] && intern[1] && intern[2] && intern[3];
                }
            }
            return Figures;
        }
    }
}
Продолжение снизу.
Ответ: Класс Figure
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
 
namespace WindowsFormsApplication1
{
    public abstract class Figure
    {
        public bool intern;
        public Point MassCentr;
        public abstract void Show(System.Windows.Forms.PaintEventArgs e, int i);
        public abstract void FillShow(System.Windows.Forms.PaintEventArgs e);
        public abstract void GetMassCentr();
    }
}
 
Класс Triangle
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
 
namespace WindowsFormsApplication1
{
    public class Triangle : Figure
    {
        public Point p1;
        public Point p2;
        public Point p3;
        public Triangle()
        {
            p1 = new Point();
            p2 = new Point();
            p3 = new Point();
        }
        public Triangle(Point p1, Point p2, Point p3)
        {
            this.p1 = p1;
            this.p2 = p2;
            this.p3 = p3;
        }
        public Triangle(Triangle t)
        {
            this.p1 = t.p1;
            this.p2 = t.p2;
            this.p3 = t.p3;
        }
        public override void Show(System.Windows.Forms.PaintEventArgs e, int i)
        {
            Graphics g = e.Graphics;
            Pen p = new Pen(Color.Black, 3);
            Brush b = new SolidBrush(Color.Black);
            Font f = new Font("Arial", 20);
            g.DrawLine(p, p1, p2);
            g.DrawLine(p, p2, p3);
            g.DrawLine(p, p3, p1);
            GetMassCentr();
            g.DrawString(i.ToString(), f, b, MassCentr);
        }
        public override void FillShow(System.Windows.Forms.PaintEventArgs e)
        {
            Point[] Polygon = new Point[3] { p1, p2, p3 };
            SolidBrush b1;
            if (base.intern == false)
            {
                b1 = new SolidBrush(Color.Red);
            }
            else
            {
                b1 = new SolidBrush(Color.Green);
            }
            Graphics g = e.Graphics;
            g.FillPolygon(b1, Polygon);
        }
        public override void GetMassCentr()
        {
            base.MassCentr.X = (int)((p1.X + p2.X + p3.X) / 3);
            base.MassCentr.Y = (int)((p1.Y + p2.Y + p3.Y) / 3);
        }
    }
}
 
Класс Rectangle
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
 
namespace WindowsFormsApplication1
{
    public class Rectangle:Figure
    {
        public Point p1;
        public Point p2;
        public Point p3;
        public Point p4;
        public Rectangle()
        {
            p1 = new Point();
            p2 = new Point();
            p3 = new Point();
            p4 = new Point();
        }
        public Rectangle(Point p1,Point p2,Point p3,Point p4)
        {
            this.p1 = p1;
            this.p2 = p2;
            this.p3 = p3;
            this.p4 = p4;
        }
        public Rectangle(Rectangle r)
        {
            this.p1 = r.p1;
            this.p2 = r.p2;
            this.p3 = r.p3;
            this.p4 = r.p4;
        }
        public override void Show(System.Windows.Forms.PaintEventArgs e,int i)
        {
            Graphics g = e.Graphics;
            Pen p = new Pen(Color.Black, 3);
            Brush b = new SolidBrush(Color.Black);
            Font f = new Font("Arial",20);
            g.DrawLine(p, new Point(p1.X, p1.Y), new Point(p2.X, p2.Y));
            g.DrawLine(p, new Point(p2.X, p2.Y), new Point(p3.X, p3.Y));
            g.DrawLine(p, new Point(p3.X, p3.Y), new Point(p4.X, p4.Y));
            g.DrawLine(p, new Point(p4.X, p4.Y), new Point(p1.X, p1.Y));
            GetMassCentr();
            g.DrawString(i.ToString(),f,b,MassCentr);
        }
        public override void FillShow(System.Windows.Forms.PaintEventArgs e)
        {
            Point[] Polygon = new Point[4] { p1, p2, p3, p4 };
            SolidBrush b1;
            if (base.intern == false)
            {
                b1 = new SolidBrush(Color.Red);
            }
            else
            {
                b1 = new SolidBrush(Color.Green);
            }
            Graphics g = e.Graphics;
            g.FillPolygon(b1, Polygon);
        }
        public override void GetMassCentr()
        {
            base.MassCentr.X = (int)((p1.X + p2.X + p3.X + p4.X) / 4);
            base.MassCentr.Y = (int)((p1.Y + p2.Y + p3.Y + p4.Y) / 4);
        }
    }
}
Класс Form1
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public static string wayKoor, wayPoints;
        public Form1()
        {
            InitializeComponent();
        }
        bool Fill = false;
        Figure[] Figures = new Figure[File.LengthPoints];
 
        private void button1_Click(object sender, EventArgs e)
        {
            panel1.Visible = false;
            wayKoor = "Koordinats.txt";
            wayPoints = "Figures.txt";
            Figures = File.GetFigures(wayKoor, wayPoints);
            Figures = File.SetIntern(Figures);
            button3.Enabled = true;
            button4.Enabled = false;
        }
 
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            Pen p = new Pen(Color.Black, 6);
            Graphics g = e.Graphics;
            Brush b = new SolidBrush(Color.Blue);
            Font f = new Font("Arial", 14);
            for (int i = 0; i < File.LengthPoints; i++)
            {
                if (Fill)
                {
                    Figures[i].FillShow(e);
                }
                Figures[i].Show(e,i);
            }
            for (int i=0;i<File.LengthKoor;i++)
            {
                bool InEx = false;
                for (int k = 0; k < File.FiguresPoints.GetLength(0); k++)
                {
                    for (int s = 0; s < File.FiguresPoints.GetLength(1); s++)
                    {
                        if (i == File.FiguresPoints[k, s])
                        {
                            g.DrawEllipse(p, File.Koordinats[i].X - 1, File.Koordinats[i].Y - 1, 2, 2);
                            g.DrawString(i.ToString(), f, b, new Point(File.Koordinats[i].X - 26, File.Koordinats[i].Y - 20));
                            InEx = true;
                        }
                        if (InEx) { break; }
                    }
                    if (InEx) { break; }
                }
            }
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            panel1.Visible = true;
            Fill = false;
            panel1.Invalidate();
            button4.Enabled = true;
        }
 
        private void button4_Click(object sender, EventArgs e)
        {
            Fill = true;
            panel1.Invalidate();
            button5.Enabled = true;
        }
 
        private void button5_Click(object sender, EventArgs e)
        {
            File.Save();
            button2.Enabled = true;
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            panel1.Visible = false;
            wayKoor = "Koordinats.txt";
            wayPoints = "newFigures.txt";
            Figures = File.GetFigures(wayKoor, wayPoints);
            Figures = File.SetIntern(Figures);
            button4.Enabled = false;
        }
    }
}
Класс Program
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
Вопрос: как подключить namespace Windows?

в другом проекте вижу подключение:
using Windows.Devices.Enumeration;
using Windows.Devices.Enumeration.Pnp;
пробую подключить в свой проект - ругается на namespace Windows
Ответ: jenya7, тогда не надо нести чушь про удушение Windows 7. В каждой новой версии Windows появлялись новые API функции. Хочешь новый API - используй новый Windows или ищи open source замену.
Вопрос: Доступ к адресной книге (контакты Windows)

Ну т.е. что надо:
в программе кнопка <Адресная книга> или <Кому>.
При нажатии открывается стандартный диалог "Выбор получателей".
Здесь варианты:
справа есть поля MailTo,CC,BCC
либо например только поле MailTo
либо правых полей вообще нет.
(скриншоты приложил чтоб было понятно)
При нажатии на кнопку <OK> возвращается
например набор email (с именами) или несколько наборов соответствующих MailTo,CC и BCC
или например набор номеров телефонов (или факсов) соответствующих выбранным контактам.

В виндах эта техника используется например
в Почта Windows (Outlook Express) для выбора MailTo,CC,BCC при создании мыла (верхний скрин)
в Windows Fax and Scan (Microsoft Fax) для выбора номеров факсов (средний скрин), там же для выбора e-mail адреса(предполагается единственный адрес) куда слать мыло с уведомлением о доставке(нижний скрин).

Начиная с Vista контакты хранятся в
C:\Users\<Имя_пользователя>\Contacts
В XP техника хранения немного иная, но диалоговые окна и принцип выбора такой же (можно еще выбрать "группу контактов").

И я вот думаю как в эту кухню влезть. Интересует именно вывод стандартного окна выбора контактов и возврат желаемого результата.

Что-то подобное (выводить эти окна) в VB6 умела делать MSMAPI.OCX (Microsoft MAPI Controls 6.0),
но применительно к .Net не вариант (да и в VB6 не стал бы ее "таскать" за прогой, когда-то очень давно игрался просто),
да и не уверен что она реализует все желаемое (возврат номеров телефонов к примеру).

Есть вот такие напр. ссылки




Но там не классические API а "интерфейсы", и их программировать не из C++ это задница.
Причем не уверен что это то что надо, мне нужны не сами "контакты", а стандартные диалоги с возвратом результата.

К сообщению приложен файл. Размер - 122Kb
Ответ:
Изопропил
Дмитрий77,
не боишься "These interfaces will be unavailable in the future."?

Нет. У меня на это определенное чутье.
Аргумент еще: этот механизм использует напр. Microsoft Fax (ничего больше там быть не может),
они его с одной стороны никуда не уберут(недовольных много будет), да и переделывать с другой стороны не будут (кому нужны эти факсы).
Ту же "Почту Windows" (Program Files\Windows Mail) зачем-то тянут во все OS(в залоченном виде), значит зачем-то надо, иначе м.б. "все загнется".
Ну и папка "Контакты" вряд ли куда-то денется.
В стиле MS про все говорить что deprecated, но при этом тянуть все что наработано за годы из системы в систему.
Вопрос: Программирование форм Windows, C#

Всем доброго времени суток) Создаю программу для записей семейного бюджета на с# с помощью Windows Forms, нужна помощь... В код необходимо добавить следующее:
- возможность выбора файла при загрузке и сохранении, а на форму кнопку, которая будет обнулять данные;
- добавить в класс метод поиска наибольшего значения и его вывода, а на форму - кнопку для вызова этого метода;
- ещё один объект класса Fields, который будет отвечать за ведение сбережений,а на форму -элементы для вывода полей в текстовое окно и в файл.
Заранее спасибо)
Код

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;
using System.IO;
using System.Threading.Tasks;

namespace WindowsFormsApplication4
{
    public partial class frmFinance : Form
    {
        public frmFinance()
        {
            InitializeComponent();
        }
        static string[] sIncomeArticles = new string[] { "Осн.доход.мужа\t", "Осн.доход.жены\t", "Доп.доход.мужа\t", "Доп.доход.жены\t",
            "Подарки\t\t", "Соц.выплаты\t" };
        static string[] sExpenseArticles = new string[] { "Еда\t\t", "Жильё\t\t", "Одежда\t\t", "Транспорт\t", "Связь\t\t", "Обучение\t",
            "Развлечения\t", "Путешествия\t", "Благотворительность\t", "Прочее\t\t" };
        public class Fields
        {
            public int Rows, Columns = 32;
            public string[,] Articles = new string[50, 32];
            public Fields(int rows)
            {
                Rows = rows;
            }
            public void SetFirstColumn(string[] mas)
            {
                Articles[0, 0] = "Статья/День\t";
                for (int i = 1; i < Rows; i++)
                    Articles[i, 0] = mas[i - 1];
            }
            public void SetDayNumbers()
            {
                for (int i = 1; i <= Columns - 1; i++)
                    Articles[0, i] = Convert.ToString(i);
            }
            public string Output()
            {
                string str = "";
                for (int i = 0; i < Rows; i++)
                {
                    for (int j = 0; j < Columns; j++)
                    {
                        if (Articles[i, j] != null)
                            str = str + Articles[i, j] + " \t";
                        else
                            str = str + "- \t";
                    }
                    str = str + "\r\n";
                }
                return str;
            }
            public int SumOfElements()
            {
                int iSum = 0;
                for (int i = 1; i < Rows; i++)
                    for (int j = 1; j < Columns; j++)
                        if (Articles[i, j] != "" && Articles[i, j] != "-")
                            iSum = iSum + Convert.ToInt32(Articles[i, j]);
                return iSum;
            }
        }
        string TextBoxLine(string sIncome, string sAllIncome, string sExpense, string sAllExpense, string sDifference)
        {
            string str = "";
            str = "Доходы:\r\n" + sIncome;
            str = str + "Общий доход: " + sAllIncome + "\r\n\r\n";
            str = str + "Расходы:\r\n" + sExpense;
            str = str + "Общий расход: " + sAllExpense + "\r\n\r\n";
            str = str + "В наличии: " + sDifference;
            return str;
        }
        Fields Income = new Fields(sIncomeArticles.Length + 1);
        Fields Expense = new Fields(sExpenseArticles.Length + 1);
        private void Form1_Load(object sender, EventArgs e)
        {
            Income.SetFirstColumn(sIncomeArticles);
            Expense.SetFirstColumn(sExpenseArticles);
            Income.SetDayNumbers();
            Expense.SetDayNumbers();
            for (int i = 0; i < Income.Rows - 1; i++)
                cmbIncomeArticles.Items.Add(Income.Articles[i + 1, 0]);
            for (int i = 0; i < Expense.Rows - 1; i++)
                cmbExpenseArticles.Items.Add(Expense.Articles[i + 1, 0]);
            rtbOutput.Text = TextBoxLine(Income.Output(), Convert.ToString(Income.SumOfElements()),
                Expense.Output(), Convert.ToString(Expense.SumOfElements()),
                Convert.ToString(Income.SumOfElements() - Expense.SumOfElements()));
        }

        private void btnIncomeAdd_Click(object sender, EventArgs e)
        {
            if (cmbIncomeArticles.SelectedIndex != -1)
            {
                if (txtIncomeAdd.Text != "")
                {
                    if (Income.Articles[(cmbIncomeArticles.SelectedIndex + 1), Convert.ToInt32(numIncomeDay.Value)] != "-")
                        Income.Articles[(cmbIncomeArticles.SelectedIndex + 1), Convert.ToInt32(numIncomeDay.Value)] =
                        Convert.ToString(Convert.ToInt32(Income.Articles[(cmbIncomeArticles.SelectedIndex + 1),
                        Convert.ToInt32(numIncomeDay.Value)]) + Convert.ToInt32(txtIncomeAdd.Text));
                    else
                        Income.Articles[(cmbIncomeArticles.SelectedIndex + 1), Convert.ToInt32(numIncomeDay.Value)] = txtIncomeAdd.Text;
                    rtbOutput.Text = TextBoxLine(Income.Output(), Convert.ToString(Income.SumOfElements()),
                        Expense.Output(), Convert.ToString(Expense.SumOfElements()), Convert.ToString(Income.SumOfElements() - Expense.SumOfElements()));
                }
                else
                    MessageBox.Show("Введите значение дохода");
            }
            else
                MessageBox.Show("Выберите статью дохода");
        }

        private void btnExpenseAdd_Click(object sender, EventArgs e)
        {
            if (cmbExpenseArticles.SelectedIndex != -1)
            {
                if (txtExpenseAdd.Text != "")
                {
                    if (Expense.Articles[(cmbExpenseArticles.SelectedIndex + 1), Convert.ToInt32(numExpenseDay.Value)] != "-")
                        Expense.Articles[(cmbExpenseArticles.SelectedIndex + 1), Convert.ToInt32(numExpenseDay.Value)] =
                        Convert.ToString(Convert.ToInt32(Expense.Articles[(cmbExpenseArticles.SelectedIndex + 1),
                        Convert.ToInt32(numExpenseDay.Value)]) + Convert.ToInt32(txtExpenseAdd.Text));
                    else
                        Expense.Articles[(cmbExpenseArticles.SelectedIndex + 1), Convert.ToInt32(numExpenseDay.Value)] = txtExpenseAdd.Text;
                    rtbOutput.Text = TextBoxLine(Income.Output(), Convert.ToString(Expense.SumOfElements()),
                        Expense.Output(), Convert.ToString(Expense.SumOfElements()), Convert.ToString(Income.SumOfElements() - Expense.SumOfElements()));
                }
                else
                    MessageBox.Show("Введите значение расхода");
            }
            else
                MessageBox.Show("Выберите статью расхода");
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            FileStream fsFile = new FileStream("Семейные финансы.txt", FileMode.Create);
            StreamWriter fileWrite = new StreamWriter(fsFile);
            fileWrite.Write(TextBoxLine(Income.Output(), Convert.ToString(Income.SumOfElements()),
                Expense.Output(), Convert.ToString(Expense.SumOfElements()), Convert.ToString(Income.SumOfElements() - Expense.SumOfElements())));
            fileWrite.Close();
            MessageBox.Show("Данные сохранены в файл");
        }

        private void btnLoad_Click(object sender, EventArgs e)
        {
            FileStream fsFile = new FileStream("Семейные финансы.txt", FileMode.Open);
            try
            {
                using (StreamReader fileRead = new StreamReader(fsFile))
                {
                    string temp;
                    temp = fileRead.ReadLine();
                    for (int i = 0; i < Income.Rows; i++)
                    {
                        string[] separator = new string[] { " " };
                        string[] mas = new string[Income.Columns];
                        mas = fileRead.ReadLine().Split(separator, StringSplitOptions.None);
                        for (int j = 0; j < Income.Columns; i++)
                            Income.Articles[i, j] = mas[j].Trim(new char[] { '\t' });
                    }
                    temp = fileRead.ReadLine();
                    temp = fileRead.ReadLine();
                    temp = fileRead.ReadLine();
                    for (int i = 0; i < Expense.Rows; i++)
                    {
                        string[] separator = new string[] { " " };
                        string[] mas = new string[Expense.Columns];
                        mas = fileRead.ReadLine().Split(separator, StringSplitOptions.None);
                        for (int j = 0; j < Expense.Columns; j++)
                            Expense.Articles[i, j] = mas[j].Trim(new char[] { '\t' });
                    }
                    fileRead.Close();
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Файл не может быть прочитан");
            }
            Income.SetFirstColumn(sIncomeArticles);
            Expense.SetFirstColumn(sExpenseArticles);
            rtbOutput.Text = TextBoxLine(Income.Output(), Convert.ToString(Income.SumOfElements()),
                Expense.Output(), Convert.ToString(Expense.SumOfElements()), Convert.ToString(Income.SumOfElements() - 
                Expense.SumOfElements()));
            MessageBox.Show("Данные загружены из файла");
        }

        private void label4_Click(object sender, EventArgs e)
        {

        }

        private void label5_Click(object sender, EventArgs e)
        {

        }

        private void cmbExpenseArticles_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void numExpenseDay_ValueChanged(object sender, EventArgs e)
        {

        }
    }
}           

Ответ:
Всем доброго времени суток) Создаю программу для записей семейного бюджета на с# с помощью Windows Forms, нужна помощь... В код необходимо добавить следующее:
- возможность выбора файла при загрузке и сохранении, а на форму кнопку, которая будет обнулять данные;
- добавить в класс метод поиска наибольшего значения и его вывода, а на форму - кнопку для вызова этого метода;
- ещё один объект класса Fields, который будет отвечать за ведение сбережений,а на форму -элементы для вывода полей в текстовое окно и в файл.
Заранее спасибо)
Код

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;
using System.IO;
using System.Threading.Tasks;

namespace WindowsFormsApplication4
{
    public partial class frmFinance : Form
    {
        public frmFinance()
        {
            InitializeComponent();
        }
        static string[] sIncomeArticles = new string[] { "Осн.доход.мужа\t", "Осн.доход.жены\t", "Доп.доход.мужа\t", "Доп.доход.жены\t",
            "Подарки\t\t", "Соц.выплаты\t" };
        static string[] sExpenseArticles = new string[] { "Еда\t\t", "Жильё\t\t", "Одежда\t\t", "Транспорт\t", "Связь\t\t", "Обучение\t",
            "Развлечения\t", "Путешествия\t", "Благотворительность\t", "Прочее\t\t" };
        public class Fields
        {
            public int Rows, Columns = 32;
            public string[,] Articles = new string[50, 32];
            public Fields(int rows)
            {
                Rows = rows;
            }
            public void SetFirstColumn(string[] mas)
            {
                Articles[0, 0] = "Статья/День\t";
                for (int i = 1; i < Rows; i++)
                    Articles[i, 0] = mas[i - 1];
            }
            public void SetDayNumbers()
            {
                for (int i = 1; i <= Columns - 1; i++)
                    Articles[0, i] = Convert.ToString(i);
            }
            public string Output()
            {
                string str = "";
                for (int i = 0; i < Rows; i++)
                {
                    for (int j = 0; j < Columns; j++)
                    {
                        if (Articles[i, j] != null)
                            str = str + Articles[i, j] + " \t";
                        else
                            str = str + "- \t";
                    }
                    str = str + "\r\n";
                }
                return str;
            }
            public int SumOfElements()
            {
                int iSum = 0;
                for (int i = 1; i < Rows; i++)
                    for (int j = 1; j < Columns; j++)
                        if (Articles[i, j] != "" && Articles[i, j] != "-")
                            iSum = iSum + Convert.ToInt32(Articles[i, j]);
                return iSum;
            }
        }
        string TextBoxLine(string sIncome, string sAllIncome, string sExpense, string sAllExpense, string sDifference)
        {
            string str = "";
            str = "Доходы:\r\n" + sIncome;
            str = str + "Общий доход: " + sAllIncome + "\r\n\r\n";
            str = str + "Расходы:\r\n" + sExpense;
            str = str + "Общий расход: " + sAllExpense + "\r\n\r\n";
            str = str + "В наличии: " + sDifference;
            return str;
        }
        Fields Income = new Fields(sIncomeArticles.Length + 1);
        Fields Expense = new Fields(sExpenseArticles.Length + 1);
        private void Form1_Load(object sender, EventArgs e)
        {
            Income.SetFirstColumn(sIncomeArticles);
            Expense.SetFirstColumn(sExpenseArticles);
            Income.SetDayNumbers();
            Expense.SetDayNumbers();
            for (int i = 0; i < Income.Rows - 1; i++)
                cmbIncomeArticles.Items.Add(Income.Articles[i + 1, 0]);
            for (int i = 0; i < Expense.Rows - 1; i++)
                cmbExpenseArticles.Items.Add(Expense.Articles[i + 1, 0]);
            rtbOutput.Text = TextBoxLine(Income.Output(), Convert.ToString(Income.SumOfElements()),
                Expense.Output(), Convert.ToString(Expense.SumOfElements()),
                Convert.ToString(Income.SumOfElements() - Expense.SumOfElements()));
        }

        private void btnIncomeAdd_Click(object sender, EventArgs e)
        {
            if (cmbIncomeArticles.SelectedIndex != -1)
            {
                if (txtIncomeAdd.Text != "")
                {
                    if (Income.Articles[(cmbIncomeArticles.SelectedIndex + 1), Convert.ToInt32(numIncomeDay.Value)] != "-")
                        Income.Articles[(cmbIncomeArticles.SelectedIndex + 1), Convert.ToInt32(numIncomeDay.Value)] =
                        Convert.ToString(Convert.ToInt32(Income.Articles[(cmbIncomeArticles.SelectedIndex + 1),
                        Convert.ToInt32(numIncomeDay.Value)]) + Convert.ToInt32(txtIncomeAdd.Text));
                    else
                        Income.Articles[(cmbIncomeArticles.SelectedIndex + 1), Convert.ToInt32(numIncomeDay.Value)] = txtIncomeAdd.Text;
                    rtbOutput.Text = TextBoxLine(Income.Output(), Convert.ToString(Income.SumOfElements()),
                        Expense.Output(), Convert.ToString(Expense.SumOfElements()), Convert.ToString(Income.SumOfElements() - Expense.SumOfElements()));
                }
                else
                    MessageBox.Show("Введите значение дохода");
            }
            else
                MessageBox.Show("Выберите статью дохода");
        }

        private void btnExpenseAdd_Click(object sender, EventArgs e)
        {
            if (cmbExpenseArticles.SelectedIndex != -1)
            {
                if (txtExpenseAdd.Text != "")
                {
                    if (Expense.Articles[(cmbExpenseArticles.SelectedIndex + 1), Convert.ToInt32(numExpenseDay.Value)] != "-")
                        Expense.Articles[(cmbExpenseArticles.SelectedIndex + 1), Convert.ToInt32(numExpenseDay.Value)] =
                        Convert.ToString(Convert.ToInt32(Expense.Articles[(cmbExpenseArticles.SelectedIndex + 1),
                        Convert.ToInt32(numExpenseDay.Value)]) + Convert.ToInt32(txtExpenseAdd.Text));
                    else
                        Expense.Articles[(cmbExpenseArticles.SelectedIndex + 1), Convert.ToInt32(numExpenseDay.Value)] = txtExpenseAdd.Text;
                    rtbOutput.Text = TextBoxLine(Income.Output(), Convert.ToString(Expense.SumOfElements()),
                        Expense.Output(), Convert.ToString(Expense.SumOfElements()), Convert.ToString(Income.SumOfElements() - Expense.SumOfElements()));
                }
                else
                    MessageBox.Show("Введите значение расхода");
            }
            else
                MessageBox.Show("Выберите статью расхода");
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            FileStream fsFile = new FileStream("Семейные финансы.txt", FileMode.Create);
            StreamWriter fileWrite = new StreamWriter(fsFile);
            fileWrite.Write(TextBoxLine(Income.Output(), Convert.ToString(Income.SumOfElements()),
                Expense.Output(), Convert.ToString(Expense.SumOfElements()), Convert.ToString(Income.SumOfElements() - Expense.SumOfElements())));
            fileWrite.Close();
            MessageBox.Show("Данные сохранены в файл");
        }

        private void btnLoad_Click(object sender, EventArgs e)
        {
            FileStream fsFile = new FileStream("Семейные финансы.txt", FileMode.Open);
            try
            {
                using (StreamReader fileRead = new StreamReader(fsFile))
                {
                    string temp;
                    temp = fileRead.ReadLine();
                    for (int i = 0; i < Income.Rows; i++)
                    {
                        string[] separator = new string[] { " " };
                        string[] mas = new string[Income.Columns];
                        mas = fileRead.ReadLine().Split(separator, StringSplitOptions.None);
                        for (int j = 0; j < Income.Columns; i++)
                            Income.Articles[i, j] = mas[j].Trim(new char[] { '\t' });
                    }
                    temp = fileRead.ReadLine();
                    temp = fileRead.ReadLine();
                    temp = fileRead.ReadLine();
                    for (int i = 0; i < Expense.Rows; i++)
                    {
                        string[] separator = new string[] { " " };
                        string[] mas = new string[Expense.Columns];
                        mas = fileRead.ReadLine().Split(separator, StringSplitOptions.None);
                        for (int j = 0; j < Expense.Columns; j++)
                            Expense.Articles[i, j] = mas[j].Trim(new char[] { '\t' });
                    }
                    fileRead.Close();
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Файл не может быть прочитан");
            }
            Income.SetFirstColumn(sIncomeArticles);
            Expense.SetFirstColumn(sExpenseArticles);
            rtbOutput.Text = TextBoxLine(Income.Output(), Convert.ToString(Income.SumOfElements()),
                Expense.Output(), Convert.ToString(Expense.SumOfElements()), Convert.ToString(Income.SumOfElements() - 
                Expense.SumOfElements()));
            MessageBox.Show("Данные загружены из файла");
        }

        private void label4_Click(object sender, EventArgs e)
        {

        }

        private void label5_Click(object sender, EventArgs e)
        {

        }

        private void cmbExpenseArticles_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void numExpenseDay_ValueChanged(object sender, EventArgs e)
        {

        }
    }
}           

Вопрос: Установка "компонента Windows"/"Роли на сервере" программно

Если делать ручками:
Панель управления -> Программы -> Включение и отключение компонентов Windows

В окне Компоненты Windows:
Нашел компонент, проверил есть ли галка
Если нет, поставил нажал OK.
Ну и ждем, бывает долго, пока установится.

На Win сервере речь может идти об установки "роли сервера".
При этом также бывает нужно установить компонент(ы) от которого работоспособность устанавливаемого зависит.

Мне это надо сделать программно, желательно с "progress", ибо процесс как правило не быстрый.

Нечто подобное делал очень давно, но дальше XP/2003 метод никогда не работал
т.е. не актуально.
+
        Try
          Using file As System.IO.StreamWriter = _
           New System.IO.StreamWriter(IO.Path.Combine(temp_path, "ocm.txt"), _
           False, System.Text.Encoding.Default)
            file.WriteLine("[components]")
            file.WriteLine("<имя_компонента>=On")
          End Using
        Catch
        End Try
        ShellAndContinueNet("sysocmgr /i:" & IO.Path.Combine(windows_path, "inf\sysoc.inf") & " /u:" _
         & IO.Path.Combine(temp_path, "ocm.txt") & " /r", AppWinStyle.Hide)
        Try : IO.File.Delete(IO.Path.Combine(temp_path, "ocm.txt")) : Catch : End Try

(код вызывает системные окна, как бы я это делал из панели управления ручками и устанавливает <имя_компонента>.

Вот надо сие сделать для современных OS (начать хотя б с клиентской Win10, для сервера требуются "роли").
Да и лучше чтоб не через сомнительную cmd, хотя и это вариант.
Пока погуглив нашел:



cmd-вариант:


Оно?
Или есть еще какие варианты?
Что .Net говорит на эту тему?

Не повредил бы хороший пример без излишеств и лишних опций.
Т.е. надо сделать ровно то что я описал: "поставить галку на компонент" и "нажать OK", без указания образов, прообразов, хранилищ и т.п.
Если система захочет установочный CD, DVD, Windows Update, пусть сама это запрашивает и сама туда идет если сочтет нужным и т.д.
Ответ: Коль уж тему начал.
Но есть жирное НО. На Win7 не работает ключ /Enable-Feature /All при установке фичи (ни через API ни через Dism.exe -87 ошибка). Причем установка ADK как MS советует проблемы с /All не решает. Можно конечно извратиться, последовательно найти все ParentFeatures и доустановить поотдельности, но с учетом количества проблем стоит ли эту технику вообще иметь ввиду для 7-ки.

Осилил я этот момент. На Win7 рекурсивно вычисляем все неустановленные Parent фичи, и засовываем в строку через ";".
Не знаю насколько это важно, но Parent всегда раньше чем Child.
+
  Public Function Dism_GetWindowsFeatureFullList(ByRef err_text As String, ByVal FeatureName As String, _
   ByRef FeatureList As String, Optional ByVal bNotInstalledOnly As Boolean = False) As Integer

    'Возвращает строку фич FeatureList через ';', включая FeatureName и все Parent, причем Parent всегда стоит перед Child
    'bNotInstalledOnly -добавлять в строку только те фичи, которые еще не установлены

    Dim hr As Integer = S_OK

    Dim FeatureInfo As New DismFeatureInfo
    hr = Dism_GetWindowsFeatureInfo(err_text, FeatureName, FeatureInfo)
    If FAILED(hr) = False Then
      Dim Features() As DismFeature = Nothing
      hr = Dism_GetWindowsFeatureParentList(err_text, FeatureName, Features)
      If FAILED(hr) Then Return hr 'ошибок не допускаем
      ' теперь добавляем себя в самый конец
      If IsNothing(Features) Then
        ReDim Features(0 To 0)
        Debug.Print(FeatureInfo.FeatureName)
        Features(0).FeatureName = FeatureInfo.FeatureName
        Features(0).State = FeatureInfo.State
      Else
        For j As Integer = 0 To UBound(Features)
          If Features(j).FeatureName = FeatureInfo.FeatureName Then 'фича уже есть ранее в списке(теоретически может быть, хотя вряд ли)
            Debug.Print(FeatureInfo.FeatureName & " (skipped)")
            GoTo NoNeedToAdd
          End If
        Next
        ReDim Preserve Features(0 To UBound(Features) + 1)
        Debug.Print(FeatureInfo.FeatureName)
        Features(UBound(Features)).FeatureName = FeatureInfo.FeatureName
        Features(UBound(Features)).State = FeatureInfo.State
NoNeedToAdd:
      End If
      ' теперь составляем строку фич через ';', причем Parent всегда оказывается впереди child
      Debug.Print("Final list of features:")
      For i = 0 To UBound(Features)
        If bNotInstalledOnly AndAlso Features(i).State = DismPackageFeatureState.DismStateInstalled Then
          Debug.Print(Features(i).FeatureName & " (already installed)")
        Else
          Debug.Print(Features(i).FeatureName & " (OK)")
          FeatureList = AddUsingDelimiter(Features(i).FeatureName, FeatureList, ";")
        End If
      Next
    End If

    Return hr
  End Function

  Public Function Dism_GetWindowsFeatureParentList(ByRef err_text As String, ByVal FeatureName As String, _
   ByRef Features() As DismFeature) As Integer

    'Возвращает массив Features() всех Parent, Parent всегда стоит перед Child, работает рекурсивно
    'Одна и та же фича не может быть добавлена более одного раза

    Dim hr As Integer = S_OK

    Dim FeaturesParent() As DismFeature = Nothing
    hr = Dism_GetWindowsFeatureParent(err_text, FeatureName, FeaturesParent)
    If FAILED(hr) = False Then
      If IsNothing(FeaturesParent) = False Then
        For i As Integer = 0 To UBound(FeaturesParent)
          'сначала добавится родитель
          hr = Dism_GetWindowsFeatureParentList(err_text, FeaturesParent(i).FeatureName, Features)
          If FAILED(hr) Then Return hr 'ошибок не допускаем
          'потом добавляем себя (т.е. родитель в списке всегда стоит раньше child)
          If IsNothing(Features) Then
            ReDim Features(0 To 0)
            Debug.Print(FeaturesParent(i).FeatureName)
            Features(0) = FeaturesParent(i)
          Else
            For j As Integer = 0 To UBound(Features)
              If Features(j).FeatureName = FeaturesParent(i).FeatureName Then 'фича уже есть ранее в списке
                Debug.Print(FeaturesParent(i).FeatureName & " (skipped)")
                GoTo NoNeedToAdd
              End If
            Next
            ReDim Preserve Features(0 To UBound(Features) + 1)
            Debug.Print(FeaturesParent(i).FeatureName)
            Features(UBound(Features)) = FeaturesParent(i)
NoNeedToAdd:
          End If
        Next
      End If
    End If

    Return hr
  End Function

End Module

Строку эту подсовываем в без многократных вызовов (To enable more than one feature, separate each feature name with a semicolon.)
Параметр EnableAll ставим строго в False (Note LimitAccess, SourcePaths, SourcePathCount, and EnableAll are only supported on Windows 8 and Windows Server 2012.) Собственно в MSDN все сказано.

И походу DISM на Win7 таки уже родной tool (pkgmgr рисует Dism-овский лог).
Хотя надо делать SetEnvironmentVariable (+ "System32/CompatTel" в 'Path'), иначе dismapi.dll не найдет.

Ну вот собственно все. Тест-проект с учетом сказанного прикладываю.
Там подправил еще несколько глюков: 1) Видимо не стоит передавать Object в API вместо IntPtr 2) Callback имеет свойство частенько глючить(во всяком случае на Win7 x86, на новых x64 не замечено), это когда Current>Total, Value>Max в приаттаченном ProgressBar и краш обеспечен, это надо обрабатывать 3) Любая ошибка >0 в Dism-функциях не ошибка, всегда надо проверять на FAILED (т.е. <0) а не S_OK.

К сообщению приложен файл (WinFeatures.zip - 87Kb)
Вопрос: Не видит ключи при чтении из реестра windows.

привет
Что-то не могу прочитать ключ из реестра, приведённый ниже код возвращает val=null, хотя ключ точно есть такой в этой ветке реестра: RtHDVCpl типа REG_SZ:


            RegistryKey hklm = Registry.LocalMachine;
            RegistryKey hkSoftware = hklm.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run");
            string val = (string)hkSoftware.GetValue("RtHDVCpl");


А например ключи другой ветки - Software\Microsoft\Windows\CurrentVersion\Setup - успешно читает. Из-за чего может быть такое?
Ответ:
sql2012
может быть ПО ищет в этой ветке?
\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
это регулируется Access := KEY_WOW64_64KEY
Вопрос: Наследованиме классов в Windows Forms

Необходимо создать классы Персона, Студент, Преподаватель, Декан с методами определения факультета, на котором работает/учится персона, среднего балла и вычисление стипендии (для студента), преподает ли заданную дисциплину (для преподавателя и декана). Реализовать в Windows Forms.

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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
 
namespace nasledovanie
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        
       
        //класс для персоны
        class Person    
        {        
          string name_pers;
          int age;
        
            public Person(string n, int a)
           {
              base.name = name_pers;
              base.age = age;
           }
        }
       
 
        //класс для студента
        class Student : public Person
        {           
                private string name;  
                private int ball; 
                private string facultet; 
                private int stipendia; 
 
                public Student(string n, int b, string f, int s)
                {
                    name = n;
                    ball = b;
                    facultet = f;
                    stipendia = s;
                }          
        }
       
 
        //класс для декана
        class Dekan : public Person
        {
 
          string name_dek;
          int age_dek;
        
            public Dekan(string n, int a)
           {
              name_dek = n;
              age_dek = a;
           }
        }
 
 
 
      //класс для преподавателя
        class Prepod : public Person
        {
 
          string name_pr;
          int age_pr;
        
            public Prepod(string n, int a)
           {
              name_pr = n;
              age_pr = a;
           }
        }           
        
    } 
}
Добавлено через 17 часов 32 минуты
переделала немного код , подскажите, как дальше наследовать?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace nasled
{
 
    //класс для персоны
        class Person    
        {        
          private string name_pers;
       
             public Person(string n)
            {
              name_pers = n;
            }
             public void show()
             {
                 Console.WriteLine("Имя персоны: ({0})", name_pers);
             }
        }
       
 
        //класс для студента
        class Student : Person
        {           
                private string name_stud;  
                private int ball; 
                private string facultet; 
                private int stipendia;
 
                public Student(string n, int b, string f, int s): base(n)
                {
                    name_stud = n;
                    ball = b;
                    facultet = f;
                    stipendia = s;
                }
 
                public void show1()
                {
                    Console.WriteLine("Имя студента: ({0})", name_stud);
                    Console.WriteLine("Средний балл: ({0})", ball);
                    Console.WriteLine("Факультет: ({0})", facultet);
                    Console.WriteLine("Стипендия: ({0})", stipendia);
                }
        }
       
 
        //класс для декана
        class Dekan :  Person
        {
 
          private string name_dek;
          private string facultet; 
          private string disc;
        
            public Dekan(string n, string f, string d) : base(n)
           {
              name_dek = n;
              facultet = f; 
              disc = d;
           }
 
            public void show2()
            {
                Console.WriteLine("Имя декана: ({0})", name_dek);
                Console.WriteLine("Факультет: ({0})", facultet);
                Console.WriteLine("Дисциплина: ({0})", disc);
            }
        }
 
 
 
      //класс для преподавателя
        class Prepod :  Person
        {
 
          private string name_pr;
          private string facultet; 
          private string disc;
 
          public Prepod(string n, string f, string d) : base(n)
           {
              name_pr = n;
              facultet = f; 
              disc = d;
           }
 
          public void show3()
          {
              Console.WriteLine("Имя преподавателя: ({0})", name_pr);
              Console.WriteLine("Факультет: ({0})", facultet);
              Console.WriteLine("Дисциплина: ({0})", disc);
          }
        }
 
        
 
    class Program
    {
        static void Main(string[] args)
        {
         }
     }
}
Ответ: спасибо, буду разбираться) нет, уже не надо в Windows Forms, просто в консоле
Вопрос: Авторизация с Windows учеткой (Active Directory).

Java клиент+БД на сервере.
Есть задача: сделать в уже имеющемся приложении java сквозную авторизацию с Windows учеткой Active Directory.
Как я понимаю идея получить от Windows имя учетки Active Directory и далее уже сопоставляем с учеткой в приложении (через БД).

Вопрос как получить имя учетки Active Directory? Ссылки на готовые статьи с примерами приветствуются.
Ответ:
Dan_Irkutskiy
В гугле много статей для продвинутых. Вопрос от новичка.
БД-сервер и толстый клиент. Т.е. Java-клиент работает у конечного пользователя.
Никакого сервера приложения, tomcat и т.д. нет.

Это называется "двухзвенка" в простонародье.

Dan_Irkutskiy
Работа с БД уже есть.

Но что за движок БД используется сия тайна окутана мраком.

Dan_Irkutskiy
Нужно просто узнать что за человек залогинился в windows. Т.е. его учетку в АД.

System.getProperty("user.name");
Только к сквозной авторизации это отношения не имеет вообще никакого.
Вопрос: Паттерны и Windows Forms

Здравствуйте!
Мне нужно было по паттернам написать программу, но так вышло, что программа у меня появилась первой и теперь под неё нужно подогнать паттерны, но я не совсем понимаю как, потому что почти вся программа состоит из Windows Forms.
Есть одна форма "Главное меню", через которую запускаются остальные формы "Уровень 1...5", также есть форма со справкой, рекордами и доп. меню. Есть лишь 2 класса, где в 1-ом хранятся экземпляры музыки и методы их воспроизведения, которые используются во всех формах, а также класс по сохранению и изменению файлов с информацией о игроке, это используется лишь на уровнях и рекордах.
Подкиньте пожалуйста идеи, а там я постараюсь разобраться сам.
Кажется я понял, что здесь MVC паттерн будет для Windows Forms, а как можно к нему прикрепить другие 2 класса?
Ответ: Не знаю есть ли делегаты в Windows Forms, но там точно есть View-Model.
Я уже подогнал свое приложение под MVС.
Спасибо за проявление интереса к теме.
Вопрос: Создание ландшафта в 3D Windows Forms и сохранение в jpg

Здравствуйте, нужно сделать приложение для создания ландшафта по фотографии. Т.е. в него загружается файл и считываются данные в виде таблицы значений XYZ и из этих точек нужно в окне построить карту трехмерную. И также нужно сохранение карты в виде картинки jpg. с# и Windows Forms(можно с OpenGL). Буду благодарна за любую помощь: куски кода, статьи, видео. Обращаюсь потому что нет времени - нужно сделать работу в течении пары недель.
Ответ:
Сообщение от Nastia0701
Загружается 2D картинка справа, а получить в 3D
Так это называется карта высот, а не "картинка".

Сообщение от Nastia0701
Создание ландшафта в 3D Windows Forms
Используется воксельная графика, без OpenGL:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Numerics;
using System.Windows.Forms;
 
namespace WindowsFormsApplication317
{
    public partial class Form1 : Form
    {
        Bitmap result;//результирующее 3d изображение
        List<Voxel> voxels = new List<Voxel>();//список вокселей
        Vector3 lamp;//источник света
 
        TrackBar tbRoll;
        TrackBar tbPitch;
 
        float pitch = 0;
        float roll = 0;
 
        private const float SCALE_HEIGHT = 1 / 7f;
        private const float NORMAL_Y = 10;
 
        public Form1()
        {
            InitializeComponent();
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
 
            //источник света
            lamp = Vector3.Normalize(new Vector3(-1, 1, -1));
 
            //загружаем карту высот
            using (var heightMap = (Bitmap) Bitmap.FromFile(AppDomain.CurrentDomain.BaseDirectory + "heightmap.png"))
            {
                //создаем обертку для быстрого доступа к пикселам
                using (var wr = new ImageWrapper(heightMap))
                {
                    //читаем карту высот, формируем воксели
                    foreach (var p in wr)
                    if(p.X > 0 && p.Y > 0)
                    {
                        //высота
                        var height = wr[p].G;
                        //высота в соседних точках
                        var h1 = wr[p.X - 1, p.Y].G;
                        var h2 = wr[p.X, p.Y - 1].G;
                        //считаем градиент
                        var dx = height - h1;
                        var dy = height - h2;
                        //считаем нормаль
                        var n = new Vector3(dx, NORMAL_Y, dy);
                        n = Vector3.Normalize(n);
                        //считаем свет
                        var light = (int)(Vector3.Dot(n, lamp) * 255);
                        if (light < 0) light = 0;
                        if (light > 255) light = 255;
                        //создаем воксель
                        var voxel = new Voxel {Pos = new Vector3(p.X, height * SCALE_HEIGHT, p.Y), Normal = n, Light = light};
                        voxels.Add(voxel);
                    }
                }
 
                //создаем результирующее изображение
                result = new Bitmap(heightMap.Width, heightMap.Height);
            }
 
            //задаем размер формы
            Size = new Size(result.Width, 4 * result.Height / 5 + 60);
            BackColor = Color.Black;
 
            //создаем трекбары
            tbRoll = new TrackBar { Parent = this, Maximum = 180, Left = 10, Value = 0, Minimum = -180, Width = 200 };
            tbPitch = new TrackBar { Parent = this, Maximum = 240, Left = 220, Value = 200, Minimum = 180, Width = 200};
 
            tbRoll.ValueChanged += tb_ValueChanged;
            tbPitch.ValueChanged += tb_ValueChanged;
 
            tb_ValueChanged(null, EventArgs.Empty);
        }
 
        void tb_ValueChanged(object sender, EventArgs e)
        {
            pitch = (float)(tbPitch.Value * Math.PI / 180);
            roll = (float)(tbRoll.Value * Math.PI / 180);
 
            Invalidate();
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            //матрицы вращения
            var rotateM0 = Matrix4x4.CreateRotationY(roll);
            var rotateM = Matrix4x4.CreateFromYawPitchRoll(0, pitch, 0);
 
            //матрица переноса
            var position = new Vector3(result.Width / 2f, 0, result.Height / 2f);
            var translateM = Matrix4x4.CreateTranslation(position);
            var translateM0 = Matrix4x4.CreateTranslation(-1 * position);
 
            //матрица смещения относительно экрана
            var screenM = Matrix4x4.CreateTranslation(new Vector3(0, result.Height / 2f, 0));
 
            //результирующая матрица
            var m = translateM0 * rotateM0 * rotateM * translateM * screenM;
            
            //рендерим модель
            Render(m);
 
            //отрисовываем
            e.Graphics.DrawImage(result, new PointF(0, 60));
        }
 
        private void Render(Matrix4x4 worldMatrix)
        {
            using (var wr = new ImageWrapper(result))
            foreach (var v in voxels)
            {
                //переводим в мировые координаты
                var p = Vector3.Transform(v.Pos, worldMatrix);
                var intX = (int) p.X;
                var intY = (int) p.Y;
                //цвет
                var color = Color.FromArgb(v.Light, v.Light, v.Light);
                //заносим в изображение
                wr[intX, intY + 1] = wr[intX, intY] = color;
            }
        }
 
        protected override void OnDoubleClick(EventArgs e)
        {
            var sfd = new SaveFileDialog() {Title = "Сохранение 3D изображения", Filter = "Image|*.png"};
            if (sfd.ShowDialog() == DialogResult.OK)
                result.Save(sfd.FileName);
        }
    }
 
    struct Voxel
    {
        public Vector3 Pos;
        public Vector3 Normal;
        public int Light;
    }
}
Под .NET FW 4.6 или выше.
Для оптимального быстродействия - компилировать под Release, по CTRL+F5.
Сохранение изображения - по даблклику на форме.