Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22

Как сделать код красивее?

24.06.2017, 20:02. Показов 2521. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Pascal
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
  ///Graph's class
  Graph = class
  public 
    ///Set of all edges
    Edges: set of GEdge;
  
  private 
    pS, pS2: Style;
    
    function EdgeStyleOptionsRead()  := pS;
    procedure EdgeStyleOptionsWrite(v: Style);
    begin
      pS := v;
      foreach var edge in Edges do edge.StyleOptions := v;
    end;
    
    function PointStyleOptionsRead()  := pS2;
    procedure PointStyleOptionsWrite(v: Style);
    begin
      pS2 := v;
      foreach var edge in Edges do begin edge.A.StyleOptions := v; edge.B.StyleOptions := v; end;
    end;
  
  public 
    
    ///Object's style (for edges)
    property EdgeStyleOptions: Style read EdgeStyleOptionsRead write EdgeStyleOptionsWrite;
    ///Object's style (for points)
    property PointStyleOptions: Style read PointStyleOptionsRead write PointStyleOptionsWrite;
    
    ///Addes new edge to graph.
    procedure Add(e1: GEdge);begin Include(Edges, e1); end;
    
    ///Removes edge from graph.
    procedure Del(e1: GEdge);begin Exclude(Edges, e1); end;
    
    ///Addes new edge to graph. [The edge is created immediately.]
    procedure NewEdge(x, y, x1, y1: integer);
    var
      E1: GEdge;
    begin
      E1 := new GEdge();
      E1.NewPoints();
      E1.A.X := x;E1.A.Y := y;E1.B.X := x1;E1.B.Y := y1;
      E1.A.NewStyle();E1.B.NewStyle();
      E1.NewStyle();
      Add(E1);
    end;
    
    ///Addes new edge to graph. [The edge is created immediately.]
    procedure NewEdge(x, y, x1, y1: integer; S1, S2: Style);
    var
      E1: GEdge;
    begin
      E1 := new GEdge();
      E1.NewPoints();
      E1.A.X := x;E1.A.Y := y;E1.B.X := x1;E1.B.Y := y1;
      E1.A.StyleOptions := S1;E1.B.StyleOptions := S1;
      E1.StyleOptions := S2;
      Add(E1);
    end;
    
    ///Draws graph.
    procedure Draw();
    begin
      foreach var edge in Edges do edge.Draw();
    end;
    
    ///Draws graph with all points.
    procedure DrawWith();
    var
      p: set of GPoint;
    begin
      Draw();
      foreach var edge in Edges do begin Include(p, edge.A);Include(p, edge.B); end;
      foreach var point in p do point.Draw();
    end;
    
    ///Appends to full graph.
    procedure FullGraph();
    begin
      
    end;
    
    constructor ();begin end;
  end;
Не нравится то, что public повторяется 2 раза. Можно улучшить код в этом плане?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.06.2017, 20:02
Ответы с готовыми решениями:

Как сделать кнопки красивее?
Есть элемент ToolBar, на нем у меня находится несколько кнопок, посоветуйте как сделать их не просто кнопками, а кнопками с картинкой ?...

Как сделать программу красивее?
Вот написал программу на Java, и хочу штоб внешне она выглядела немного получше, вот только не знаю как можно пристроить в программу што то...

Как это можно сделать красивее?
uint8_t sommomd = 0x55; uint16_t u16Temp = 0; u16Temp = GPIO_ReadOutputData(GPIOA)&0xFF00; u16Temp |= sommomd; GPIO_Write(GPIOA,...

22
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
24.06.2017, 20:23
Цитата Сообщение от Volobuev Ilya Посмотреть сообщение
Не нравится то, что public повторяется 2 раза
Так перенеси
Pascal
1
2
    ///Set of all edges
    Edges: set of GEdge;
под 24-ю строку. Порядок определения не важен, это не модуль, а класс.

Добавлено через 1 минуту
P.S. Чтобы улучшать код - нужно видеть его полностью, а не какой-то его кусок, который даже не компилируется.
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
24.06.2017, 20:29  [ТС]
Pascal
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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
unit Graph2;
 
uses GraphABC;
type
  ///Style-object
  Style = class
  private 
    pC, pC2: Color;
    pS: integer;
    
    function StylePenColorRead()  := pC;
    procedure StylePenColorWrite(v: Color) := pC := v;
    
    function StyleBrushColorRead()  := pC2;
    procedure StyleBrushColorWrite(v: Color) := pC2 := v;
    
    function SizeRead()  := pS;
    procedure SizeWrite(v: integer) := pS := v;
  
  public 
    ///Color (pen)
    property StylePenColor: Color read StylePenColorRead write StylePenColorWrite;
    ///Color (brush)
    property StyleBrushColor: Color read StyleBrushColorRead write StyleBrushColorWrite;
    ///Size
    property Size: integer read SizeRead write SizeWrite;
    
    ///Copies style's options from another style-object.
    procedure CopyFrom(s: Style);begin StylePenColor := s.StylePenColor;StyleBrushColor := s.StyleBrushColor;Size := s.Size; end;
    
    ///Resets style's options to standart.
    procedure Reset();begin StylePenColor := clBlack;StyleBrushColor := clWhite;Size := 1; end;
    
    ///Applies style's options to pen's settings.
    procedure Apply();begin SetPenColor(StylePenColor);SetBrushColor(StyleBrushColor);SetPenWidth(Size); end;
    
    constructor ();begin Reset(); end;
  end;
  
  
  ///Point's class
  GPoint = class
  private 
    pX, pY, pR: integer;
    pS: Style;
    function XRead()  := pX;
    procedure XWrite(v: integer) := pX := v;
    
    function YRead()  := pY;
    procedure YWrite(v: integer) := pY := v;
    
    function RRead()  := pR;
    procedure RWrite(v: integer) := pR := v;
    
    function StyleOptionsRead()  := pS;
    procedure StyleOptionsWrite(v: Style) := pS := v;
  
  public 
    
    ///X coordinate
    property X: integer read XRead write XWrite;
    ///Y coordinate
    property Y: integer read YRead write YWrite;
    ///Radius
    property R: integer read RRead write RWrite;
    ///Object's style
    property StyleOptions: Style read StyleOptionsRead write StyleOptionsWrite;
    
    ///Copies coordinates from another point.
    procedure CopyFrom(p: GPoint);begin X := p.X;Y := p.Y; end;
    
    ///Set X and Y to 0; R to 1.
    procedure SetZero();begin X := 0;Y := 0;R := 1; end;
    
    ///Draws point.
    procedure Draw();begin StyleOptions.Apply();FillCircle(X, Y, R);DrawCircle(X, Y, R); end;
    
    ///Initialize style-object.
    procedure NewStyle();begin StyleOptions := new Style(); end;
    
    constructor ();begin SetZero(); end;
  end;
  
  ///Edge's class
  GEdge = class
  private 
    pA, pB: GPoint;
    pS: Style;
    
    function ARead()  := pA;
    procedure AWrite(v: GPoint) := pA := v;
    
    function BRead()  := pB;
    procedure BWrite(v: GPoint) := pB := v;
    
    function StyleOptionsRead()  := pS;
    procedure StyleOptionsWrite(v: Style) := pS := v;
  public 
    ///Point "A"
    property A: GPoint read ARead write AWrite;
    ///Point "B"
    property B: GPoint read BRead write BWrite;
    ///Object's style
    property StyleOptions: Style read StyleOptionsRead write StyleOptionsWrite;
    
    ///Draws edge.
    procedure Draw();begin StyleOptions.Apply();Line(A.X, A.Y, B.X, B.Y); end;
    
    ///Draws edge with A and B points.
    procedure DrawWith();begin StyleOptions.Apply();Line(A.X, A.Y, B.X, B.Y);A.Draw();B.Draw(); end;
    
    ///Initialize two new points. [It is necessary, if there are no points yet.]
    procedure NewPoints();begin A := new GPoint();B := new GPoint(); end;
    
    ///Initialize style-object.
    procedure NewStyle();begin StyleOptions := new Style(); end;
    
    constructor ();begin end;
  end;
  
  ///Graph's class
  Graph = class
  private 
    pS, pS2: Style;
    
    function EdgeStyleOptionsRead()  := pS;
    procedure EdgeStyleOptionsWrite(v: Style);
    begin
      pS := v;
      foreach var edge in Edges do edge.StyleOptions := v;
    end;
    
    function PointStyleOptionsRead()  := pS2;
    procedure PointStyleOptionsWrite(v: Style);
    begin
      pS2 := v;
      foreach var edge in Edges do begin edge.A.StyleOptions := v; edge.B.StyleOptions := v; end;
    end;
  
  public 
    ///Set of all edges
    Edges: set of GEdge;
    
    ///Object's style (for edges)
    property EdgeStyleOptions: Style read EdgeStyleOptionsRead write EdgeStyleOptionsWrite;
    ///Object's style (for points)
    property PointStyleOptions: Style read PointStyleOptionsRead write PointStyleOptionsWrite;
    
    ///Addes new edge to graph.
    procedure Add(e1: GEdge);begin Include(Edges, e1); end;
    
    ///Removes edge from graph.
    procedure Del(e1: GEdge);begin Exclude(Edges, e1); end;
    
    ///Addes new edge to graph. [The edge is created immediately.]
    procedure NewEdge(x, y, x1, y1: integer);
    var
      E1: GEdge;
    begin
      E1 := new GEdge();
      E1.NewPoints();
      E1.A.X := x;E1.A.Y := y;E1.B.X := x1;E1.B.Y := y1;
      E1.A.NewStyle();E1.B.NewStyle();
      E1.NewStyle();
      Add(E1);
    end;
    
    ///Addes new edge to graph. [The edge is created immediately.]
    procedure NewEdge(x, y, x1, y1: integer; S1, S2: Style);
    var
      E1: GEdge;
    begin
      E1 := new GEdge();
      E1.NewPoints();
      E1.A.X := x;E1.A.Y := y;E1.B.X := x1;E1.B.Y := y1;
      E1.A.StyleOptions := S1;E1.B.StyleOptions := S1;
      E1.StyleOptions := S2;
      Add(E1);
    end;
    
    ///Draws graph.
    procedure Draw();
    begin
      foreach var edge in Edges do edge.Draw();
    end;
    
    ///Draws graph with all points.
    procedure DrawWith();
    var
      p: set of GPoint;
    begin
      Draw();
      foreach var edge in Edges do begin Include(p, edge.A);Include(p, edge.B); end;
      foreach var point in p do point.Draw();
    end;
    
    constructor ();begin end;
  end;
end.
Добавлено через 2 минуты
begin end писал везде для единообразия. Хотя, может и не надо было.
0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,370
25.06.2017, 13:23
начни с форматирования кода, одна строка - один оператор, шарфы читать никому не интересно!
Используй приставки T для классов, А для аргументов F для полей.
используй оператор with
Не используй сокращения, все имена должны быть лаконичными и понятными
Используй деструктор для освобождения памяти!
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
25.06.2017, 14:08
Лучший ответ Сообщение было отмечено Volobuev Ilya как решение

Решение

Цитата Сообщение от vlisp Посмотреть сообщение
Используй деструктор для освобождения памяти!
Это в .NET с его автосборкой мусора - деструктор?
Цитата Сообщение от vlisp Посмотреть сообщение
Используй приставки T для классов, А для аргументов F для полей.
Это дельфийский codestyle, в .NET есть свой, почему нужно придерживаться именно Дельфийского, если в этом компиляторе все завязано на фишках .NET-а?


Цитата Сообщение от Volobuev Ilya Посмотреть сообщение
Можно улучшить код в этом плане?
Лучше модифицировать код, избавившись от ненужных геттеров/сеттеров при описании property. Если геттер ничего не делает, а только возвращает значение - он не нужен. То же самое касается и сеттера. Итого:


Pascal
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
  ///Style-object
  Style = class
  private 
    pC, pC2: Color;
    pS: integer;
    
    function StylePenColorRead()  := pC;
    procedure StylePenColorWrite(v: Color) := pC := v;
    
    function StyleBrushColorRead()  := pC2;
    procedure StyleBrushColorWrite(v: Color) := pC2 := v;
    
    function SizeRead()  := pS;
    procedure SizeWrite(v: integer) := pS := v;
  
  public 
    ///Color (pen)
    property StylePenColor: Color read StylePenColorRead write StylePenColorWrite;
    ///Color (brush)
    property StyleBrushColor: Color read StyleBrushColorRead write StyleBrushColorWrite;
    ///Size
    property Size: integer read SizeRead write SizeWrite;
    
    ///Copies style's options from another style-object.
    procedure CopyFrom(s: Style);begin StylePenColor := s.StylePenColor;StyleBrushColor := s.StyleBrushColor;Size := s.Size; end;
    
    ///Resets style's options to standart.
    procedure Reset();begin StylePenColor := clBlack;StyleBrushColor := clWhite;Size := 1; end;
    
    ///Applies style's options to pen's settings.
    procedure Apply();begin SetPenColor(StylePenColor);SetBrushColor(StyleBrushColor);SetPenWidth(Size); end;
    
    constructor ();begin Reset(); end;
  end;
становится
Pascal
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
  ///Style-object
  Style = class
  private 
    pC, pC2: Color;
    pS: integer;
    
  public 
    ///Color (pen)
    property StylePenColor: Color read pc write pc;
    ///Color (brush)
    property StyleBrushColor: Color read pc2 write pc2;
    ///Size
    property Size: integer read ps write ps;
    
    ///Copies style's options from another style-object.
    procedure CopyFrom(s: Style);
    begin 
        StylePenColor := s.StylePenColor;StyleBrushColor := s.StyleBrushColor;Size := s.Size; 
    end;
    
    ///Resets style's options to standart.
    procedure Reset();
    begin 
        StylePenColor := clBlack;StyleBrushColor := clWhite;Size := 1;
    end;
    
    ///Applies style's options to pen's settings.
    procedure Apply();
    begin 
        SetPenColor(StylePenColor);SetBrushColor(StyleBrushColor);SetPenWidth(Size); 
    end;
    
    constructor ();
    begin 
        Reset();
    end;
  end;
Ну и так далее почти везде.
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
25.06.2017, 16:27  [ТС]
Pascal
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
179
180
181
182
183
184
185
186
187
188
189
190
191
  ///Graph's class
  Graph = class
  private 
    pS, pS2: Style;
    pcount: integer;
    
    function EdgeStyleOptionsRead()  := pS;
    procedure EdgeStyleOptionsWrite(v: Style);
    begin
      pS := v;
      foreach var edge in Edges do edge.StyleOptions := v; //Неожиданно начал ругаться, что не знает Edges
    end;
    
    function PointStyleOptionsRead()  := pS2;
    procedure PointStyleOptionsWrite(v: Style);
    begin
      pS2 := v;
      foreach var edge in Edges do begin edge.A.StyleOptions := v;edge.B.StyleOptions := v; end;
    end;
    
    function CountRead(): integer;
    var
      c: integer;
    begin
      c := 0;
      foreach var p in Points do Inc(c);
      CountRead := c;
    end;
    
    procedure CountWrite(v: integer);
    var
      c: integer;
    begin
      c := 0;
      if v < CountRead then
        foreach var p in Points do
        begin
          if c > v then DelP(P);
          Inc(c);
        end;
    end;
  
  public 
    ///Set of all edges
    Edges: set of GEdge;
    
    ///Object's style (for edges)
    property EdgeStyleOptions: Style read EdgeStyleOptionsRead write EdgeStyleOptionsWrite;
    ///Object's style (for points)
    property PointStyleOptions: Style read PointStyleOptionsRead write PointStyleOptionsWrite;
    ///Count
    property Count: integer read CountRead write CountWrite;
    
    ///Addes new edge to graph.
    procedure Add(e1: GEdge);begin Include(Edges, e1); end;
    
    ///Removes edge from graph.
    procedure Del(e1: GEdge);begin Exclude(Edges, e1); end;
    
    ///Addes new edge to graph. [The edge is created immediately.]
    procedure NewEdge(x, y, x1, y1: integer);
    var
      E1: GEdge;
    begin
      E1 := new GEdge();
      E1.NewPoints();
      E1.A.X := x;E1.A.Y := y;E1.B.X := x1;E1.B.Y := y1;
      E1.A.NewStyle();E1.B.NewStyle();
      E1.NewStyle();
      Add(E1);
    end;
    
    ///Addes new edge to graph. [The edge is created immediately.]
    procedure NewEdge(x, y, x1, y1: integer; S1, S2: Style);
    var
      E1: GEdge;
    begin
      E1 := new GEdge();
      E1.NewPoints();
      E1.A.X := x;E1.A.Y := y;E1.B.X := x1;E1.B.Y := y1;
      E1.A.StyleOptions := S1;E1.B.StyleOptions := S1;
      E1.StyleOptions := S2;
      Add(E1);
    end;
    
    ///Draws graph.
    procedure Draw();
    begin
      foreach var edge in Edges do edge.Draw();
    end;
    
    ///Returns all points in graph.
    function Points(): set of GPoint;
    var
      p: set of GPoint;
    begin
      foreach var edge in Edges do begin Include(p, edge.A);Include(p, edge.B); end;
      Points := p;
    end;
    
    ///Draws graph with all points.
    procedure DrawWith();
    begin
      Draw();
      foreach var point in Points do point.Draw();
    end;
    
    ///Returns True if the edge with the same points exists.
    function Edge(A, B: GPoint): boolean;
    var
      t: boolean;
    begin
      t := false;
      foreach var edge in Edges do
        if (edge.A = A) and (edge.B = B) then begin t := true;break; end;
      Edge := t;
    end;
    
    ///Appends to full graph.
    procedure FullGraph();
    var
      E1: GEdge;
    begin
      foreach var point in Points do
        foreach var point2 in Points do
          if not Edge(point, point2) and (point <> point2) then
          begin
            E1 := new GEdge();
            E1.A := point;E1.B := point2;E1.NewStyle;
            Add(E1);
          end;
    end;
    
    ///Removes point and all edges those are linked to this point.
    procedure DelP(p: GPoint);
    var
      edges2: set of GEdge;
    begin
      foreach var edge in Edges do
        if not ((edge.A = p) or (edge.B = p)) then Include(edges2, Edge);
      Edges := edges2;
    end;
    
    ///Returns environment of the point.
    function Environment(p: GPoint): set of GPoint;
    var
      pts: set of GPoint;
    begin
      foreach var edge in Edges do
        if (edge.A = p) then Include(pts, Edge.B) else Include(pts, Edge.A);
      Environment := pts;
    end;
    
    ///Reproduces point.
    procedure ReproduceP(p: GPoint; x, y: integer);
    var
      E1: GEdge;
      rpoint: GPoint;
    begin
      rpoint := new GPoint();rpoint.CopyFrom(p);rpoint.X += x;rpoint.Y += y;
      foreach var point in Environment(p) do
      begin
        E1 := new GEdge();
        E1.A := point;E1.B := rpoint;
        Add(E1);
      end;
    end;
    
    ///Returns True if graph has loops.
    function HasLoop(): boolean;
    var
      t: boolean;
    begin
      t := false;
      foreach var edge in Edges do
        if edge.A = edge.B then begin t := true;break; end;
      HasLoop := t;
    end;
    
    ///Replaces first point with another one.
    procedure Replace(p, p2: GPoint);
    begin
      foreach var edge in Edges do
      begin
        if edge.A = p then edge.A := p2;
        if edge.B = p then edge.B := p2;
      end;
    end;
    
    constructor ();begin end;
  end;
Добавлено через 37 секунд
Count - нужно для управления количествами вершин. Используя свойство, чтобы можно было сокращать количество вершин графа.

Добавлено через 7 минут
Pascal
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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
unit Graph2;
 
uses GraphABC;
type
  ///Style-object
  Style = class
  private 
    pC, pC2: Color;
    pS: integer;
    
    function StylePenColorRead()  := pC;
    procedure StylePenColorWrite(v: Color) := pC := v;
    
    function StyleBrushColorRead()  := pC2;
    procedure StyleBrushColorWrite(v: Color) := pC2 := v;
    
    function SizeRead()  := pS;
    procedure SizeWrite(v: integer) := pS := v;
  
  public 
    ///Color (pen)
    property StylePenColor: Color read StylePenColorRead write StylePenColorWrite;
    ///Color (brush)
    property StyleBrushColor: Color read StyleBrushColorRead write StyleBrushColorWrite;
    ///Size
    property Size: integer read SizeRead write SizeWrite;
    
    ///Copies style's options from another style-object.
    procedure CopyFrom(s: Style);begin StylePenColor := s.StylePenColor;StyleBrushColor := s.StyleBrushColor;Size := s.Size; end;
    
    ///Resets style's options to standart.
    procedure Reset();begin StylePenColor := clBlack;StyleBrushColor := clWhite;Size := 1; end;
    
    ///Applies style's options to pen's settings.
    procedure Apply();begin SetPenColor(StylePenColor);SetBrushColor(StyleBrushColor);SetPenWidth(Size); end;
    
    constructor ();begin Reset(); end;
  end;
  
  
  ///Point's class
  GPoint = class
  private 
    pX, pY, pR: integer;
    pS: Style;
    function XRead()  := pX;
    procedure XWrite(v: integer) := pX := v;
    
    function YRead()  := pY;
    procedure YWrite(v: integer) := pY := v;
    
    function RRead()  := pR;
    procedure RWrite(v: integer) := pR := v;
    
    function StyleOptionsRead()  := pS;
    procedure StyleOptionsWrite(v: Style) := pS := v;
  
  public 
    
    ///X coordinate
    property X: integer read XRead write XWrite;
    ///Y coordinate
    property Y: integer read YRead write YWrite;
    ///Radius
    property R: integer read RRead write RWrite;
    ///Object's style
    property StyleOptions: Style read StyleOptionsRead write StyleOptionsWrite;
    
    ///Copies coordinates from another point.
    procedure CopyFrom(p: GPoint);begin X := p.X;Y := p.Y; end;
    
    ///Set X and Y to 0; R to 1.
    procedure SetZero();begin X := 0;Y := 0;R := 1; end;
    
    ///Draws point.
    procedure Draw();begin StyleOptions.Apply();FillCircle(X, Y, R);DrawCircle(X, Y, R); end;
    
    ///Initialize style-object.
    procedure NewStyle();begin StyleOptions := new Style(); end;
    
    constructor ();begin SetZero(); end;
  end;
  
  ///Edge's class
  GEdge = class
  private 
    pA, pB: GPoint;
    pS: Style;
    
    function ARead()  := pA;
    procedure AWrite(v: GPoint) := pA := v;
    
    function BRead()  := pB;
    procedure BWrite(v: GPoint) := pB := v;
    
    function StyleOptionsRead()  := pS;
    procedure StyleOptionsWrite(v: Style) := pS := v;
  public 
    ///Point "A"
    property A: GPoint read ARead write AWrite;
    ///Point "B"
    property B: GPoint read BRead write BWrite;
    ///Object's style
    property StyleOptions: Style read StyleOptionsRead write StyleOptionsWrite;
    
    ///Draws edge.
    procedure Draw();begin StyleOptions.Apply();Line(A.X, A.Y, B.X, B.Y); end;
    
    ///Draws edge with A and B points.
    procedure DrawWith();begin StyleOptions.Apply();Line(A.X, A.Y, B.X, B.Y);A.Draw();B.Draw(); end;
    
    ///Initialize two new points. [It is necessary, if there are no points yet.]
    procedure NewPoints();begin A := new GPoint();B := new GPoint(); end;
    
    ///Initialize style-object.
    procedure NewStyle();begin StyleOptions := new Style(); end;
    
    constructor ();begin end;
  end;
  
  ///Graph's class
  Graph = class
  private 
    pS, pS2: Style;
    pcount: integer;
    
    function EdgeStyleOptionsRead()  := pS;
    procedure EdgeStyleOptionsWrite(v: Style);
    begin
      pS := v;
      foreach var edge in Edges do edge.StyleOptions := v;
    end;
    
    function PointStyleOptionsRead()  := pS2;
    procedure PointStyleOptionsWrite(v: Style);
    begin
      pS2 := v;
      foreach var edge in Edges do begin edge.A.StyleOptions := v;edge.B.StyleOptions := v; end;
    end;
    
    function CountRead(): integer;
    var
      c: integer;
    begin
      c := 0;
      foreach var p in Points do Inc(c);
      CountRead := c;
    end;
    
    procedure CountWrite(v: integer);
    var
      c: integer;
    begin
      c := 0;
      if v < CountRead then
        foreach var p in Points do
        begin
          if c > v then DelP(P);
          Inc(c);
        end;
    end;
  
  public 
    ///Set of all edges
    Edges: set of GEdge;
    
    ///Object's style (for edges)
    property EdgeStyleOptions: Style read EdgeStyleOptionsRead write EdgeStyleOptionsWrite;
    ///Object's style (for points)
    property PointStyleOptions: Style read PointStyleOptionsRead write PointStyleOptionsWrite;
    ///Count
    property Count: integer read CountRead write CountWrite;
    
    ///Addes new edge to graph.
    procedure Add(e1: GEdge);begin Include(Edges, e1); end;
    
    ///Removes edge from graph.
    procedure Del(e1: GEdge);begin Exclude(Edges, e1); end;
    
    ///Addes new edge to graph. [The edge is created immediately.]
    procedure NewEdge(x, y, x1, y1: integer);
    var
      E1: GEdge;
    begin
      E1 := new GEdge();
      E1.NewPoints();
      E1.A.X := x;E1.A.Y := y;E1.B.X := x1;E1.B.Y := y1;
      E1.A.NewStyle();E1.B.NewStyle();
      E1.NewStyle();
      Add(E1);
    end;
    
    ///Addes new edge to graph. [The edge is created immediately.]
    procedure NewEdge(x, y, x1, y1: integer; S1, S2: Style);
    var
      E1: GEdge;
    begin
      E1 := new GEdge();
      E1.NewPoints();
      E1.A.X := x;E1.A.Y := y;E1.B.X := x1;E1.B.Y := y1;
      E1.A.StyleOptions := S1;E1.B.StyleOptions := S1;
      E1.StyleOptions := S2;
      Add(E1);
    end;
    
    ///Draws graph.
    procedure Draw();
    begin
      foreach var edge in Edges do edge.Draw();
    end;
    
    ///Returns all points in graph.
    function Points(): set of GPoint;
    var
      p: set of GPoint;
    begin
      foreach var edge in Edges do begin Include(p, edge.A);Include(p, edge.B); end;
      Points := p;
    end;
    
    ///Draws graph with all points.
    procedure DrawWith();
    begin
      Draw();
      foreach var point in Points do point.Draw();
    end;
    
    ///Returns True if the edge with the same points exists.
    function Edge(A, B: GPoint): boolean;
    var
      t: boolean;
    begin
      t := false;
      foreach var edge in Edges do
        if (edge.A = A) and (edge.B = B) then begin t := true;break; end;
      Edge := t;
    end;
    
    ///Appends to full graph.
    procedure FullGraph();
    var
      E1: GEdge;
    begin
      foreach var point in Points do
        foreach var point2 in Points do
          if not Edge(point, point2) and (point <> point2) then
          begin
            E1 := new GEdge();
            E1.A := point;E1.B := point2;E1.NewStyle;
            Add(E1);
          end;
    end;
    
    ///Removes point and all edges those are linked to this point.
    procedure DelP(p: GPoint);
    var
      edges2: set of GEdge;
    begin
      foreach var edge in Edges do
        if not ((edge.A = p) or (edge.B = p)) then Include(edges2, Edge);
      Edges := edges2;
    end;
    
    ///Returns environment of the point.
    function Environment(p: GPoint): set of GPoint;
    var
      pts: set of GPoint;
    begin
      foreach var edge in Edges do
        if (edge.A = p) then Include(pts, Edge.B) else Include(pts, Edge.A);
      Environment := pts;
    end;
    
    ///Reproduces point.
    procedure ReproduceP(p: GPoint; x, y: integer);
    var
      E1: GEdge;
      rpoint: GPoint;
    begin
      rpoint := new GPoint();rpoint.CopyFrom(p);rpoint.X += x;rpoint.Y += y;
      foreach var point in Environment(p) do
      begin
        E1 := new GEdge();
        E1.A := point;E1.B := rpoint;
        Add(E1);
      end;
    end;
    
    ///Returns True if graph has loops.
    function HasLoop(): boolean;
    var
      t: boolean;
    begin
      t := false;
      foreach var edge in Edges do
        if edge.A = edge.B then begin t := true;break; end;
      HasLoop := t;
    end;
    
    ///Replaces first point with another one.
    procedure Replace(p, p2: GPoint);
    begin
      foreach var edge in Edges do
      begin
        if edge.A = p then edge.A := p2;
        if edge.B = p then edge.B := p2;
      end;
    end;
    
    constructor ();begin end;
  end;
end.
Не понимаю, почему он начал ругаться? Все же шло нормально
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
25.06.2017, 17:41  [ТС]
Вот исправленный код (с учетом сказанного про сеттеры и геттеры):
Pascal
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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
unit Graph2;
 
uses GraphABC;
type
  ///Style-object
  Style = class
  private 
    pC, pC2: Color;
    pS: integer;
  
  public 
    ///Color (pen)
    property StylePenColor: Color read pC write pC;
    ///Color (brush)
    property StyleBrushColor: Color read pC2 write PC2;
    ///Size
    property Size: integer read pS write pS;
    
    ///Copies style's options from another style-object.
    procedure CopyFrom(s: Style);begin StylePenColor := s.StylePenColor;StyleBrushColor := s.StyleBrushColor;Size := s.Size; end;
    
    ///Resets style's options to standart.
    procedure Reset();begin StylePenColor := clBlack;StyleBrushColor := clWhite;Size := 1; end;
    
    ///Applies style's options to pen's settings.
    procedure Apply();begin SetPenColor(StylePenColor);SetBrushColor(StyleBrushColor);SetPenWidth(Size); end;
    
    constructor ();begin Reset(); end;
  end;
  
  
  ///Point's class
  GPoint = class
  private 
    pX, pY, pR: integer;
    pS: Style;
  
  public 
    
    ///X coordinate
    property X: integer read pX write pX;
    ///Y coordinate
    property Y: integer read pY write pY;
    ///Radius
    property R: integer read pR write pR;
    ///Object's style
    property StyleOptions: Style read pS write pS;
    
    ///Copies coordinates from another point.
    procedure CopyFrom(p: GPoint);begin X := p.X;Y := p.Y; end;
    
    ///Set X and Y to 0; R to 1.
    procedure SetZero();begin X := 0;Y := 0;R := 1; end;
    
    ///Draws point.
    procedure Draw();begin StyleOptions.Apply();FillCircle(X, Y, R);DrawCircle(X, Y, R); end;
    
    ///Initialize style-object.
    procedure NewStyle();begin StyleOptions := new Style(); end;
    
    constructor ();begin SetZero(); end;
  end;
  
  ///Edge's class
  GEdge = class
  private 
    pA, pB: GPoint;
    pS: Style;
    
  public 
    ///Point "A"
    property A: GPoint read pA write pA;
    ///Point "B"
    property B: GPoint read pB write pB;
    ///Object's style
    property StyleOptions: Style read pS write pS;
    
    ///Draws edge.
    procedure Draw();begin StyleOptions.Apply();Line(A.X, A.Y, B.X, B.Y); end;
    
    ///Draws edge with A and B points.
    procedure DrawWith();begin StyleOptions.Apply();Line(A.X, A.Y, B.X, B.Y);A.Draw();B.Draw(); end;
    
    ///Initialize two new points. [It is necessary, if there are no points yet.]
    procedure NewPoints();begin A := new GPoint();B := new GPoint(); end;
    
    ///Initialize style-object.
    procedure NewStyle();begin StyleOptions := new Style(); end;
    
    constructor ();begin end;
  end;
  
  ///Graph's class
  Graph = class
  private 
    pS, pS2: Style;
    pcount: integer;
    
    procedure EdgeStyleOptionsWrite(v: Style);
    begin
      pS := v;
      foreach var edge in Edges do edge.StyleOptions := v;
    end;
    
    procedure PointStyleOptionsWrite(v: Style);
    begin
      pS2 := v;
      foreach var edge in Edges do begin edge.A.StyleOptions := v;edge.B.StyleOptions := v; end;
    end;
    
    function CountRead(): integer;
    var
      c: integer;
    begin
      c := 0;
      foreach var p in Points do Inc(c);
      CountRead := c;
    end;
    
    procedure CountWrite(v: integer);
    var
      c: integer;
    begin
      c := 0;
      if v < CountRead then
        foreach var p in Points do
        begin
          if c > v then DelP(P);
          Inc(c);
        end;
    end;
  
  public 
    ///Set of all edges
    Edges: set of GEdge;
    
    ///Object's style (for edges)
    property EdgeStyleOptions: Style read pS write EdgeStyleOptionsWrite;
    ///Object's style (for points)
    property PointStyleOptions: Style read pS2 write PointStyleOptionsWrite;
    ///Count
    property Count: integer read CountRead write CountWrite;
    
    ///Addes new edge to graph.
    procedure Add(e1: GEdge);begin Include(Edges, e1); end;
    
    ///Removes edge from graph.
    procedure Del(e1: GEdge);begin Exclude(Edges, e1); end;
    
    ///Addes new edge to graph. [The edge is created immediately.]
    procedure NewEdge(x, y, x1, y1: integer);
    var
      E1: GEdge;
    begin
      E1 := new GEdge();
      E1.NewPoints();
      E1.A.X := x;E1.A.Y := y;E1.B.X := x1;E1.B.Y := y1;
      E1.A.NewStyle();E1.B.NewStyle();
      E1.NewStyle();
      Add(E1);
    end;
    
    ///Addes new edge to graph. [The edge is created immediately.]
    procedure NewEdge(x, y, x1, y1: integer; S1, S2: Style);
    var
      E1: GEdge;
    begin
      E1 := new GEdge();
      E1.NewPoints();
      E1.A.X := x;E1.A.Y := y;E1.B.X := x1;E1.B.Y := y1;
      E1.A.StyleOptions := S1;E1.B.StyleOptions := S1;
      E1.StyleOptions := S2;
      Add(E1);
    end;
    
    ///Draws graph.
    procedure Draw();
    begin
      foreach var edge in Edges do edge.Draw();
    end;
    
    ///Returns all points in graph.
    function Points(): set of GPoint;
    var
      p: set of GPoint;
    begin
      foreach var edge in Edges do begin Include(p, edge.A);Include(p, edge.B); end;
      Points := p;
    end;
    
    ///Draws graph with all points.
    procedure DrawWith();
    begin
      Draw();
      foreach var point in Points do point.Draw();
    end;
    
    ///Returns True if the edge with the same points exists.
    function Edge(A, B: GPoint): boolean;
    var
      t: boolean;
    begin
      t := false;
      foreach var edge in Edges do
        if (edge.A = A) and (edge.B = B) then begin t := true;break; end;
      Edge := t;
    end;
    
    ///Appends to full graph.
    procedure FullGraph();
    var
      E1: GEdge;
    begin
      foreach var point in Points do
        foreach var point2 in Points do
          if not Edge(point, point2) and (point <> point2) then
          begin
            E1 := new GEdge();
            E1.A := point;E1.B := point2;E1.NewStyle;
            Add(E1);
          end;
    end;
    
    ///Removes point and all edges those are linked to this point.
    procedure DelP(p: GPoint);
    var
      edges2: set of GEdge;
    begin
      foreach var edge in Edges do
        if not ((edge.A = p) or (edge.B = p)) then Include(edges2, Edge);
      Edges := edges2;
    end;
    
    ///Returns environment of the point.
    function Environment(p: GPoint): set of GPoint;
    var
      pts: set of GPoint;
    begin
      foreach var edge in Edges do
        if (edge.A = p) then Include(pts, Edge.B) else Include(pts, Edge.A);
      Environment := pts;
    end;
    
    ///Reproduces point.
    procedure ReproduceP(p: GPoint; x, y: integer);
    var
      E1: GEdge;
      rpoint: GPoint;
    begin
      rpoint := new GPoint();rpoint.CopyFrom(p);rpoint.X += x;rpoint.Y += y;
      foreach var point in Environment(p) do
      begin
        E1 := new GEdge();
        E1.A := point;E1.B := rpoint;
        Add(E1);
      end;
    end;
    
    ///Returns True if graph has loops.
    function HasLoop(): boolean;
    var
      t: boolean;
    begin
      t := false;
      foreach var edge in Edges do
        if edge.A = edge.B then begin t := true;break; end;
      HasLoop := t;
    end;
    
    ///Replaces first point with another one.
    procedure Replace(p, p2: GPoint);
    begin
      foreach var edge in Edges do
      begin
        if edge.A = p then edge.A := p2;
        if edge.B = p then edge.B := p2;
      end;
    end;
    
    constructor ();begin end;
  end;
end.
Добавлено через 1 час 7 минут
Строка 102: Неизвестное имя "Edges".
0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,370
25.06.2017, 18:08
Цитата Сообщение от volvo Посмотреть сообщение
Это дельфийский codestyle, в .NET есть свой, почему нужно придерживаться именно Дельфийского, если в этом компиляторе все завязано на фишках .NET-а?
Чтоб потом не пучеглазить в ошибки! по поводу деструктора может ты и прав, но сдается мне не все так просто...
0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,370
25.06.2017, 18:10
Цитата Сообщение от Volobuev Ilya Посмотреть сообщение
Строка 102: Неизвестное имя "Edges".
В этом классе нет Edges
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
25.06.2017, 18:12  [ТС]
Чтоб потом не пучеглазить в ошибки! по поводу деструктора может ты и прав, но сдается мне не все так просто...
Зачем так резко? У каждого языка свой синтаксис. У Delphi он иной, чем в .Net. Если Вы привыкли работать в Delphi, то, убедительная просьба, не пытаться навязывать в .Net стиль Delphi.

Добавлено через 1 минуту
По моему есть:
Pascal
1
2
///Set of all edges
Edges: set of GEdge;
Добавлено через 19 секунд
Строка 135
0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,370
25.06.2017, 18:17
Цитата Сообщение от Volobuev Ilya Посмотреть сообщение
Зачем так резко? У каждого языка свой синтаксис.
речь идет не о синтаксисе языка, а о манере написания програм, предполагающей наименьшее количество ошибок. Компилятору ведь все равно, как ты назовешь класс, метод, свойство, переменную. Но если у тебя возникают проблемы с пониманием или ошибки, то значит не все так складно ты придумал. Более того, чтоб и другие могли воспользоваться твоим кодом или помочь тебе с твоим, нужно следовать общепринятым тенденциям. Так что определись, или ты просишь помощи и внимаешь, либо остаешься один на один со своим кодом.
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
25.06.2017, 18:20  [ТС]
речь идет не о синтаксисе языка, а о манере написания програм, предполагающей наименьшее количество ошибок. Компилятору ведь все равно, как ты назовешь класс, метод, свойство, переменную. Но если у тебя возникают проблемы с пониманием или ошибки, то значит не все так складно ты придумал. Более того, чтоб и другие могли воспользоваться твоим кодом или помочь тебе с твоим, нужно следовать общепринятым тенденциям. Так что определись, или ты просишь помощи и внимаешь, либо остаешься один на один со своим кодом.

Не по теме:

С тем, что надо использовать некоторые правила оформления кода - согласен. Но я говорю, что я пишу на PascalABC.Net - и соответственно использую его codestyle. Мне кажется, что тема уходит от изначальной темы. :D

0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,370
25.06.2017, 18:21
Цитата Сообщение от Volobuev Ilya Посмотреть сообщение
Строка 102
Цитата Сообщение от Volobuev Ilya Посмотреть сообщение
Строка 135
Попробуй определить Edges раньше, чем вызываешь
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
25.06.2017, 18:23  [ТС]
Да, я пробовал. Но тогда он будет ругаться на процедуру Points, которая определена в конце класса.
Но я же хочу код красивый сделать - без повторений public всяких.

Не по теме:

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

0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,370
25.06.2017, 18:38
Сначала определяй приватные переменные (поля) у которых префикс F
Затем приватные процедуры и функции, затем геттеры и сеттеры, затем публичный конструктор, затем публичные свойства и методы.
Объявлять публичные поля в классе - моветон, это делает код негибким, сложным для рефакторинга
0
25.06.2017, 18:41  [ТС]

Не по теме:

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

0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,370
25.06.2017, 18:46
Цитата Сообщение от Volobuev Ilya Посмотреть сообщение
Придеться ломать весь код
Тогда смирись с тем, что паблик секций будет не одна! перенести переменные выше - это разве проблема?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
25.06.2017, 18:49
Лучший ответ Сообщение было отмечено Volobuev Ilya как решение

Решение

Volobuev Ilya, ну, я там еще поисправлял где увидел (использование result в функциях значительно разгружает код). Вот что получилось:
Pascal
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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
unit Graph2;
 
uses GraphABC;
type
  ///Style-object
  Style = class
  private 
    pC, pC2: Color;
    pS: integer;
  
  public 
    ///Color (pen)
    property StylePenColor: Color read pC write pC;
    ///Color (brush)
    property StyleBrushColor: Color read pC2 write PC2;
    ///Size
    property Size: integer read pS write pS;
    
    ///Copies style's options from another style-object.
    procedure CopyFrom(s: Style);begin StylePenColor := s.StylePenColor;StyleBrushColor := s.StyleBrushColor;Size := s.Size; end;
    
    ///Resets style's options to standart.
    procedure Reset();begin StylePenColor := clBlack;StyleBrushColor := clWhite;Size := 1; end;
    
    ///Applies style's options to pen's settings.
    procedure Apply();begin SetPenColor(StylePenColor);SetBrushColor(StyleBrushColor);SetPenWidth(Size); end;
    
    constructor ();begin Reset(); end;
  end;
  
  
  ///Point's class
  GPoint = class
  private 
    pX, pY, pR: integer;
    pS: Style;
  
  public 
    
    ///X coordinate
    property X: integer read pX write pX;
    ///Y coordinate
    property Y: integer read pY write pY;
    ///Radius
    property R: integer read pR write pR;
    ///Object's style
    property StyleOptions: Style read pS write pS;
    
    ///Copies coordinates from another point.
    procedure CopyFrom(p: GPoint);begin X := p.X;Y := p.Y; end;
    
    ///Set X and Y to 0; R to 1.
    procedure SetZero();begin X := 0;Y := 0;R := 1; end;
    
    ///Draws point.
    procedure Draw();begin StyleOptions.Apply();FillCircle(X, Y, R);DrawCircle(X, Y, R); end;
    
    ///Initialize style-object.
    procedure NewStyle();begin StyleOptions := new Style(); end;
    
    constructor ();begin SetZero(); end;
  end;
  
  ///Edge's class
  GEdge = class
  private 
    pA, pB: GPoint;
    pS: Style;
  
  public 
    ///Point "A"
    property A: GPoint read pA write pA;
    ///Point "B"
    property B: GPoint read pB write pB;
    ///Object's style
    property StyleOptions: Style read pS write pS;
    
    ///Draws edge.
    procedure Draw();begin StyleOptions.Apply();Line(A.X, A.Y, B.X, B.Y); end;
    
    ///Draws edge with A and B points.
    procedure DrawWith();begin StyleOptions.Apply();Line(A.X, A.Y, B.X, B.Y);A.Draw();B.Draw(); end;
    
    ///Initialize two new points. [It is necessary, if there are no points yet.]
    procedure NewPoints();begin A := new GPoint();B := new GPoint(); end;
    
    ///Initialize style-object.
    procedure NewStyle();begin StyleOptions := new Style(); end;
    
    constructor ();begin end;
  end;
  
  ///Graph's class
  Graph = class
  
  public 
    ///Set of all edges
    Edges: set of GEdge;
    
    ///Addes new edge to graph.
    procedure Add(e1: GEdge);begin Include(Edges, e1); end;
    
    ///Removes edge from graph.
    procedure Del(e1: GEdge);begin Exclude(Edges, e1); end;
    
    
    ///Draws graph.
    procedure Draw();
    begin
      foreach var vedge in Edges do vedge.Draw();
    end;
    
    ///Returns all points in graph.
    function Points(): set of GPoint;
    //var
    //  p: set of GPoint;
    begin
      result := [];
      foreach var vedge in Edges do begin Include(result{p}, vedge.A);Include(result{p}, vedge.B); end;
      //Points := p;
    end;
    
    ///Draws graph with all points.
    procedure DrawWith();
    begin
      Draw();
      foreach var point in Points do point.Draw();
    end;
    
    ///Returns True if the edge with the same points exists.
    function Edge(A, B: GPoint): boolean;
    //var
    //  t: boolean;
    begin
      // t := false;
      result := true;
      foreach var vedge in Edges do
        if (vedge.A = A) and (vedge.B = B) then Exit; // begin t := true;break; end;
      // Edge := t;
      result := false;
    end;
    
    ///Removes point and all edges those are linked to this point.
    procedure DelP(p: GPoint);
    var
      edges2: set of GEdge;
    begin
      foreach var vedge in Edges do
        if not ((vedge.A = p) or (vedge.B = p)) then Include(edges2, vEdge);
      Edges := edges2;
    end;
    
    ///Returns environment of the point.
    function Environment(p: GPoint): set of GPoint;
    //var
    //  pts: set of GPoint;
    begin
      result := [];
      foreach var vedge in Edges do
        if (vedge.A = p) then Include(result{pts}, vEdge.B) else Include(result{pts}, vEdge.A);
      // Environment := pts;
    end;
    
    ///Reproduces point.
    procedure ReproduceP(p: GPoint; x, y: integer);
    var
      E1: GEdge;
      rpoint: GPoint;
    begin
      rpoint := new GPoint();rpoint.CopyFrom(p);rpoint.X += x;rpoint.Y += y;
      foreach var point in Environment(p) do
      begin
        E1 := new GEdge();
        E1.A := point;E1.B := rpoint;
        Add(E1);
      end;
    end;
    
    ///Returns True if graph has loops.
    function HasLoop(): boolean;
    //var
    //  t: boolean;
    begin
      //t := false;
      result := true;
      foreach var vedge in Edges do
        if vedge.A = vedge.B then Exit; // begin t := true;break; end;
      result := false;
      // HasLoop := t; 
    end;
    
    ///Replaces first point with another one.
    procedure Replace(p, p2: GPoint);
    begin
      foreach var vedge in Edges do
      begin
        if vedge.A = p then vedge.A := p2;
        if vedge.B = p then vedge.B := p2;
      end;
    end;
  
  private 
    pS, pS2: Style;
    pcount: integer;
    
    procedure EdgeStyleOptionsWrite(v: Style);
    begin
      pS := v;
      foreach var vedge in Edges do vedge.StyleOptions := v;
    end;
    
    procedure PointStyleOptionsWrite(v: Style);
    begin
      pS2 := v;
      foreach var vedge in Edges do begin vedge.A.StyleOptions := v;vedge.B.StyleOptions := v; end;
    end;
    
    function CountRead(): integer;
    //var
    //  c: integer;
    begin
      result{c} := 0;
      foreach var p in Points do Inc(result{c});
      // CountRead := c;
    end;
    
    procedure CountWrite(v: integer);
    // var
    //  c: integer;
    begin
      var c := 0;
      if v < CountRead then
        foreach var p in Points do
        begin
          if c > v then DelP(P);
          Inc(c);
        end;
    end;
  
  public 
    ///Object's style (for edges)
    property EdgeStyleOptions: Style read pS write EdgeStyleOptionsWrite;
    ///Object's style (for points)
    property PointStyleOptions: Style read pS2 write PointStyleOptionsWrite;
    ///Count
    property Count: integer read CountRead write CountWrite;
    
    
    ///Addes new edge to graph. [The edge is created immediately.]
    procedure NewEdge(x, y, x1, y1: integer);
    var
      E1: GEdge;
    begin
      E1 := new GEdge();
      E1.NewPoints();
      E1.A.X := x;E1.A.Y := y;E1.B.X := x1;E1.B.Y := y1;
      E1.A.NewStyle();E1.B.NewStyle();
      E1.NewStyle();
      Add(E1);
    end;
    
    ///Addes new edge to graph. [The edge is created immediately.]
    procedure NewEdge(x, y, x1, y1: integer; S1, S2: Style);
    var
      E1: GEdge;
    begin
      E1 := new GEdge();
      E1.NewPoints();
      E1.A.X := x;E1.A.Y := y;E1.B.X := x1;E1.B.Y := y1;
      E1.A.StyleOptions := S1;E1.B.StyleOptions := S1;
      E1.StyleOptions := S2;
      Add(E1);
    end;
    
    
    
    ///Appends to full graph.
    procedure FullGraph();
    var
      E1: GEdge;
    begin
      foreach var point in Points do
        foreach var point2 in Points do
          if not Edge(point, point2) and (point <> point2) then
          begin
            E1 := new GEdge();
            E1.A := point;E1.B := point2;E1.NewStyle;
            Add(E1);
          end;
    end;
    
    constructor ();begin end;
  end;
end.
Компилируется нормально, насчет использования - не знаю, напиши основную программу побольше, посмотрим, удобно ли использовать эти классы, может, чего и поправим.
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
25.06.2017, 18:55  [ТС]
Тогда смирись с тем, что паблик секций будет не одна! перенести переменные выше - это разве проблема?
Я не знаю, как ты предпочитаешь писать код, но судя по тому, что так желаешь напихать кучу public, можно сказать, что это не очень хорошо. Я тут пришел красивый код писать, vlisp, а не код, с кучами public.

Добавлено через 1 минуту
Цитата Сообщение от volvo Посмотреть сообщение
Компилируется нормально, насчет использования - не знаю, напиши основную программу побольше, посмотрим, удобно ли использовать эти классы, может, чего и поправим.
Заработало, хорошо.

Добавлено через 4 минуты
Pascal
1
2
3
4
5
6
7
8
    ///Returns True if the edge with the same points exists.
    function Edge(A, B: GPoint): boolean;
    begin
      result := true;
      foreach var vedge in Edges do
        if (vedge.A = A) and (vedge.B = B) then Exit;
      result := false;
    end;
Правильно, ли я понимаю, что после Exit возвращается result с тем значением, которое у него установлено уже?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
25.06.2017, 19:04
Лучший ответ Сообщение было отмечено Volobuev Ilya как решение

Решение

Цитата Сообщение от Volobuev Ilya Посмотреть сообщение
после Exit возвращается result с тем значением, которое у него установлено уже?
Да, exit - это выход из подпрограммы, с тем результатом, который запомнен в result. Очень удобно: назначаешь тот result , какой нужен в случае выхода по условию, а в конце (если досрочного выхода не произошло) - устанавливаешь тот, который нужен, когда подпрограмма выполнилась до конца. И не нужны begin/end.

Не по теме:

Хотя в том же FPC сделано еще удобнее, там можно выходить из функции через Exit(результат), т.е., вышеприведенный код мог бы выглядеть так:

Pascal
1
2
3
4
5
6
7
    function Edge(A, B: GPoint): boolean;
    var vedge: GEdge;
    begin
      for vedge in Edges do
        if (vedge.A = A) and (vedge.B = B) then Exit(true);
      result := false;
    end;

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.06.2017, 19:04
Помогаю со студенческими работами здесь

Как можно сделать рамку вокруг таблицы красивее и объемнее
Есть таблица .tg {border-collapse:collapse;border-spacing:0; width:100%; cellpadding:15 px; cellspacing:3; border-radius:15px;} .tg...

Сделать код "красивее"
Вот такая задача: Написал вот такой код: def lucky_sum(a, b, c): sum = 0 if a != 13: sum += a if b != 13 and a...

Как сделать ToolTip "красивее"?
Сделал подсказку – т.е. наводишь курсор на textBox1 и выскакивает подсказка. Реализовал так: private: System::Void...

Как сделать функцию "красивее"?
необходимо запомнить первое вхождение в функцию, вот мой вариант(упрошенный): function delay(id_image) { ...

Как красивее удалить дерево каталогов?
вполне логично. Лучше конечно выполнить от рута rm -rf / уверен, что это разрешит существующую проблему.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru