root/trunk/Forms/frm_create_mask.pas

370427
1
(* *****************************************************************************
2
  *
3
  * MyHomeLib
4
  *
5
  * Version 0.9
6
  * 20.08.2008
7
  * Copyright (c) Aleksey Penkov  alex.penkov@gmail.com
8
  *               Nick Rymanov    nrymanov@gmail.com
9
  ****************************************************************************** *)
10
1
unit frm_create_mask;
11
unit frm_create_mask;
2
12
3
interface
13
interface
...
...
4
14
5
uses
15
uses
6
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
16
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7
  Dialogs, Buttons, StdCtrls, RzButton, ExtCtrls;
17
  Dialogs, Buttons, StdCtrls, ExtCtrls, unit_StaticTip;
8
18
9
type
19
type
10
  TfrmCreateMask = class(TForm)
20
  TfrmCreateMask = class(TForm)
11
    edTemplate: TEdit;
21
    edTemplate: TEdit;
12
    Label1: TLabel;
22
    Label1: TLabel;
13
    Label2: TLabel;
23
    Label2: TLabel;
24
    pnButtons: TPanel;
25
    btnOk: TButton;
26
    btnCancel: TButton;
27
    stDescription: TMHLStaticTip;
14
    Label3: TLabel;
28
    Label3: TLabel;
15
    RzBitBtn1: TRzBitBtn;
16
    RzBitBtn2: TRzBitBtn;
17
    procedure RzBitBtn1Click(Sender: TObject);
29
    procedure RzBitBtn1Click(Sender: TObject);
18
  private
30
  private
19
    { Private declarations }
31
    { Private declarations }
...
...
27
implementation
39
implementation
28
40
29
uses frm_settings;
41
uses frm_settings;
30
31
{$R *.dfm}
42
{$R *.dfm}
32
43
33
procedure TfrmCreateMask.RzBitBtn1Click(Sender: TObject);
44
procedure TfrmCreateMask.RzBitBtn1Click(Sender: TObject);
34
const mask_elements: array[1..4] of string = ('f', 's', 'n', 't');
45
const
35
type TElement = record
46
  mask_elements: array [1 .. 4] of string = ('f', 's', 'n', 't');
36
                  name: string;
47
type
37
                  BegBlock, EndBlock: integer;
48
  TElement = record
38
                end;
49
    name: string;
39
var stack: array[1..10] of TElement;
50
    BegBlock, EndBlock: integer;
40
    Elements: array[1..10] of TElement;
51
  end;
41
    Template: string;
52
var
42
    i, j, StackPos, ElementPos: integer;
53
  stack: array [1 .. 10] of TElement;
43
    bol: boolean;
54
  Elements: array [1 .. 10] of TElement;
55
  Template: string;
56
  i, j, StackPos, ElementPos: integer;
57
  bol: boolean;
44
begin
58
begin
45
  Template:= edTemplate.Text;
59
  Template := edTemplate.Text;
46
  StackPos:= 0;
60
  StackPos := 0;
47
  ElementPos:= 0;
61
  ElementPos := 0;
48
  i:= 1;
62
  i := 1;
49
  while i <= Length(Template) do
63
  while i <= Length(Template) do
50
  begin
64
  begin
51
    if Template[i]='[' then
65
    if Template[i] = '[' then
52
    begin
66
    begin
53
      inc(StackPos);
67
      inc(StackPos);
54
      Stack[StackPos].BegBlock:= i;
68
      stack[StackPos].BegBlock := i;
55
      Stack[StackPos].name:= '';
69
      stack[StackPos].name := '';
56
    end;
70
    end;
57
71
58
    if Template[i]='%' then
72
    if Template[i] = '%' then
59
    begin
73
    begin
60
      if (Stack[StackPos].name <> '') and (StackPos > 0) then
74
      if (stack[StackPos].name <> '') and (StackPos > 0) then
61
      begin
75
      begin
76
        // TODO -oNickR -cRefactoring : использовать общую функцию для пока сообщения об ошибке
62
        ShowMessage('Проверьте правильность шаблона');
77
        ShowMessage('Проверьте правильность шаблона');
63
        exit;
78
        exit;
64
      end;
79
      end;
65
80
66
      inc(i);
81
      inc(i);
67
      Stack[StackPos].name:= '';
82
      stack[StackPos].name := '';
68
      while CharInSet(Template[i], ['a'..'z', 'A'..'Z']) do
83
      while CharInSet(Template[i], ['a' .. 'z', 'A' .. 'Z']) do
69
      begin
84
      begin
70
        Stack[StackPos].name:= Stack[StackPos].name + Template[i];
85
        stack[StackPos].name := stack[StackPos].name + Template[i];
71
        inc(i);
86
        inc(i);
72
      end;
87
      end;
73
88
74
      if StackPos <= 0 then
89
      if StackPos <= 0 then
75
      begin
90
      begin
76
        inc(ElementPos);
91
        inc(ElementPos);
77
        Elements[ElementPos].name:= Stack[StackPos].name;
92
        Elements[ElementPos].name := stack[StackPos].name;
78
        Elements[ElementPos].BegBlock:= 0;
93
        Elements[ElementPos].BegBlock := 0;
79
        Elements[ElementPos].EndBlock:= 0;
94
        Elements[ElementPos].EndBlock := 0;
80
      end;
95
      end;
81
    end;
96
    end;
82
97
83
    if Template[i]=']' then
98
    if Template[i] = ']' then
84
    begin
99
    begin
85
      if (Stack[StackPos].name = '') or (StackPos <= 0) then
100
      if (stack[StackPos].name = '') or (StackPos <= 0) then
86
      begin
101
      begin
102
        // TODO -oNickR -cRefactoring : использовать общую функцию для пока сообщения об ошибке
87
        ShowMessage('Проверьте правильность шаблона');
103
        ShowMessage('Проверьте правильность шаблона');
88
        exit;
104
        exit;
89
      end;
105
      end;
90
106
91
      Stack[StackPos].EndBlock:= i;
107
      stack[StackPos].EndBlock := i;
92
108
93
      inc(ElementPos);
109
      inc(ElementPos);
94
      Elements[ElementPos].name:= Stack[StackPos].name;
110
      Elements[ElementPos].name := stack[StackPos].name;
95
      Elements[ElementPos].BegBlock:= Stack[StackPos].BegBlock;
111
      Elements[ElementPos].BegBlock := stack[StackPos].BegBlock;
96
      Elements[ElementPos].EndBlock:= Stack[StackPos].EndBlock;
112
      Elements[ElementPos].EndBlock := stack[StackPos].EndBlock;
97
113
98
      dec(StackPos);
114
      dec(StackPos);
99
    end;
115
    end;
...
...
103
119
104
  for i := 1 to ElementPos do
120
  for i := 1 to ElementPos do
105
  begin
121
  begin
106
    bol:= false;
122
    bol := false;
107
    for j := 1 to High(mask_elements) do
123
    for j := 1 to High(mask_elements) do
108
      if Elements[i].name = mask_elements[j] then
124
      if Elements[i].name = mask_elements[j] then
109
        bol:= true;
125
        bol := true;
110
126
111
    if not(bol) then
127
    if not(bol) then
112
      break;
128
      break;
...
...
114
130
115
  if not(bol) then
131
  if not(bol) then
116
  begin
132
  begin
133
    // TODO -oNickR -cRefactoring : использовать общую функцию для пока сообщения об ошибке
117
    ShowMessage('Неверные элементы шаблона');
134
    ShowMessage('Неверные элементы шаблона');
118
    exit;
135
    exit;
119
  end;
136
  end;
120
137
121
ModalResult:= mrOk;
138
  ModalResult := mrOk;
122
end;
139
end;
123
140
124
end.
141
end.