Používáme Visual Studio

Transkript

Používáme Visual Studio
1
Používáme Visual Studio
Okenní klient knihovny KvadrRovLib
Založíme-si nový projekt podle obrázku. Bude se jednat o okenní aplikaci, která nám
zp ístupní práci s naší knihovnou v p íjemném GUI prost edí.
ř
ř
ř
ř
Když si prohlédneme rozhraní t ídy Solver, uv domíme si, že jsme na takovouto možnost
dop edu nemysleli (to jist byla chyba). Solver používá pro vstupy a výstupy p íliš
intenzivn t ídu System.Console. Pokusíme se situaci opravit, avšak zachovat zp tnou
kompatibilitu. S projektem NPoly vzniklo automaticky také tzv. ešení (solution) stejného
jména. P idáme další nový project, jako na obrázku. Bude to knihovna t íd (Class
Library). Jazykem knihovního projektu bude C#, ale práv prost ednictvím projekt
m žeme rozehrát ve VS mezijazykovou interoperabilitu.1
ě
ř
ř
ě
ř
ě
ě
ř
ř
ř
ř
ě
ů
1
ů
Projekty mohou být psány v r zných programovacích jazycích.
ů
2
Smažeme automaticky vygenerovaný soubor Class1.cs
3
ř
ř
a p idáme soubor Solver.cs, produkt naší p edchozí práce.
4
ř
ř
ř
Rovn ž p ejmenujeme t ídu formulá e na FPoly, soubor s jejím kódem na FPoly.cs a
nastavíme vlastnost Text t ídy FPoly na NPoly.
ě
ř
5
ř
ř
Do ešení m žeme p idat ješt projekt konzolové aplikace, na kterém budeme testovat
zp tnou kompatibilitu.
ů
ě
ě
Úpravy t ídy KvadrRovLib.Solver
ř
ř
ř
A za neme s úpravami t ídy Solver. P edevším je pot eba získat jinou možnost než nyní
nepoužitelný výpis na konzolu, jak se dotázat na ešení rovnice. Z d vodu jednoduchosti,
protože zatím nechceme implementovat t ídu (typ) pro komplexní ísla, nám posta í
ešení jako et zec. Existuje možnost, jak zajistit, aby se ešení spo ítalo teprve v
moment, kdy se na n n kdo ptá. Tuto možnost poskytují tzv. vlastnosti (property) t ídy.
Pomocí pr vodce p idáme dv nové property x1, x2. Ob budou sloužit jen pro
dotazování (get). Postup pro x1 je vid t na obrázku:
č
ř
ů
ř
č
ř
ř
č
ř
č
ě
ř
ě
ě
ř
ů
ě
ě
ě
6
ř
V kódu se objeví nové ádky
public string x1
{
get
{
}
7
}
public string x2
{
get
{
}
}
ř
ř
ř
Je t eba naprogramovat, jakým zp sobem získáme et zce ešení. Metodu Solve musíme
modifikovat. Protože chceme zachovat kompatibilitu, p edeklarujeme metodu Solve na
SolveInternal. A metodu Solve znovu p idáme, tentokrát s pomocí pr vodce (jako p ed
chvílí, ale zvolíme Add Method):
ů
ě
ř
ř
ř
ů
ř
ř
Do t ídy p idáme soukromou položku (field) sz1
8
ř
ř
a stejn soukromou položku sz2 typu et zec. Pr vodcem p idáme soukromou položku
valid typu bool, která bude indikovat, že et zce sz1, sz2 obsahují platné ešení rovnice.
Kone n pomocí pr vodce p idáme vlastnosti A, B, C typu double get i set, sloužící pro
p ístup ke koeficient m rovnice. Díky tomu, že to budou vlastnosti, m žeme zm nit
hodnotu valid na false, kdykoliv dojde ke zm n koeficientu.
ě
ě
ů
ř
ř
ě
ř
č
ě
ů
ř
ů
ů
ě
ě
ř
P estaneme používat pr vodce a doprogramujeme kód.
ů
1 namespace KvadrRovLib
2 {
3
using System;
4
5
public class Solver
6
{
7
public Solver()
8
{
9
GenerateRandom(2);
10
}
11
12
public Solver(double a, double b, double c)
13
{
14
this.a = a;
15
this.b = b;
16
this.c = c;
17
}
18
19
private double a, b, c;
ě
9
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
private string sz1, sz2;
private bool valid = false;
public void GenerateRandom(int precission)
{
Random rand = new Random();
a = Math.Round(rand.NextDouble()*10-5,precission);
b = Math.Round(rand.NextDouble()*10-5,precission);
c = Math.Round(rand.NextDouble()*10-5,precission);
valid = false;
}
private double Read(String caption)
{
Console.WriteLine(caption);
return double.Parse(Console.ReadLine());
}
/// <summary>
/// Only for Console Application
/// </summary>
public void Read()
{
a = Read("a:");
b = Read("b:");
c = Read("c:");
}
private double discriminant(double a, double b, double c)
{
return b * b - 4 * a * c;
}
private void SolveInternal()
{
double d = discriminant(a,b,c);
if (d == 0)
{
sz1 = (- b / (2 * a)).ToString();
sz2=sz1;
goto ret;
}
if (d > 0)
{
sz1 = (- b + Math.Sqrt(d) /
(2 * a)).ToString();
sz2 = (- b - Math.Sqrt(d) /
(2 * a)).ToString();
}
else
{
double r = Math.Sqrt(- d) / (2 * a);
if(r > 0)
{
sz1 = string.Format("{0} + {1} i ",
- b/ (2 * a),r);
sz2 = string.Format("{0} - {1} i ",
10
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
- b/ (2 * a),r);
}
else
{
sz1 = string.Format("{0}
- b/
sz2 = string.Format("{0}
- b/
}
}
ret:
valid = true;
}
/// <summary>
/// Only for Console Application
/// </summary>
public void Solve()
{
Console.WriteLine(x1);
Console.WriteLine(x2);
}
public string x1
{
get
{
if(!valid) SolveInternal();
return sz1;
}
}
public string x2
{
get
{
if(!valid) SolveInternal();
return sz2;
}
}
public double A
{
get
{
return a;
}
set
{
valid = false;
a = value;
}
}
public double B
{
get
- {1} i ",
(2 * a),-r);
+ {1} i ",
(2 * a),-r);
11
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157}
{
return b;
}
set
{
valid = false;
b = value;
}
}
public double C
{
get
{
return c;
}
set
{
valid=false;
c = value;
}
}
}
Vytvo íme a oživíme formulá
ř
ř
Nastavíme si záložku s formulá em v návrhovém pohledu (design). Není-li p ítomna,
poklepneme na ikonu formulá e FPoly v pr zkumníkovi ešení, nebo p es pravé tla ítko
myši.
ř
ř
ů
ř
P išpendlíme si Toolbox
ř
č
12
ř
a navrhneme formulá .
13
ř
ř
Na záv r nastavíme styl hranic formulá e nap . na FixedToolWindow.
ě
Než za neme cokoliv programovat, nesmíme zapomenout si nareferencovat projekt,
jehož t ídy hodláme používat. Je to naprosto nutné pro zda ilou kompilaci (odpovídá to
zadání parametru /reference pro csc.exe), ale je to pot eba ud lat ihned p ed zápisem
kódu. Protože od tohoto okamžiku nám m že editor interaktivn pomáhat (technologie
intellisense). Ud lá se to takto.
č
ř
ř
ř
ř
ě
ů
ě
ě
14
Č
Doplníme programový kód.
vynechána.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using
using
using
using
using
using
using
ást kódu, generovaného automaticky designérem, je
System;
System.Drawing;
System.Collections;
System.ComponentModel;
System.Windows.Forms;
System.Data;
KvadrRovLib;
namespace NPoly
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class FPoly : System.Windows.Forms.Form
{
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox textBoxa;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.TextBox textBoxx1;
15
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
private System.Windows.Forms.Label label4;
private System.Windows.Forms.TextBox textBoxx2;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Button buttonSolve;
private System.Windows.Forms.TextBox textBoxb;
private System.Windows.Forms.TextBox textBoxc;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.Button buttonRandom;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
public FPoly()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after
//
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.label1 = new System.Windows.Forms.Label();
this.textBoxa = new System.Windows.Forms.TextBox();
this.textBoxb = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.textBoxc = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.textBoxx1 = new System.Windows.Forms.TextBox();
this.label4 = new System.Windows.Forms.Label();
this.textBoxx2 = new System.Windows.Forms.TextBox();
this.label5 = new System.Windows.Forms.Label();
16
78
this.buttonSolve = new System.Windows.Forms.Button();
79
this.label6 = new System.Windows.Forms.Label();
80
this.buttonRandom = new
System.Windows.Forms.Button();
81
this.SuspendLayout();
82
//
83
// label1
84
//
85
this.label1.Location = new System.Drawing.Point(8,
48);
86
this.label1.Name = "label1";
87
this.label1.Size = new System.Drawing.Size(16, 23);
88
this.label1.TabIndex = 0;
89
this.label1.Text = "a";
...
198
199
200
201
13);
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
//
// FPoly
//
this.AutoScaleBaseSize = new System.Drawing.Size(5,
this.ClientSize = new System.Drawing.Size(280, 182);
this.Controls.Add(this.buttonRandom);
this.Controls.Add(this.label6);
this.Controls.Add(this.buttonSolve);
this.Controls.Add(this.textBoxx2);
this.Controls.Add(this.textBoxx1);
this.Controls.Add(this.textBoxc);
this.Controls.Add(this.textBoxb);
this.Controls.Add(this.textBoxa);
this.Controls.Add(this.label5);
this.Controls.Add(this.label4);
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.FormBorderStyle =
System.Windows.Forms.FormBorderStyle.FixedToolWindow;
this.Name = "FPoly";
this.Text = "NPoly";
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new FPoly());
}
Solver solver = new Solver();
private void buttonSolve_Click(object sender,
17
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255}
System.EventArgs e)
{
solver.A = double.Parse(textBoxa.Text);
solver.B = double.Parse(textBoxb.Text);
solver.C = double.Parse(textBoxc.Text);
textBoxx1.Text = solver.x1;
textBoxx2.Text = solver.x2;
}
private void buttonRandom_Click(object sender,
System.EventArgs e)
{
solver.GenerateRandom(1);
textBoxa.Text = solver.A.ToString();
textBoxb.Text = solver.B.ToString();
textBoxc.Text = solver.C.ToString();
textBoxx1.Text = solver.x1;
textBoxx2.Text = solver.x2;
}
}
A takhle vypadá naše aplikace za b hu
ě
Dokumentace ve zdrojovém kódu
ř
ř
V C# se stejn jako v C++ používá pro jedno ádkový komentá dvojice lomítek // na
za átku a pro více ádkový komentá dvojice /* na za áku a dvojice */ na konci. V našem
kódu je však vid t i trojice lomítek ///. Tato trojice má zvláštní význam pro automatické
generování programátorské nápov dy a podpory pro intellisense.
ě
ř
ř
č
č
ě
ě
ř
Pokud si pomocí pravého tla ítka myši otev eme vlastnosti projektu a nastavíme XML
dokumenta ní soubor na “jmeno_assembly”.xml, bude vygenerován xml soubor a dále
kopírován spolu s assembly.
č
č
18
Vygenerované kvadrrovlib.xml
<?xml version="1.0"?>
<doc>
<assembly>
<name>KvadrRovLib</name>
</assembly>
<members>
<member name="M:KvadrRovLib.Solver.Read">
<summary>
Only for Console Application
</summary>
</member>
<member name="M:KvadrRovLib.Solver.Solve">
<summary>
Only for Console Application
</summary>
</member>
</members>
</doc>
ř
A tady je efekt, intellisense nám krom deklarace metody poskytne i rozší enou
informaci o metod . Volání této metody má n jaký efekt jen v konzolové aplikaci – Only
for Console Application.
ě
ě
ě
19

Podobné dokumenty

sr_pg_314

sr_pg_314 private void Form1_MouseDown(object sender, MouseEventArgs e)

Více

Objektov↓ orientovan← programov£n

Objektov↓ orientovan← programov£n public class PrvniOkno: System.Windows.Forms.Form

Více

Dialogy

Dialogy o Ovládací prvky, Titulkový pruh, … – obnoví Windows o Grafické objekty z Graphics musí obnovit programátor Událost Paint – zapouzdřuje zprávu WM_PAINT – zaslána aplikaci při požadavku Windows na o...

Více

- Katedra technické a informační výchovy PdF UP v

- Katedra technické a informační výchovy PdF UP v Objektové typy se zavádějí ve Visual Basicu pro objekty, s nimiž se v něm pracuje. S jejích pomocí lze deklarovat jednotlivé instance. Existují obecné objektové typy z nich odvozené i objektové typ...

Více

Sauto - dokumentace k importnímu rozhraní

Sauto - dokumentace k importnímu rozhraní Popis datum - záruka do - formát "rrrr[-mm[-dd]]" úprava pro zdravotně postižené (handicapped = 1) URL iframe (maximálně 250 znaků). Do url lze vložit šablonu např. ". . . &utm_source=##TYP##. ...

Více

ceník 2011

ceník 2011 81,16 Kč Marlboro 84,20 ks 81,16 Kč Marlboro soft 78,20ks 75,37 Kč LM 72,- 20 ks 69,57 Kč Sparta 75,20 ks 72,47 Kč Petra 72,20 ks 69,57 Kč Red & White 65,20 ks 62,81 Kč Start filter 65,20 ks 62,81 ...

Více

ceník 2012

ceník 2012 Magister Bohém 38% 1 229,00 Kč Jablko Berentzen plech 16% 0,7 169,00 Kč Jelzin peppermint 16,6 %

Více