-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathuParserValue.pas
More file actions
112 lines (96 loc) · 3.09 KB
/
uParserValue.pas
File metadata and controls
112 lines (96 loc) · 3.09 KB
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
unit uParserValue;
interface
type
TValue = class
strict private
FText: String;
FBoundLeft, FBoundRight: Integer;
protected
procedure SetText(const Value: String); virtual;
{ function PosFromRight(const ASubStr, AStr: string;
AOffset: Integer = 0): Integer;
function PosFromLeft(const ASubStr, AStr: string;
AOffset: Integer = 1): Integer;}
// Äåëàåò êàêóþ-òî ÷àñòü òåêñòà çíà÷åíèåì
// function AddValue(const AText: String; const ALeft, ARight: Integer): TValue;
public
// Ãðàíèöû â êîòîòîðûõ íàõîäÿòñÿ ïîëîæåíèÿ ïîäñòðîêè çíà÷åíèÿ â ðîäèòåëå
property Text: String read FText write SetText; // Îðèãèíàëüíûé òåêñò âûðàæåíèÿ
property BoundLeft: Integer read FBoundLeft write FBoundLeft;
property BoundRight: Integer read FBoundRight write FBoundRight;
function Value: Double; virtual; abstract;
constructor Create; virtual;
destructor Destroy; override;
end;
TValues = class of TValue;
implementation
constructor TValue.Create;
begin
inherited;
end;
destructor TValue.Destroy;
begin
inherited;
end;
procedure TValue.SetText(const Value: String);
begin
FText := Value;
// FExpression := StringReplace(FText, ' ', '',[rfReplaceAll]);
end;
// Ðàáîòàåò òàê æå êàê Pos, íî â ñëó÷àå,åñëè óêàçàí îôôñåò 0, âûäàåò ðåçóëüòàò
{function TValue.PosFromLeft(const ASubStr, AStr: string;
AOffset: Integer = 1): Integer;
var
vStrLen, vSubStrLen: Integer;
vStrI, vSubStrI: Integer; // Ñ÷åò÷èêè
begin
vStrLen := Length(AStr);
vSubStrLen := Length(ASubStr);
for vStrI := AOffset to vStrLen - vSubStrLen do
begin
for vSubStrI := 1 to vSubStrLen do
begin
// Åñëè íå ñîâïàäàåò, òî ïðîïóñêàåì èòåðàöèþ
if (AStr[vStrI + vSubStrI - vSubStrLen] <> ASubStr[vSubStrI]) then
Break;
// Åñëè íàòêíóëîñü íà ãðàíèöó, òî ïðîïóñêàåì èòåðàöèþ
// if Self.IsBound(vStrI + vSubStrI - vSubStrLen) then
// Break;
// Åñëè íîâîå çíà÷åíèå è âñ¸ îê, òî âûõîäèì ñî çíà÷åíèåì ïîçèöèè
if vSubStrI = 1 then
Exit(vStrI - vSubStrLen + 1);
end;
end;
Result := 0;
end; }
// Âûäàåò òå æå çíà÷åíèÿ, ÷òî è Pos, íî èùåò îò îôôñåòà âêëþ÷èòåëüíî âëåâî
// Ïåðâûé ñèìâîë òàê æå èìååò çíà÷åíè 1, à ïîñëåäíèé Length(s);
// Åñëè îôôñåò áîëüøå äëèíû, âñå íîðì, ò.ê. ñòðèíã êàê-òî êîíòðîëëèðóåò âñ¸
{function TValue.PosFromRight(const ASubStr, AStr: string;
AOffset: Integer = 0): Integer;
var
vStrLen, vSubStrLen: Integer;
vStrI, vSubStrI: Integer; // Ñ÷åò÷èêè
begin
vStrLen := Length(AStr);
vSubStrLen := Length(ASubStr);
if AOffset = 0 then
AOffset := vStrLen;
for vStrI := AOffset downto vSubStrLen do
begin
for vSubStrI := vSubStrLen downto 1 do
begin
// Åñëè íå ñîâïàäàåò, òî ïðîïóñêàåì èòåðàöèþ
if (AStr[vStrI + vSubStrI - vSubStrLen] <> ASubStr[vSubStrI]) then
Break;
// Åñëè íàòêíóëîñü íà ãðàíèöó, òî ïðîïóñêàåì èòåðàöèþ
// if Self.IsBound(vStrI + vSubStrI - vSubStrLen) then
// Break;
// Åñëè íîâîå çíà÷åíèå è âñ¸ îê, òî âûõîäèì ñî çíà÷åíèåì ïîçèöèè
if vSubStrI = 1 then
Exit(vStrI - vSubStrLen + 1);
end;
end;
Result := 0;
end; }
end.