-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathKTX.pas
2391 lines (1994 loc) · 118 KB
/
KTX.pas
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
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
{$apptype console}
{$reference 'System.Drawing.dll'}
///Модуль для удобной работы с консолью
unit KTX;
uses System.Drawing;
uses System.Threading.Tasks;
{$region Version}
const
///Название модуля
Name = 'KTX Console Manager';
///Версия модуля
Version: record Major, Minor, SubMinor, Build: integer; end = (Major: 2; Minor: 3; SubMinor: 0; Build: 50);
///Возвращает строковое представление текущей версии модуля
function StrVersion := $'{version.Major}.{version.Minor}.{version.SubMinor}';
///Возвращает полное имя с версией
function StrFull := $'{Name} {StrVersion}';
{$endregion Version}
{$region GlobalMethods}
///Возвращает true, если данный байт находится в диапазоне от а до b
function InRange(self: byte; a, b: byte): boolean; extensionmethod;
begin
Result := (self >= a) and (self <= b);
end;
{$endregion GlobalMethods}
{$region SynonimTypes}
type
///Тип цвета консоли
Color = System.ConsoleColor;
///Тип клавиши консоли
Key = System.ConsoleKey;
{$endregion SynonimTypes}
{$region Colors}
const
///Чёрный
Black = Color.Black;
///Тёмно-синий
DarkBlue = Color.DarkBlue;
///Тёмно-зелёный
DarkGreen = Color.DarkGreen;
///Тёмно-бирюзовый
DarkCyan = Color.DarkCyan;
///Тёмно-красный
DarkRed = Color.DarkRed;
///Тёмно-пурпурный
DarkMagenta = Color.DarkMagenta;
///Тёмно-жёлтый
DarkYellow = Color.DarkYellow;
///Серый
Gray = Color.Gray;
///Тёмно-серый
DarkGray = Color.DarkGray;
///Синий
Blue = Color.Blue;
///Зелёный
Green = Color.Green;
///Бирюзовый
Cyan = Color.Cyan;
///Красный
Red = Color.Red;
///Пурпурный
Magenta = Color.Magenta;
///Жёлтый
Yellow = Color.Yellow;
///Белый
White = Color.White;
{$endregion}
{$region Console}
type
SeparateType = (
///Метод, основанный на списке, быстрее метода SunMethod, но выделяет лишнюю память
ListMethod,
///Метод, предложенный SunSerega, медленнее на 10%, но не выделяет лишнюю память
SunMethod
);
///Класс, содержащий методы для работы с консолью
Console = static class
private const Err1: string = 'Window size too small';
///Название консольного окна
public static property Title: string read System.Console.Title write System.Console.Title := value;
private static IsInit: boolean;
private static _MinimalWidth: integer = 100;
private static _MinimalHeight: integer = 30;
private static procedure SetMinimalWidth(a: integer) := _MinimalWidth := a;
private static procedure SetMinimalHeight(a: integer) := _MinimalHeight := a;
///Возвращает или задаёт минимально допустимое значение ширины экрана
public static property MinimalWidth: integer read _MinimalWidth write SetMinimalWidth;
///Возвращает или задаёт минимально допустимое значение высоты экрана
public static property MinimalHeight: integer read _MinimalHeight write SetMinimalHeight;
///Задаёт минимально допустимые значения ширины и высоты экрана
public static procedure SetMinimalSize(x, y: integer);
begin
_MinimalWidth := x;
_MinimalHeight := y;
end;
private static _width: integer = 100;
private static _height: integer = 30;
private static _cfore: Color = Black;
private static _cback: Color = White;
private static _cdisable: Color = Gray;
private static _cerr: Color = Red;
private static _ctrue: Color = DarkGreen;
private static _cfalse: Color = Red;
private static procedure SetCursorVisible(a: boolean) := System.Console.CursorVisible := a;
///Возвращает или задает видимость курсора
public static property CursorVisible: boolean read System.Console.CursorVisible write SetCursorVisible;
///Действия, выполняемые перед чтением в блоке
private static procedure Pre;
begin
System.Console.CursorVisible:=true;
end;
///Действия, выполняемые после чтения в блоке
private static procedure After;
begin
System.Console.CursorVisible:=false;
end;
///Задаёт действительное значение цвета фона
private static procedure SetRealBackColor(a: Color);
begin
System.Console.BackgroundColor := a;
end;
///Задаёт действительное значение цвета текста
private static procedure SetRealForeColor(a: Color);
begin
System.Console.ForegroundColor := a;
end;
///Возвращает или задаёт действительное значение цвета фона консоли
public static property RealBack: Color read System.Console.BackgroundColor write SetRealBackColor;
///Возвращает или задаёт действительное значение цвета текста консоли
public static property RealFore: Color read System.Console.ForegroundColor write SetRealForeColor;
private static procedure SetColorFore(a: Color) := _cfore := a;
private static procedure SetColorBack(a: Color) := _cback := a;
private static procedure SetColorDisable(a: Color) := _cdisable := a;
private static procedure SetColorError(a: Color) := _cerr := a;
private static procedure SetColorTrue(a: Color) := _ctrue := a;
private static procedure SetColorFalse(a: Color) := _cfalse := a;
///Возвращает или задаёт стандартное значение цвета текста консоли
public static property ColorFore: Color read _cfore write SetColorFore;
///Возвращает или задаёт стандартное значение цвета бэкграунда консоли
public static property ColorBack: Color read _cback write SetColorBack;
///Возвращает или задаёт стандартное значение цвета недоступного текста консоли
public static property ColorDisable: Color read _cdisable write SetColorDisable;
///Возвращает или задаёт стандартное значение цвета текста ошибок консоли
public static property ColorError: Color read _cerr write SetColorError;
///Возвращает или задаёт стандартное значение цвета текста истинных значений консоли
public static property ColorTrue: Color read _ctrue write SetColorTrue;
///Возвращает или задаёт стандартное значение цвета текста ложных значений консоли
public static property ColorFalse: Color read _cfalse write SetColorFalse;
///Действительная высота окна консоли
public static property RealHeight: integer read System.Console.WindowHeight;
///Действительная ширина окна консоли
public static property RealWidth: integer read System.Console.WindowWidth;
///Задаёт размеры окна консоли текущими значениями ширины и высоты окна
public static procedure SetWindowSize() := System.Console.SetWindowSize(_width, _height);
private static procedure SetWindowWidth(a: integer) := _width := a;
private static procedure SetWindowHeight(a: integer) := _height := a;
///Возвращает или задаёт высоту окна консоли
public static property Height: integer read _height write SetWindowHeight;
///Возвращает или задаёт ширину окна консоли
public static property Width: integer read _width write SetWindowWidth;
///Возвращает максимальную высоту окна консоли
public static property MaxHeight: integer read System.Console.LargestWindowHeight;
///Возвращает максимальную ширину окна консоли
public static property MaxWidth: integer read System.Console.LargestWindowWidth;
private static function _WindowSizeIsActual := (System.Console.WindowHeight=_Height) and (System.Console.WindowWidth=_Width);
///Возвращает true, если размер консоли соответствует размеру окна консоли
public static property WindowSizeIsActual: boolean read _WindowSizeIsActual;
///Устанавливает положение курсора
public static procedure SetCursorPosition(x, y: integer) := System.Console.SetCursorPosition(x,y);
///Устанавливает положение курсора
public static procedure SetPos(x, y: integer) := System.Console.SetCursorPosition(x, y);
///Очищает окно консоли, заливая его текущем цветом RealBack
public static procedure Clear() := System.Console.Clear();
///Задаёт размеры окна консоли
public static procedure SetWindowSize(x, y: integer);
begin
_width:=x;
_height:=y;
System.Console.SetWindowSize(x, y);
end;
public static procedure SetSize(x, y: integer);
begin
SetWindowSize(x, y);
SetBufferSize(x, y);
Resize();
end;
///Задаёт размер буфера консоли
public static procedure SetBufferSize(x, y: integer) := System.Console.SetBufferSize(x, y);
///Задаёт размер буфера консоли
public static procedure SetBufferSize(y: integer) := System.Console.SetBufferSize(_width,y);
///Изменяет цвет текста на цвет текста по a
public static function BooleanColor(a: boolean): Color := a ? Console._ctrue : Console._cfalse;
///Обновляет размеры консоли
///Рекомендуется использовать на каждой итерации цикла
public static procedure Resize();
begin
while (Console.MaxWidth<Console.MinimalWidth) or (Console.MaxHeight<Console.MinimalHeight) do
begin
Clear();
Console.RealFore := Console._cerr;
write(Err1);
sleep(100);
Console.RealFore := Console._cfore
end;
if not ((Console.Width<=Console.MaxWidth) and (Console.Height<=Console.MaxHeight)) then
begin
_width:=Console.MaxWidth;
_height:=Console.MaxHeight;
SetWindowSize();
end;
Clear();
if (Console.RealHeight>console.Height) or (Console.RealWidth>console.Width) then System.Console.SetWindowSize(1,1);
Console.SetBufferSize(Width,Height);
Console.SetWindowSize(Width,Height);
end;
///Изменяет размер буфера исходя из start и size
public static procedure Resize(start, size: integer);
begin
if size>=(_Height-start-3) then Console.SetBufferSize(size+start+3);
end;
///Инициализирует стандартные значения
public static procedure Init;
begin
System.Console.BackgroundColor:=_cback;
System.Console.ForegroundColor:=_cfore;
System.Console.SetWindowSize(1,1);
System.Console.SetBufferSize(_width, _height);
System.Console.SetWindowSize(_width, _height);
IsInit:=true;
end;
///Читает клавишу из потока, не выводя её на экран
public static function ReadKey := System.Console.ReadKey(true);
///Выводит на экран текст
///Если в качестве аргумента использован цвет консоли, то меняет цвет текста на этот цвет-аргумент
public static procedure Draw(params o: array of object);
begin
for var i:=0 to o.Length-1 do
begin
match o[i] with
Color(var c): System.Console.ForegroundColor:=c;
else write(o[i].ToString);
end;
end;
end;
///Выводит на экран текст и переходит на новую строку
///Если в качестве аргумента использован цвет консоли, то меняет цвет текста на этот цвет-аргумент
public static procedure DrawLn(params o: array of object);
begin
Draw(o,NewLine);
end;
///Выводит на экран текст в позиции x, y
///Если в качестве аргумента использован цвет консоли, то меняет цвет текста на этот цвет-аргумент
public static procedure DrawOn(x, y: integer; params o: array of object);
begin
Console.SetCursorPosition(x,y);
Draw(o);
end;
///Выводит на экран текст в позиции x, y и переходит на новую строку
///Если в качестве аргумента использован цвет консоли, то меняет цвет текста на этот цвет-аргумент
public static procedure DrawLnOn(x, y: integer; params o: array of object);
begin
Console.SetCursorPosition(x,y);
DrawLn(o);
end;
///Возвращает или задает позицию столбца курсора
public static property CursorLeft: integer read System.Console.CursorLeft write System.Console.CursorLeft := value;
///Возвращает или задает позицию строки курсора
public static property CursorTop: integer read System.Console.CursorTop write System.Console.CursorTop := value;
private static constructor;
begin
Init();
end;
private static function SizeSeparateMy(x: integer; s: array of string): sequence of string;
begin
var PreRes := new List<string>;
for var i:=0 to s.Length-1 do
begin
var StrBuild := new StringBuilder;
var TWds := s[i].ToWords;
if TWds<>nil then
for var j:=0 to TWds.Length-1 do
begin
if StrBuild.length + TWds[j].length < x then
begin
if j>0 then StrBuild+=' ';
StrBuild += TWds[j];
end
else
begin
PreRes += StrBuild.ToString;
StrBuild := TWds[j];
end;
end;
if StrBuild.ToString<>'' then
PreRes += StrBuild.ToString;
end;
Result := PreRes;
end;
private static function SizeSeparateMy(x: integer; s: string) := SizeSeparateMy(x, new string[](s));
private static function SizeSeparateSun(x: integer; s: array of string): sequence of string;
begin
var res := new StringBuilder(x);
foreach var nw in s.SelectMany(l -> l.ToWords()) do
begin
var w: string;
if res.Length=0 then
w := nw else
w := ' ' + nw;
if res.Length + w.Length < x then
res.Append(w) else
begin
yield res.ToString;
res.Clear;
res.Append(nw);
end;
end;
if res.Length <> 0 then
yield res.ToString;
end;
private static function SizeSeparateSun(x: integer; s: string): sequence of string;
begin
Result := SizeSeparateSun(x, new string[](s));
end;
///Возвращает или задаёт тип разделения текста по строкам
public static auto property SizeSeparateType: SeparateType;
///Возвращает последовательность строк, разделённых по заданной длине способом переноса t
public static function SizeSeparate(t: SeparateType; x: integer; params s: array of string): sequence of string;
begin
case t of
SeparateType.ListMethod: Result := SizeSeparateMy(x, s);
SeparateType.SunMethod: Result := SizeSeparateSun(x, s);
else raise new System.Exception;
end;
end;
///Возвращает последовательность строк, разделённых по ширине консоли способом переноса t
public static function SizeSeparate(t: SeparateType; params s: array of string) := SizeSeparate(t, _width, s);
///Возвращает последовательность строк, разделённых по ширине консоли с отступами по краям способом переноса t
public static function SizeSeparateWSpaces(t: SeparateType; params s: array of string) := SizeSeparate(t, _width - 2, s);
///Возвращает последовательность строк, разделённых по заданной длине стандартным способом переноса
public static function SizeSeparate(x: integer; params s: array of string): sequence of string := SizeSeparate(SizeSeparateType, x, s);
///Возвращает последовательность строк, разделённых по ширине консоли стандартным способом переноса
public static function SizeSeparate(params s: array of string): sequence of string := SizeSeparate(SizeSeparateType, _width, s);
///Возвращает последовательность строк, разделённых по ширине консоли с отступами по краям стандартным способом переноса
public static function SizeSeparateWSpaces(params s: array of string): sequence of string := SizeSeparate(SizeSeparateType, _width - 2, s);
end;
///Представляет класс псевдоокна
Block = class
///--
private const Zero: integer = integer.MinValue;
///--
private const Null: string = '';
///--
private _input: string;
///--
private _output: integer;
///--
private _status: boolean;
///--
private _inthistick: boolean;
///--
private _last: boolean;
///Изменяет вывод
private procedure SetOut(a: integer);
begin
_output:=a;
end;
///Ввод
public property Input: string read _input;
///Вывод
public property Output: integer read _output write SetOut;
///Состояние
public property Status: boolean read _status;
///--
public static function operator implicit(a: Block): boolean := a._status;
///Переводит Status в false
public procedure Close();
begin
_status:=false;
end;
///Создаёт новый экземпляр класса KTX.Block
public constructor Create();
begin
if not Console.IsInit then Console.Init;
_input:=Null;
_output:=Zero;
_status:=true;
end;
///Обнуляет ввод и вывод
public procedure Reload();
begin
Console.Resize;
_input := Null;
_output := Zero;
_inthistick := false;
end;
///Ввод
public procedure Read(x, y: integer);
begin
Console.Pre;
var s: string = '';
while (s='') and (Console.WindowSizeIsActual) do
begin
Console.SetCursorPosition(x,y);write(': ');
readln(s);
end;
_input:=s;
Console.After;
end;
///Ввод
public procedure Read := Read(1, Console._height - 2);
///Ввод при изменении размера
public procedure ReadWithResize(start, size: integer);
begin
Console.Pre;
var s: string = '';
while (s='') and (Console.WindowSizeIsActual) do
begin
if size>=(Console.Height-start) then
begin
Console.SetCursorPosition(1,size+start+2);
Console.SetCursorPosition(1,size+start+1);
end
else Console.SetCursorPosition(1,Console.Height-2);
write(': ');
readln(s);
end;
_input:=s;
Console.After;
end;
///Даёт свойству Output числовое значение Input, возвращает true, если преобразование выполнено успешно
///Если rec = false, то на одной итерации цикла проводит действие только один раз
public function CalculateOut(rec: boolean): boolean;
begin
if (not _inthistick) or (rec) then
begin
var e: integer;
val(_input, _output, e);
if e = 0 then _last := true else _last := false;
Result := _last;
_inthistick := true;
end else Result := _last;
end;
///Даёт свойству Output числовое значение Input, возвращает true, если преобразование выполнено успешно
///На каждой итерации цикла проводит действие только один раз
public function CalculateOut: boolean := CalculateOut(false);
///Даёт свойству Output числовое значение Input, возвращает true, если преобразование выполнено успешно
///На каждой итерации цикла проводит действие сколь угодно раз
public function RecalculateOut: boolean := CalculateOut(true);
///Возвращает значение, является ли Input является целым числом
public property OutIsDigit: boolean read CalculateOut;
///Возвращает Input текущего псевдоокна
public function ToString: string; override := _input;
end;
///Представляет класс позиций для KeyBlock
StageBlock = class
internal _min, _max: integer;
internal _current: integer;
///Возвращает или задаёт минимально возможную позицию для текущего StageBlock
public property Min: integer read _min write _min := value;
///Возвращает или задаёт максимально возможную позицию для текущего StageBlock
public property Max: integer read _max write _max := value;
///Возвращает или задаёт текущую позицию для текущего StageBlock
public property Current: integer read _current write _current := value;
private constructor := exit;
///Создаёт новый экземпляр StageBlock
public constructor(sbmin, sbmax, sbcur: integer);
begin
if sbmax < sbmin then raise new System.Exception;
if not (sbcur in Range(sbmin,sbmax)) then raise new System.Exception;
_min := sbmin;
_max := sbmax;
_current := sbcur;
end;
///Создаёт новый экземпляр StageBlock, присваивая Current значение по умолчанию
public constructor(sbmin, sbmax: integer) := Create(sbmin, sbmax, 1);
end;
KeyBlockAction = class
public Binds: array of Key;
public Action: System.Action;
public constructor(a: System.Action; params b: array of Key);
begin
Binds := b;
Action := a;
end;
public constructor(a: System.Action);
begin
Binds := nil;
Action := a;
end;
end;
KeyBlockBuilder = class;
///Представляет класс псевдоокна, который управляется клавишами
KeyBlock = class
///-
private _status: boolean;
///-
private _stage: array of StageBlock;
///-
private _input: System.ConsoleKeyInfo;
///-
private _usekeys: array of Key;
///-
private _increasers: array of Key;
///-
private _decreasers: array of Key;
///-
private _exiters: array of Key;
///-
private _confirmers: array of Key;
///-
private _actioners: array of KeyBlockAction;
///-
private _stdstage: integer;
///-
private _stagecheckusing: boolean;
///Состояние блока
public property Status: boolean read _status;
///Возвращает или задаёт значение стандартной позиции
public property CurrentStage: integer read _stage[_stdstage]._current write _stage[_stdstage]._current := value;
///Целочисленные позиции блока
public property Stage[ind: integer]: integer read _stage[ind]._current write _stage[ind]._current := value;
///Позиции блока
public property FullStage[ind: integer]: StageBlock read _stage[ind] write _stage[ind] := value;
///Возвращает или задаёт клавиши, которые повышают стандартную позицию
public property Increasers[ind: integer]: Key read _increasers[ind] write _increasers[ind] := value;
///Возвращает или задаёт клавиши, которые понижают стандартную позицию
public property Decreasers[ind: integer]: Key read _decreasers[ind] write _decreasers[ind] := value;
///Возвращает или задаёт клавиши, которые закрывают данный KeyBlock
public property Exiters[ind: integer]: Key read _exiters[ind] write _exiters[ind] := value;
///Возвращает или задаёт клавиши, которые проводят действие
public property Confirmers[ind: integer]: Key read _confirmers[ind] write _confirmers[ind] := value;
///Возвращает или задаёт классы KeyBlockAction
public property Actioners[ind: integer]: KeyBlockAction read _actioners[ind] write _actioners[ind] := value;
///Задаёт новые клавиши повышения позиции
public procedure SetIncreasers(a: array of Key) := _increasers := a;
///Задаёт новые клавиши выхода из блока
public procedure SetExiters(a: array of Key) := _exiters := a;
///Задаёт новые клавиши действия
public procedure SetConfirmers(a: array of Key) := _confirmers := a;
///Задаёт новые клавиши понижения позиции
public procedure SetDecreasers(a: array of Key) := _decreasers := a;
///Задаёт новые KeyBlockAction'ы
public procedure SetActioners(a: array of KeyBlockAction) := _actioners := a;
private function _confirm: boolean;
begin
if _confirmers <> nil then Result := _confirmers.Contains(_input.Key);
end;
///Возвращает true, если нажата клавиша действия
public property Confirm: boolean read _confirm;
///Возвращает или задаёт стандартную позицию, которая будет использована повышателями и понижателями позиций
public property StandardStage: integer read _stdstage write _stdstage := value;
///Возвращает или задаёт значение, указывающее на то, будут ли происходить проверки позиций в цикле
public property StageChecking: boolean read _stagecheckusing write _stagecheckusing := value;
///Возвращает информацию о введённой клавише
public property Input: System.ConsoleKeyInfo read _input;
private procedure SetKeys(a: array of Key) := _usekeys := a;
///Используемые клавиши в блоке
///При нажатии неиспользуемых не будет обновляться консоль
public property Keys: array of Key read _usekeys write SetKeys;
///Возвращает нажатую клавишу
public function GetInputKey := _input.Key;
///Чтение клавиши
///Если передано true, то изменяет стандартную позицию
public procedure Read(CheckReasers: boolean);
begin
var k := Console.ReadKey;
while ((not _usekeys.Contains(k.Key)) or (_actioners.Any(x -> x.Binds <> nil ? x.Binds.Contains(k.Key) : true))) and (Console.WindowSizeIsActual) do
begin
if _actioners <> nil then
foreach var x in _actioners do
if x.Binds = nil then x.Action.Invoke else if x.Binds.Contains(k.Key) then x.Action.Invoke;
k := Console.ReadKey;
end;
_input := k;
if CheckReasers then
begin
if _increasers <> nil then
if _increasers.Contains(k.Key) then _stage[_stdstage]._current += 1;
if _decreasers <> nil then
if _decreasers.Contains(k.Key) then _stage[_stdstage]._current -= 1;
if _exiters <> nil then
if _exiters.Contains(k.Key) then _status := false;
end;
end;
///Чтение клавиши
public procedure Read := Read(_stagecheckusing);
///Обновляет консоль
///Если передано true, то также проверяет позиции текущего KeyBlock
public procedure Reload(CheckStages: boolean);
begin
if CheckStages then
for var i := 0 to _stage.Length - 1 do
begin
if _stage[i]._current < _stage[i]._min then _stage[i]._current := _stage[i]._max;
if _stage[i]._current > _stage[i]._max then _stage[i]._current := _stage[i]._min;
end;
Console.Resize;
end;
///Обновляет консоль
public procedure Reload := Reload(_stagecheckusing);
///Обновляет консоль
public procedure Update := Reload;
///Изменяет размер параметров блока
public procedure SetSize(length: integer) := SetLength(_stage,length);
///Закрывает данный блок
public procedure Close();
begin
_status := false;
end;
private constructor;
begin
Console.After;
if not Console.IsInit then Console.Init;
_status := true;
end;
///Создаёт новый экземпляр класса KeyBlock
public constructor(a: Func0<KeyBlock>);
///--
public static function operator implicit(a: KeyBlock): boolean := a._status;
end;
///Представляет строитель для класса KeyBlock
KeyBlockBuilder = class
private _Stages := new List<StageBlock>;
private _StdStage: integer;
private _Keys := new List<Key>;
private _Increasers := new List<Key>;
private _Decreasers := new List<Key>;
private _Confirmers := new List<Key>;
private _Exiters := new List<Key>;
private _Actioners := new List<KeyBlockAction>;
private _CheckStages: boolean;
///Возвращает позиции создаваемого объекта KeyBlock
public property Stages[ind: integer]: StageBlock read _Stages[ind];
///Возвращает повышатели позиций создаваемого объекта KeyBlock
public property Increasers[ind: integer]: Key read _Increasers[ind];
///Возвращает понижатели позиций создаваемого объекта KeyBlock
public property Decreasers[ind: integer]: Key read _Decreasers[ind];
///Возвращает клавиши действия создаваемого объекта KeyBlock
public property Confirmers[ind: integer]: Key read _Confirmers[ind];
///Возвращает клавиши выхода позиций создаваемого объекта KeyBlock
public property Exiters[ind: integer]: Key read _Exiters[ind];
///Возвращает все используемые клавиши создаваемого объекта KeyBlock
public property Keys[ind: integer]: Key read _Keys[ind];
///Возвращает или задаёт значение, которое показывает, будет ли вестись проверка позиций создаваемого объекта KeyBlock
public property CheckStages: boolean read _CheckStages write _CheckStages := value;
///Возвращает или задаёт значение, которое показывает стандартную позицию создаваемого объекта KeyBlock
public property StandardStage: integer read _StdStage write _StdStage := value;
///Добавляет клавишу в создаваемый объект KeyBlock
public procedure AddKey(a: Key) := _Keys.Add(a);
///Добавляет клавиши в создаваемый объект KeyBlock
public procedure AddKeys(a: sequence of Key) := _Keys.AddRange(a);
///Добавляет клавиши в создаваемый объект KeyBlock
public procedure AddKeys(params a: array of Key) := AddKeys(a as IEnumerable<Key>);
///Добавляет новый KeyBlockAction в создаваемый объект KeyBlock
public procedure AddAction(a: KeyBlockAction) := _Actioners.Add(a);
///Добавляет новый KeyBlockAction в создаваемый объект KeyBlock
public procedure AddAction(a: System.Action) := _Actioners.Add(new KeyBlockAction(a));
///Добавляет новые KeyBlockAction'ы в создаваемый объект KeyBlock
public procedure AddAction(a: sequence of KeyBlockAction) := _Actioners.AddRange(a);
///Добавляет новые KeyBlockAction'ы в создаваемый объект KeyBlock
public procedure AddAction(a: sequence of System.Action);
begin
foreach var x in a do _Actioners.Add(new KeyBlockAction(x));
end;
///Добавляет новые KeyBlockAction'ы в создаваемый объект KeyBlock
public procedure AddAction(params a: array of KeyBlockAction) := AddAction(a as IEnumerable<KeyBlockAction>);
///Добавляет новые KeyBlockAction'ы в создаваемый объект KeyBlock
public procedure AddAction(params a: array of System.Action) := AddAction(a as IEnumerable<System.Action>);
///Добавляет новый KeyBlockAction в создаваемый объект KeyBlock
public procedure RemoveAction(a: KeyBlockAction) := _Actioners.Remove(a);
///Добавляет новые KeyBlockAction'ы в создаваемый объект KeyBlock
public procedure RemoveAction(a: sequence of KeyBlockAction) := foreach var x in a do _Actioners.Remove(x);
///Добавляет новые KeyBlockAction'ы в создаваемый объект KeyBlock
public procedure RemoveAction(params a: array of KeyBlockAction) := AddAction(a as IEnumerable<KeyBlockAction>);
///Добавляет позицию в создаваемый объект KeyBlock
public procedure AddStage(a: StageBlock) := _Stages.Add(a);
///Добавляет позицию в создаваемый объект KeyBlock
public procedure AddStage(min, max, cur: integer) := _Stages.Add(new StageBlock(min, max, cur));
///Добавляет позицию в создаваемый объект KeyBlock
public procedure AddStage(min, max: integer) := _Stages.Add(new StageBlock(min, max));
///Удаляет позицию с позиции i массива позиций из создаваемого объекта KeyBlock
public procedure RemoveStage(i: integer) := _Stages.RemoveAt(i);
///Удаляет позицию из создаваемого объекта KeyBlock
public procedure RemoveStage(a: StageBlock) := _Stages.Remove(a);
///Удаляет клавишу из создаваемого объекта KeyBlock
public procedure RemoveKey(a: Key) := _Keys.Remove(a);
///Удаляет клавиши из создаваемого объекта KeyBlock
public procedure RemoveKeys(a: sequence of Key) := foreach var x in a do _Keys.Remove(x);
///Удаляет клавиши из создаваемого объекта KeyBlock
public procedure RemoveKeys(params a: array of Key) := RemoveKeys(a as IEnumerable<Key>);
///Добавляет клавишу, которые повышают позицию, в создаваемый объект KeyBlock
public procedure AddIncreaser(a: Key);
begin
if not _Keys.Contains(a) then _Keys.Add(a);
_Increasers.Add(a);
end;
///Добавляет клавиши, которые повышают позицию, в создаваемый объект KeyBlock
public procedure AddIncreasers(a: sequence of Key);
begin
foreach var x in a do
begin
if not _Keys.Contains(x) then _Keys.Add(x);
_Increasers.Add(x);
end;
end;
///Добавляет клавиши, которые повышают позицию, в создаваемый объект KeyBlock
public procedure AddIncreasers(params a: array of Key) := AddIncreasers(a as IEnumerable<Key>);
///Удаляет клавиши, которые повышают позицию, из создаваемого объекта KeyBlock
public procedure RemoveIncreaser(a: Key);
begin
RemoveKey(a);
_Increasers.Remove(a);
end;
///Удаляет клавиши, которые повышают позицию, из создаваемого объекта KeyBlock
public procedure RemoveIncreasers(a: sequence of Key) := foreach var x in a do RemoveIncreaser(x);
///Удаляет клавиши, которые повышают позицию, из создаваемого объекта KeyBlock
public procedure RemoveIncreasers(params a: array of Key) := RemoveIncreasers(a as IEnumerable<Key>);
///Добавляет клавишу, которые понижают позицию, в создаваемый объект KeyBlock
public procedure AddDecreaser(a: Key);
begin
if not _Keys.Contains(a) then _Keys.Add(a);
_Decreasers.Add(a);
end;
///Добавляет клавиши, которые понижают позицию, в создаваемый объект KeyBlock
public procedure AddDecreasers(a: sequence of Key);
begin
foreach var x in a do
begin
if not _Keys.Contains(x) then _Keys.Add(x);
_Decreasers.Add(x);
end;
end;
///Добавляет клавиши, которые понижают позицию, в создаваемый объект KeyBlock
public procedure AddDecreasers(params a: array of Key) := AddDecreasers(a as IEnumerable<Key>);
///Удаляет клавиши, которые понижают позицию, из создаваемого объекта KeyBlock
public procedure RemoveDecreaser(a: Key);
begin
RemoveKey(a);
_Decreasers.Remove(a);
end;
///Удаляет клавиши, которые понижают позицию, из создаваемого объекта KeyBlock
public procedure RemoveDecreasers(a: sequence of Key) := foreach var x in a do RemoveDecreaser(x);
///Удаляет клавиши, которые понижают позицию, из создаваемого объекта KeyBlock
public procedure RemoveDecreasers(params a: array of Key) := RemoveDecreasers(a as IEnumerable<Key>);
///Добавляет клавишу действия в создаваемый объект KeyBlock
public procedure AddConfirmer(a: Key);
begin
if not _Keys.Contains(a) then _Keys.Add(a);
_Confirmers.Add(a);
end;
///Добавляет клавиши действия в создаваемый объект KeyBlock
public procedure AddConfirmers(a: sequence of Key);
begin
foreach var x in a do
begin
if not _Keys.Contains(x) then _Keys.Add(x);
_Confirmers.Add(x);
end;
end;
///Добавляет клавиши действия в создаваемый объект KeyBlock
public procedure AddConfirmers(params a: array of Key) := AddConfirmers(a as IEnumerable<Key>);
///Удаляет клавиши действия из создаваемого объекта KeyBlock
public procedure RemoveConfirmer(a: Key);
begin
RemoveKey(a);
_Confirmers.Remove(a);
end;
///Удаляет клавиши действия из создаваемого объекта KeyBlock
public procedure RemoveConfirmers(a: sequence of Key) := foreach var x in a do RemoveConfirmer(x);
///Удаляет клавиши действия из создаваемого объекта KeyBlock
public procedure RemoveConfirmers(params a: array of Key) := RemoveConfirmers(a as IEnumerable<Key>);
///Добавляет клавишу выхода в создаваемый объект KeyBlock
public procedure AddExiter(a: Key);
begin
if not _Keys.Contains(a) then _Keys.Add(a);
_Exiters.Add(a);
end;
///Добавляет клавиши выхода в создаваемый объект KeyBlock
public procedure AddExiters(a: sequence of Key);
begin
foreach var x in a do
begin
if not _Keys.Contains(x) then _Keys.Add(x);
_Exiters.Add(x);
end;
end;
///Добавляет клавиши выхода в создаваемый объект KeyBlock
public procedure AddExiters(params a: array of Key) := AddExiters(a as IEnumerable<Key>);
///Удаляет клавиши выхода из создаваемого объекта KeyBlock
public procedure RemoveExiter(a: Key);
begin
RemoveKey(a);
_Exiters.Remove(a);
end;