MathgeomGLS
328 строк · 7.8 Кб
1unit fBetween;
2
3interface
4
5uses
6Winapi.Windows,
7Winapi.Messages,
8System.SysUtils,
9System.Variants,
10System.Classes,
11System.Math,
12Vcl.Clipbrd,
13Vcl.Graphics,
14Vcl.Controls,
15Vcl.Forms,
16Vcl.Dialogs,
17Vcl.StdCtrls,
18Vcl.Buttons,
19Vcl.ComCtrls,
20Vcl.Menus,
21Vcl.ExtCtrls,
22
23uParser,
24uGlobal;
25
26type
27TBetweenForm = class(TForm)
28Label3: TLabel;
29Label4: TLabel;
30Label5: TLabel;
31Label6: TLabel;
32Label1: TLabel;
33Label2: TLabel;
34Label7: TLabel;
35Label8: TLabel;
36PositiveButton: TSpeedButton;
37NegativeButton: TSpeedButton;
38NegAreaLabel: TLabel;
39PosAreaLabel: TLabel;
40TotalAreaLabel: TLabel;
41EditIntegMin: TEdit;
42EditIntegMax: TEdit;
43EditCount: TEdit;
44UpDown1: TUpDown;
45EditOpacity: TEdit;
46UpDown2: TUpDown;
47RecalcBtn: TBitBtn;
48CloseBtn: TBitBtn;
49ColorDialog: TColorDialog;
50KeepRangeCheckBox: TCheckBox;
51PositivePanel: TPanel;
52NegativePanel: TPanel;
53SumAreaLabel: TLabel;
54procedure FormShow(Sender: TObject);
55procedure FormActivate(Sender: TObject);
56procedure FormKeyPress(Sender: TObject; var Key: Char);
57procedure FormDeactivate(Sender: TObject);
58procedure ParseKeyPress(Sender: TObject; var Key: Char);
59procedure IntKeyPress(Sender: TObject; var Key: Char);
60procedure EditIntegMinKeyUp(Sender: TObject; var Key: Word;
61Shift: TShiftState);
62procedure EditIntegMaxKeyUp(Sender: TObject; var Key: Word;
63Shift: TShiftState);
64procedure EditCountKeyUp(Sender: TObject; var Key: Word;
65Shift: TShiftState);
66procedure EditOpacityKeyUp(Sender: TObject; var Key: Word;
67Shift: TShiftState);
68procedure UpDown1Click(Sender: TObject; Button: TUDBtnType);
69procedure UpDown2Click(Sender: TObject; Button: TUDBtnType);
70procedure UpDown1MouseUp(Sender: TObject; Button: TMouseButton;
71Shift: TShiftState; X, Y: Integer);
72procedure PositiveButtonClick(Sender: TObject);
73procedure NegativeButtonClick(Sender: TObject);
74procedure RecalcBtnClick(Sender: TObject);
75procedure CloseBtnClick(Sender: TObject);
76procedure IntegLabelClick(Sender: TObject);
77procedure KeepRangeCheckBoxClick(Sender: TObject);
78private
79procedure UpdateRangeData;
80public
81procedure ShowData;
82end;
83
84var
85BetweenForm: TBetweenForm;
86
87//================================================================
88implementation
89//================================================================
90
91uses
92fFuncts,
93fPlot1D;
94
95{$R *.dfm}
96
97procedure TBetweenForm.FormShow(Sender: TObject);
98begin
99KeepRangeCheckBox.Checked := KeepRange;
100ShowData;
101end;
102
103procedure TBetweenForm.FormActivate(Sender: TObject);
104begin
105EditIntegMin.SetFocus;
106EditIntegMin.SelText;
107end;
108
109procedure TBetweenForm.FormKeyPress(Sender: TObject; var Key: Char);
110begin
111case Key of
112#13:begin
113RecalcBtnClick(Sender);
114Key := #0;
115end;
116#27:begin
117Key := #0;
118Close;
119end;
120end;
121end;
122
123procedure TBetweenForm.FormDeactivate(Sender: TObject);
124begin
125if KeepRange then UpdateRangeData;
126end;
127
128procedure TBetweenForm.ParseKeyPress(Sender: TObject; var Key: Char);
129begin
130with Sender as TEdit do
131begin
132if not CharInSet(UpCase(Key),
133[' ', '!', '(', ')', '*', '+', '-', '.', ',', '/', '0'..'9',
134'A'..'C', 'E', 'G'..'I', 'L', 'N'..'T', 'X', '^', '`', #8]) then
135begin
136Key := #0;
137Exit;
138end;
139if Key = '`' then Key := '�';
140end;
141end;
142
143procedure TBetweenForm.IntKeyPress(Sender: TObject; var Key: Char);
144begin
145with Sender as TEdit do
146if not CharInSet(Key, ['0'..'9', #8]) then Key := #0
147end;
148
149procedure TBetweenForm.EditIntegMinKeyUp(Sender: TObject; var Key: Word;
150Shift: TShiftState);
151var
152s: string;
153e: byte;
154
155begin
156s := ScanText(EditIntegMin.Text);
157IntegMin := ParseAndEvaluate(s, e);
158//if isNAN(IntegMin) then IntegMin := 0;
159//if e > 0 then IntegMin := 0;
160if isNAN(IntegMin) or isInfinite(IntegMin) or (e > 0) then IntegMin := 0;
161end;
162
163procedure TBetweenForm.EditIntegMaxKeyUp(Sender: TObject; var Key: Word;
164Shift: TShiftState);
165var
166s: string;
167e: byte;
168
169begin
170s := ScanText(EditIntegMax.Text);
171IntegMax := ParseAndEvaluate(s, e);
172//if isNAN(IntegMax) then IntegMax := 0;
173//if e > 0 then IntegMax := 0;
174if isNAN(IntegMax) or isInfinite(IntegMax) or (e > 0) then IntegMax := 0;
175end;
176
177procedure TBetweenForm.EditCountKeyUp(Sender: TObject; var Key: Word;
178Shift: TShiftState);
179begin
180with GraphData do
181begin
182try
183IntegCount := StrToInt(EditCount.Text);
184if IntegCount = 0 then IntegCount := IntegCountPos;
185except
186IntegCount := IntegCountPos;
187end;
188if IntegCount > IntegCountMax then IntegCount := IntegCountMax;
189end;
190Altered := true;
191end;
192
193procedure TBetweenForm.EditOpacityKeyUp(Sender: TObject; var Key: Word;
194Shift: TShiftState);
195var
196n: integer;
197
198begin
199try
200n := StrToInt(EditOpacity.Text);
201except
202n := 1;
203end;
204GraphData.AreaAlpha := n/100;
205Altered := true;
206MainForm.GLViewer.Invalidate;
207end;
208
209procedure TBetweenForm.UpDown1Click(Sender: TObject; Button: TUDBtnType);
210var
211k: word;
212
213begin
214k := 0;
215EditCountKeyUp(Sender, k, []);
216end;
217
218procedure TBetweenForm.UpDown2Click(Sender: TObject; Button: TUDBtnType);
219var
220k: word;
221
222begin
223k := 0;
224EditOpacityKeyUp(Sender, k, []);
225end;
226
227procedure TBetweenForm.UpDown1MouseUp(Sender: TObject; Button: TMouseButton;
228Shift: TShiftState; X, Y: Integer);
229begin
230RecalcBtnClick(Sender);
231end;
232
233procedure TBetweenForm.PositiveButtonClick(Sender: TObject);
234begin
235ColorDialog.Color := GraphData.PosAreaColor;
236if ColorDialog.Execute then
237begin
238GraphData.PosAreaColor := ColorDialog.Color;
239PositivePanel.Color := GraphData.PosAreaColor;
240MainForm.GLViewer.Invalidate;
241Altered := TRUE
242end;
243end;
244
245procedure TBetweenForm.NegativeButtonClick(Sender: TObject);
246begin
247ColorDialog.Color := GraphData.NegAreaColor;
248if ColorDialog.Execute then
249begin
250GraphData.NegAreaColor := ColorDialog.Color;
251NegativePanel.Color := GraphData.NegAreaColor;
252MainForm.GLViewer.Invalidate;
253Altered := TRUE
254end;
255end;
256
257procedure TBetweenForm.RecalcBtnClick(Sender: TObject);
258begin
259MainForm.GLViewer.Invalidate;
260end;
261
262procedure TBetweenForm.IntegLabelClick(Sender: TObject);
263begin
264Clipboard.Clear;
265with Sender as TLabel do
266Clipboard.AsText := Copy(Caption, pos('=', Caption)+2, Length(Caption));
267end;
268
269procedure TBetweenForm.KeepRangeCheckBoxClick(Sender: TObject);
270begin
271KeepRange := KeepRangeCheckBox.Checked;
272end;
273
274procedure TBetweenForm.CloseBtnClick(Sender: TObject);
275begin
276Close;
277end;
278
279procedure TBetweenForm.UpdateRangeData;
280begin
281KeptMin := IntegMin;
282KeptMax := IntegMax;
283end;
284
285procedure TBetweenForm.ShowData;
286begin
287with GraphData, PlotData do
288begin
289EditCount.Text := IntToStr(IntegCount);
290UpDown2.Position := round(AreaAlpha*100);
291if TextStr = '' then Caption := '' else Caption := 'y = '+TextStr;
292
293KeepRangeCheckBox.Checked := KeepRange;
294PositivePanel.Color := PosAreaColor;
295NegativePanel.Color := NegAreaColor;
296
297if IsSegment then
298begin
299if KeepRange then
300begin
301IntegMin := KeptMin;
302IntegMax := KeptMax;
303end
304else
305begin
306IntegMin := SegMin;
307IntegMax := SegMax;
308end;
309end
310else
311begin
312if KeepRange then
313begin
314IntegMin := KeptMin;
315IntegMax := KeptMax;
316end
317else
318begin
319IntegMin := xMin;
320IntegMax := xMax;
321end;
322end;
323end;
324EditIntegMin.Text := FloatToStrF(IntegMin, ffGeneral, 13, 4);
325EditIntegMax.Text := FloatToStrF(IntegMax, ffGeneral, 13, 4);
326end;
327
328end.
329