Sign in Join
Wiki copytemporary

How To Use TFPExpressionParser/fi: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-TFPExpressionParser sallii analysoida ja laskea [[expression/fi|laskuja]] kuten `sin(x)*cos(2*x)` [[Variable/fi|muuttujan]] `x` millä tahansa arvolla. Matemaattisten lausekkeiden lisäksi se voi käsitellä myös [[Boolean/fi|boolean]] arvoja, merkkijonoja, [[TDateTime/fi|päivämäärän/ajan]] arvoja jne. Jopa käyttäjän antamat toiminnot voidaan yhdistää.
1+TFPExpressionParser sallii analysoida ja laskea [[expression/fi|laskuja]] kuten `sin(x)*cos(2*x)` [[Variable/fi|muuttujan]] `x` millä tahansa arvolla. Matemaattisten lausekkeiden lisäksi se voi käsitellä myös [[Boolean/fi|boolean]] arvoja, merkkijonoja, [[TDateTime/fi|päivämäärän/ajan]] arvoja jne. Jopa käyttäjän antamat toiminnot voidaan yhdistää.
22
3-Se kuuluu [[FPC/fi|FPC]]:n [[FCL/fi|Free Component Library (FCL)]]-kirjastoon ja se on toteutettu [[Unit/fi|käännösyksikössä (unit)]] `fpexprpars.pp`, kansio `(fpc_source_dir)/packages/fcl-base/src`. Lisätään vain `fpexprpars` [[Uses/fi|uses]]-lauseseen jotta saadaan pääsy sen toiminnallisuuteen. ´ Katsomalla tiedostoa "fpexprpars.txt" (kohdassa `(fpc_source_dir)/packages/fcl-base/examples`) nähdään lyhyt dokumentaatio siitä.
3+Se kuuluu [[FPC/fi|FPC]]:n [[FCL/fi|Free Component Library (FCL)]]-kirjastoon ja se on toteutettu [[Unit/fi|käännösyksikössä (unit)]] `fpexprpars.pp`, kansio `(fpc_source_dir)/packages/fcl-base/src`. Lisätään vain `fpexprpars` [[Uses/fi|uses]]-lauseseen jotta saadaan pääsy sen toiminnallisuuteen. ´ Katsomalla tiedostoa "fpexprpars.txt" (kohdassa `(fpc_source_dir)/packages/fcl-base/examples`) nähdään lyhyt dokumentaatio siitä.
44
5-## Parserin luominen
5+
66
7-Parserin/Jäsentimen voi luoda tällaisella instanssilla:
7+## Parserin luominen
88
9-``` pascal
9+Parserin/Jäsentimen voi luoda tällaisella instanssilla:
10+```
1011uses
11- fpexprpars;
12-
13-var
14- FParser: TFPExpressionParser;
15-begin
16- FParser := TFpExpressionParser.Create(self);
17- // ... do something (see below)
12+ fpexprpars;
13+
14+ var
15+ FParser: TFPExpressionParser;
16+ begin
17+ FParser := TFpExpressionParser.Create(self);
18+ // ... do something (see below)
1819```
1920
20-Jos tätä kutsutaan [[TForm/fi|lomakkeen]] [[Method/fi|metodista]], "[[Self/fi|self]]" viittaa lomakkeeseen. Koska jäsennin periytyy `TComponent`-luokasta, sitä ei tarvitse tuhota nimenomaisesti, koska sen omistaja, lomake, tekee sen. Toisaalta on myös mahdollista luoda jäsennin missä tahansa [[Program/fi|ohjelmassa]] ilman lomaketta tai edes [[Class/fi|luokkaa]]; käytä tässä tapauksessa [[Nil/fi|nil]] jäsentimen omistajana, mutta älä unohda `.Free` kutsua tällöin käytön jälkeen:
21-
22-``` pascal
21+Jos tätä kutsutaan [[TForm/fi|lomakkeen]] [[Method/fi|metodista]], "[[Self/fi|self]]" viittaa lomakkeeseen. Koska jäsennin periytyy `TComponent`-luokasta, sitä ei tarvitse tuhota nimenomaisesti, koska sen omistaja, lomake, tekee sen. Toisaalta on myös mahdollista luoda jäsennin missä tahansa [[Program/fi|ohjelmassa]] ilman lomaketta tai edes [[Class/fi|luokkaa]]; käytä tässä tapauksessa `[[Nil/fi|nil]]` jäsentimen omistajana, mutta älä unohda `.Free` kutsua tällöin käytön jälkeen:
22+```
2323uses
24- fpexprpars;
25-
26-var
27- FParser: TFPExpressionParser;
28-begin
29- FParser := TFPExpressionParser.Create(nil);
30- try
31- // ... do something (see below)
32- finally
33- FParser.Free;
34- end;
35-end;
24+ fpexprpars;
25+
26+ var
27+ FParser: TFPExpressionParser;
28+ begin
29+ FParser := TFPExpressionParser.Create(nil);
30+ try
31+ // ... do something (see below)
32+ finally
33+ FParser.Free;
34+ end;
35+ end;
3636```
3737
3838## Sisäänrakennetut luokat
3939
40-Parseri on suunniteltu hyvin joustavasti, mutta oletusparseri on melko tyhmä. Siihen on määritettävä, mitä lausekkeita se hyväksyy. Tämä tehdään lisäämällä vastaava [[Identifier/fi|tunniste]] sisäänrakennettujen luokkien joukkoon. Niihin pääsee parserin [[Property/fi|ominaisuudella]] `BuiltIns`:
41-
42-``` pascal
40+Parseri on suunniteltu hyvin joustavasti, mutta oletusparseri on melko tyhmä. Siihen on määritettävä, mitä lausekkeita se hyväksyy. Tämä tehdään lisäämällä vastaava [[Identifier/fi|tunniste]] sisäänrakennettujen luokkien joukkoon. Niihin pääsee parserin [[Property/fi|ominaisuudella]] `BuiltIns`:
41+```
4342type
44- TBuiltInCategory = (bcStrings, bcDateTime, bcMath, bcBoolean, bcConversion, bcData, bcVaria, bcUser);
45- TBuiltInCategories = set of TBuiltInCategory;
43+ TBuiltInCategory = (bcStrings, bcDateTime, bcMath, bcBoolean, bcConversion, bcData, bcVaria, bcUser);
44+ TBuiltInCategories = set of TBuiltInCategory;
4645```
4746
48-Tässä on kokoelma sisäänrakennettuja symboleja, joita voidaan käyttää lisäämällä luokkia parserin `BuiltIns` - jokainen, joka "ymmärtää" [[Pascal/fi|Pascalia]], pitäisi olla selvää, mitä nämä symbolit tarkoittavat ...
49-
50-- **bcStrings**: `Length`, `Copy`, `Delete`, `Pos`, `Lowercase`, `Uppercase`, `StringReplace`, `CompareText`
51-- **bcDateTime**: `Date`, `Time`, `Now`, `DayOfWeek`, `ExtractYear`, `ExtractMonth`, `ExtractDay`, `ExtractHour`, `ExtractMin`, `ExtractSec`, `Extractmsec`, `EncodeDate`, `EncodeTime`, `ShortDayName`, `ShortMonthName`, `LongDayName`, `LongMonthName`
52-- **bcMath**: `cos`, `sin`, `arctan`, `abs`, `sqr`, `sqrt`, `exp`, `ln`, `log`, `frac`, `int`, `round`, `trunc`,
53-- **bcBoolean**: `shl`, `shr`, `IFS`, `IFF`, `IFD`, `IFI` (The `IFxxx` symbols have the same effect as fpc's `IfThen` for string (`IFS`), floating point (`IFF`), date/time (`IFD`), or integer (`IFI`) variables)
54-- **bcConversion**: `IntToStr`, `StrToInt`, `StrToIntDef`, `FloatToStr`, `StrToFloat`, `StrToFloatDef`, `BoolToStr`, `StrToBool`, `StrToBoolDef`, `DateToStr`, `TimeToStr`, `StrToDate`, `StrToDateDef`, `StrToTime`, `StrToTimeDef`, `StrToDateTime`, `StrToDateTimeDef`
47+Tässä on kokoelma sisäänrakennettuja symboleja, joita voidaan käyttää lisäämällä luokkia parserin `BuiltIns` \- jokainen, joka "ymmärtää" [[Pascal/fi|Pascalia]], pitäisi olla selvää, mitä nämä symbolit tarkoittavat ...
5548
56-`bcData`, `bcVaria` ja `bcUser` ei käytetää missään fpexprpars:ssa. Lopussa on ohjeet miten lisätään käyttäjän määrittämiä funktioiia.
49+ * **bcStrings** : `Length`, `Copy`, `Delete`, `Pos`, `Lowercase`, `Uppercase`, `StringReplace`, `CompareText`
50+ * **bcDateTime** : `Date`, `Time`, `Now`, `DayOfWeek`, `ExtractYear`, `ExtractMonth`, `ExtractDay`, `ExtractHour`, `ExtractMin`, `ExtractSec`, `Extractmsec`, `EncodeDate`, `EncodeTime`, `ShortDayName`, `ShortMonthName`, `LongDayName`, `LongMonthName`
51+ * **bcMath** : `cos`, `sin`, `arctan`, `abs`, `sqr`, `sqrt`, `exp`, `ln`, `log`, `frac`, `int`, `round`, `trunc`,
52+ * **bcBoolean** : `shl`, `shr`, `IFS`, `IFF`, `IFD`, `IFI` (The `IFxxx` symbols have the same effect as fpc's `IfThen` for string (`IFS`), floating point (`IFF`), date/time (`IFD`), or integer (`IFI`) variables)
53+ * **bcConversion** : `IntToStr`, `StrToInt`, `StrToIntDef`, `FloatToStr`, `StrToFloat`, `StrToFloatDef`, `BoolToStr`, `StrToBool`, `StrToBoolDef`, `DateToStr`, `TimeToStr`, `StrToDate`, `StrToDateDef`, `StrToTime`, `StrToTimeDef`, `StrToDateTime`, `StrToDateTimeDef`
5754
58-> **Note:** Nämä symbolit eivät ole [[case-sensitive/fi|iso/pieni kirjain kohtaisia]].
55+`bcData`, `bcVaria` ja `bcUser` ei käytetää missään fpexprpars:ssa. Lopussa on ohjeet miten lisätään käyttäjän määrittämiä funktioiia.
5956
60-Jotta matemaattista lauseketta voidaan käyttää niin valinta `bcMath` on lisättävä parserin `Builtins`:
57+![Light bulb](https://upload.wikimedia.org/wikipedia/commons/d/d8/Nuvola_apps_ktip.png) **Huomaa:** Nämä symbolit eivät ole [[case-sensitive/fi|iso/pieni kirjain kohtaisia]].
6158
62-``` pascal
63- FParser.Builtins := [bcMath]; // or FParser.Builtins := FParser.Builtins + [bcMath];
59+Jotta matemaattista lauseketta voidaan käyttää niin valinta `bcMath` on lisättävä parserin `Builtins`:
6460```
61+FParser.Builtins := [bcMath]; // or FParser.Builtins := FParser.Builtins + [bcMath];
62+```
6563
6664## Lausekkeet
6765
6866### Lausekkeet vakioilla
6967
70-Ensimmäisenä esimerkkinä on, että jäsennin laskee hyvin yksinkertaisen lausekkeen `1+1`. Ensimmäinen vaihe on kertoa jäsentimelle, mitä lauseketta lasketaan. Tätä tarkoitusta varten on ominaisuus `Expression`:
71-
72-``` pascal
73- FParser.Expression := '1+1';
68+Ensimmäisenä esimerkkinä on, että jäsennin laskee hyvin yksinkertaisen lausekkeen `1+1`. Ensimmäinen vaihe on kertoa jäsentimelle, mitä lauseketta lasketaan. Tätä tarkoitusta varten on ominaisuus `Expression`:
7469```
75-
76-Seuraava vaihe on laskea lauseke: vain kutsu `Evaluate` tai `EvaluateExpression` -
70+FParser.Expression := '1+1';
71+```
7772
78-ensimmäinen on [[Function/fi|funktio]], kun taas jälkimmäinen on [[Procedure/fi|aliohjelma]], joka antaa tuloksen parametrina.
73+Seuraava vaihe on laskea lauseke: vain kutsu `Evaluate` tai `EvaluateExpression` \-
7974
80-``` pascal
75+ensimmäinen on [[Function/fi|funktio]], kun taas jälkimmäinen on [[Procedure/fi|aliohjelma]], joka antaa tuloksen parametrina.
76+```
8177var
82- parserResult: TFPExpressionResult;
83-begin
84- ....
85- parserResult := FParser.Evaluate; // or: FParser.EvaluateExpression(parserResult);
78+ parserResult: TFPExpressionResult;
79+ begin
80+ ....
81+ parserResult := FParser.Evaluate; // or: FParser.EvaluateExpression(parserResult);
8682```
8783
88-Mikä on se salaperäinen `TFPExpressionResult`? Koska parseri on hyvin joustava ja voi käsitellä numeroita, merkkijonoja, päivämääriä / aikoja tai boolean arvoja, on oltava monimutkaisempi tietotyyppi, joka palauttaa laskentatuloksen:
84+Mikä on se salaperäinen `TFPExpressionResult`? Koska parseri on hyvin joustava ja voi käsitellä numeroita, merkkijonoja, päivämääriä / aikoja tai boolean arvoja, on oltava monimutkaisempi tietotyyppi, joka palauttaa laskentatuloksen:
8985
90-``` pascal
91-type
92- TResultType = (rtBoolean, rtInteger, rtFloat, tDateTime, rtString);
86+
9387
94- TFPExpressionResult = record
95- ResString : String;
96- Case ResultType : TResultType of
97- rtBoolean : (ResBoolean : Boolean);
98- rtInteger : (ResInteger : Int64);
99- rtFloat : (ResFloat : TExprFloat);
100- rtDateTime : (ResDateTime : TDatetime);
101- rtString : ();
102- end;
10388```
104-
105-Jäsen `ResultType` -signaalit, jonka vain yksi tietokentistä on voimassa. On tärkeää ymmärtää tämä, koska parseri on hyvin tiukka [[Data type|tietotyyppien]] suhteen.
89+type
90+ TResultType = (rtBoolean, rtInteger, rtFloat, tDateTime, rtString);
91+
92+ TFPExpressionResult = record
93+ ResString : String;
94+ Case ResultType : TResultType of
95+ rtBoolean : (ResBoolean : Boolean);
96+ rtInteger : (ResInteger : Int64);
97+ rtFloat : (ResFloat : TExprFloat);
98+ rtDateTime : (ResDateTime : TDatetime);
99+ rtString : ();
100+ end;
101+```
106102
107-Esimerkissä lisätään kaksi [[Integer/fi|kokonaislukua]], joten tulos on myös kokonaisluku. Jos toisaalta olisimme käyttäneet lauseketta `"1.0 + 1"` niin ensimmäinen numero olisi ollut reaaliluku ja tulos olisi ollut reaaliluku! Siksi on aina tarkasteltava `TFPExpressionResult`-jäsenen `ResultType`-tyyppiä ennen tuloksen valintaa. Lausekkeen tulosdatatyypin käytön yksinkertaistamiseksi `fpexprpars` paljastaa funktion `ArgToFloat`, joka saa koko lausekkeen tulos [[Record/fi|tietueen]] parametriksi ja valitsee oikean komponentin, jos reaaliluku tulosta odotetaan:
103+Jäsen `ResultType` -signaalit, jonka vain yksi tietokentistä on voimassa. On tärkeää ymmärtää tämä, koska parseri on hyvin tiukka [[Data type|tietotyyppien]] suhteen.
108104
109-``` pascal
105+Esimerkissä lisätään kaksi [[Integer/fi|kokonaislukua]], joten tulos on myös kokonaisluku. Jos toisaalta olisimme käyttäneet lauseketta `"1.0 + 1"` niin ensimmäinen numero olisi ollut reaaliluku ja tulos olisi ollut reaaliluku! Siksi on aina tarkasteltava `TFPExpressionResult`-jäsenen `ResultType`-tyyppiä ennen tuloksen valintaa. Lausekkeen tulosdatatyypin käytön yksinkertaistamiseksi `fpexprpars` paljastaa funktion `ArgToFloat`, joka saa koko lausekkeen tulos [[Record/fi|tietueen]] parametriksi ja valitsee oikean komponentin, jos reaaliluku tulosta odotetaan:
106+```
110107var
111- parserResult: TFPExpressionResult;
112- resultValue: Double;
113-...
114- parserResult := FParser.Evaluate; // or: FParser.EvaluateExpression(parserResult);
115- resultValue := ArgToFloat(parserResult);
108+ parserResult: TFPExpressionResult;
109+ resultValue: Double;
110+ ...
111+ parserResult := FParser.Evaluate; // or: FParser.EvaluateExpression(parserResult);
112+ resultValue := ArgToFloat(parserResult);
116113```
117114
118-> **Note:** Reaaliluvuilla on oltava [[period/fi|piste]] desimaalierottimena, ei [[Comma/fi|pilkku]], jota käytetään joissakin Euroopan maissa. Jos lausekkeen merkkijono tulee käyttäjän syöttämästä lausekkeesta ja sisältää desimaalilukuja, niin on korvattava pilkku pisteillä ensin ennen sen määrittämistä parserin `Expression`-lausekkeelle.
115+![Light bulb](https://upload.wikimedia.org/wikipedia/commons/d/d8/Nuvola_apps_ktip.png) **Huomaa:** Reaaliluvuilla on oltava [[period/fi|piste]] desimaalierottimena, ei [[Comma/fi|pilkku]], jota käytetään joissakin Euroopan maissa. Jos lausekkeen merkkijono tulee käyttäjän syöttämästä lausekkeesta ja sisältää desimaalilukuja, niin on korvattava pilkku pisteillä ensin ennen sen määrittämistä parserin `Expression`-lausekkeelle.
119116
120117### Lauseke muuttujalla
121118
122-Tässä esimerkissä lasketaan `sin(x)*cos(2*x)` jossa `x = 0.5` (0,5).
119+Tässä esimerkissä lasketaan `sin(x)*cos(2*x)` jossa `x = 0.5` (0,5).
123120
124121#### Muuttujien määrittäminen
125122
126-Aluksi on määriteltävä muuttujat. On vain yksi `x`. Parserilla on [[Method|metodi]] `AddFloatVariable`, joka ilmoittaa reaaliluvun; on myös menetelmiä:
127-
128-- `AddBooleanVariable`
129-- `AddStringVariable`
130-- `AddDateTimeVariable`
123+Aluksi on määriteltävä muuttujat. On vain yksi `x`. Parserilla on [[Method|metodi]] `AddFloatVariable`, joka ilmoittaa reaaliluvun; on myös menetelmiä:
131124
132-boolean-, merkkijono- ja päivämäärä/aika-muuttujille, vastaavasti.
125+ * `AddBooleanVariable`
126+ * `AddStringVariable`
127+ * `AddDateTimeVariable`
133128
134-Jokainen näistä aliohjelmista odottaa muuttujan nimeä sekä sen oletusarvoa. Näyte funktiolle `sin(x)*cos(2*x)` kutsutaan vain:
129+boolean-, merkkijono- ja päivämäärä/aika-muuttujille, vastaavasti.
135130
136-``` pascal
137- FParser.Identifiers.AddFloatVariable('x', 0.5);
131+Jokainen näistä aliohjelmista odottaa muuttujan nimeä sekä sen oletusarvoa. Näyte funktiolle `sin(x)*cos(2*x)` kutsutaan vain:
138132```
133+FParser.Identifiers.AddFloatVariable('x', 0.5);
134+```
139135
140-`0.5` (0,5) syötetään tähän oletusarvoksi, koska se on argumentti, jolla halutaan laskea lauseke (alla näytetään, miten muuttujaa muutetaan). Tästä lähtien jäsennin käyttää tätä numeroa aina, kun se löytää lausekkeessa olevan muuttujan `x`.
136+`0.5` (0,5) syötetään tähän oletusarvoksi, koska se on argumentti, jolla halutaan laskea lauseke (alla näytetään, miten muuttujaa muutetaan). Tästä lähtien jäsennin käyttää tätä numeroa aina, kun se löytää lausekkeessa olevan muuttujan `x`.
141137
142-Voit tietysti lisätä muita nimiä, esim. [[Constant/fi|vakiota]], kuten `e` jne. ([[Pi/fi|Pii (pi)]] on jo sisäänrakennettu).
138+Voit tietysti lisätä muita nimiä, esim. [[Constant/fi|vakiota]], kuten `e` jne. ([[Pi/fi|Pii (`pi`)]] on jo sisäänrakennettu).
143139
144140#### Lausekkeen määrittäminen
145141
146-Seuraavassa vaiheessa lausekkeen merkkijono lähetetään parserille:
147-
148-``` pascal
149- FParser.Expression := 'sin(x)*cos(2*x)';
142+Seuraavassa vaiheessa lausekkeen merkkijono lähetetään parserille:
150143```
144+FParser.Expression := 'sin(x)*cos(2*x)';
145+```
151146
152-On välttämätöntä kutsua tätä muuttujien asettamisen jälkeen, koska jäsentimen on tiedettävä muuttuja lausekkeen analysoimiseksi.
147+On välttämätöntä kutsua tätä muuttujien asettamisen jälkeen, koska jäsentimen on tiedettävä muuttuja lausekkeen analysoimiseksi.
153148
154149#### Lausekkeen laskeminen
155150
156-Tämä tehdään kuten aikaisemmin vakio lausekkeella - tässä on täydellinen aliohjelma, joka näyttää yhtälön ja sen tuloksen [[Dialog Examples|viestiruudussa (ShowMessage)]]:
157-
158-``` pascal
151+Tämä tehdään kuten aikaisemmin vakio lausekkeella - tässä on täydellinen aliohjelma, joka näyttää yhtälön ja sen tuloksen [[Dialog Examples|viestiruudussa (ShowMessage)]]:
152+```
159153var
160- FParser: TFPExpressionParser;
161- resultValue: Double;
162-begin
163- FParser := TFPExpressionParser.Create(nil);
164- try
165- FParser.BuiltIns := [bcMath];
166- FParser.Identifiers.AddFloatVariable('x', 0.5);
167- FParser.Expression := 'sin(x)*cos(2*x)';
168- resultValue := FParser.Evaluate.ResFloat; // or: resultValue := ArgToFloat(FParser.Evaluate);
169- ShowMessage(FParser.Expression + ' = ' + FloatToStr(resultValue));
170- finally
171- FParser.Free;
172- end;
173-end;
154+ FParser: TFPExpressionParser;
155+ resultValue: Double;
156+ begin
157+ FParser := TFPExpressionParser.Create(nil);
158+ try
159+ FParser.BuiltIns := [bcMath];
160+ FParser.Identifiers.AddFloatVariable('x', 0.5);
161+ FParser.Expression := 'sin(x)*cos(2*x)';
162+ resultValue := FParser.Evaluate.ResFloat; // or: resultValue := ArgToFloat(FParser.Evaluate);
163+ ShowMessage(FParser.Expression + ' = ' + FloatToStr(resultValue));
164+ finally
165+ FParser.Free;
166+ end;
167+ end;
174168```
175169
176170#### Muuttujien muuttaminen
177171
178-Toistaiseksi `x`:llä on aina arvo 0,5 - se käyttäytyy kuin vakio, oltaisiin voitu käyttää myös lauseketta `"sin(0.5)*cos(2*0.5)"`.
179-
180-Jotta tämä käyttäytyisi enemmän kuin "muuttuja", lasketaan nyt testi funktion `x`-arvoja välillä -10 ja 10.
172+Toistaiseksi `x`:llä on aina arvo 0,5 - se käyttäytyy kuin vakio, oltaisiin voitu käyttää myös lauseketta `"sin(0.5)*cos(2*0.5)"`.
181173
182-Tärkein kysymys on: Miten määrätty arvo korvataan muuttujalla? On useita mahdollisuuksia - kaikki ne edellyttävät sisäistä muuttujaa `Identifier` (tyyppi `TFPExprIdentifierDef`), joka paljastaa erilaisia ​​tapoja käyttää muuttujia ja niiden ominaisuuksia:
174+Jotta tämä käyttäytyisi enemmän kuin "muuttuja", lasketaan nyt testi funktion `x`-arvoja välillä -10 ja 10.
183175
184-- Käytetään `AddFloatVariable` funktion palautusarvoa.
185-- Haetaan tunniste kutsumalla `FindIdentifierByName`-tunnus muuttujan nimellä parametrina.
186-- Haetaan tunnisteesta`Identifiers` jäsentimen tunnisteiden kokoelmasta käyttämällä muuttujan tunnettua indeksiä: On lisätty `x` ainoana muuttujana, joten sen on oltava indeksissä 0.
176+Tärkein kysymys on: Miten määrätty arvo korvataan muuttujalla? On useita mahdollisuuksia - kaikki ne edellyttävät sisäistä muuttujaa `Identifier` (tyyppi `TFPExprIdentifierDef`), joka paljastaa erilaisia ​​tapoja käyttää muuttujia ja niiden ominaisuuksia:
187177
188-Kun `Identifier` on tunnettu, muuttujan arvoa voidaan muuttaa avaamalla ominaisuus `AsFloat` (tai `AsDateTime` jne. Vastaavasti):
178+ * Käytetään `AddFloatVariable` funktion palautusarvoa.
179+ * Haetaan tunniste kutsumalla `FindIdentifierByName`-tunnus muuttujan nimellä parametrina.
180+ * Haetaan tunnisteesta`Identifiers` jäsentimen tunnisteiden kokoelmasta käyttämällä muuttujan tunnettua indeksiä: On lisätty `x` ainoana muuttujana, joten sen on oltava indeksissä 0.
189181
190-``` pascal
182+Kun `Identifier` on tunnettu, muuttujan arvoa voidaan muuttaa avaamalla ominaisuus `AsFloat` (tai `AsDateTime` jne. Vastaavasti):
183+```
191184var
192- FParser: TFPExpressionParser;
193- argument: TFPExprIdentifierDef;
194- s: string;
195- x: integer;
196- f: double;
197-begin
198- s:='';
199- FParser := TFPExpressionParser.Create(nil);
200- try
201- // Enable the use of mathematical expressions
202- FParser.BuiltIns := [bcMath];
203-
204- // Add the function argument
205- argument := FParser.Identifiers.AddFloatVariable('x', 0.0);
206-
207- // Define the function, using the argument name x as defined above
208- FParser.Expression := 'sin(x)*cos(2*x)';
209-
210- // Calculate some function values
211- for x := -10 to 10 do
185+ FParser: TFPExpressionParser;
186+ argument: TFPExprIdentifierDef;
187+ s: string;
188+ x: integer;
189+ f: double;
212190 begin
213- argument.AsFloat := x; // Set the function argument value
214- f := FParser.Evaluate.ResFloat; // Calculate the function value
215- s := s + format('x[%d]:[%g]' + LineEnding, [x,f]); // Demo output to display the result
191+ s:='';
192+ FParser := TFPExpressionParser.Create(nil);
193+ try
194+ // Enable the use of mathematical expressions
195+ FParser.BuiltIns := [bcMath];
196+
197+ // Add the function argument
198+ argument := FParser.Identifiers.AddFloatVariable('x', 0.0);
199+
200+ // Define the function, using the argument name x as defined above
201+ FParser.Expression := 'sin(x)*cos(2*x)';
202+
203+ // Calculate some function values
204+ for x := -10 to 10 do
205+ begin
206+ argument.AsFloat := x; // Set the function argument value
207+ f := FParser.Evaluate.ResFloat; // Calculate the function value
208+ s := s + format('x[%d]:[%g]' + LineEnding, [x,f]); // Demo output to display the result
209+ end;
210+
211+ // Show the result
212+ ShowMessage(s);
213+
214+ finally
215+ FParser.Free;
216+ end;
216217 end;
217-
218- // Show the result
219- ShowMessage(s);
220-
221- finally
222- FParser.Free;
223- end;
224-end;
225218```
226219
227220## Käyttäjän määrittämien funktioiden lisääminen
228221
229-Oletusparseri tietää vain edellä mainitut sisäänrakennetut funktiot. Yksi parserin vahvuuksista on se, että on hyvin helppo ulottaa muita funktioita. Tämä voidaan tehdä kutsumalla metodia `Identifiers.AddFunction`, esim.
230-
231-``` pascal
232- FParser.Identifiers.AddFunction('tan', 'F', 'F', @ExprTan);
222+Oletusparseri tietää vain edellä mainitut sisäänrakennetut funktiot. Yksi parserin vahvuuksista on se, että on hyvin helppo ulottaa muita funktioita. Tämä voidaan tehdä kutsumalla metodia `Identifiers.AddFunction`, esim.
233223```
234-
235-Tässä esimerkissä lisätään funktio tan(x) määrittelemällä sen nimi, koska se kutsutaan funktion lausekkeissa (ensimmäinen parametri), tulosarvojen tyyppi (toinen parametri, "F" = reaaliluku, "I" = kokonaisluku, "D" = päiväys/aika, "S" = merkkijono tai "B" = boolean) ja syöttöarvojen tyyppi (kolmas parametri, sama logiikka). Jos funktio hyväksyy useita syöttöparametreja, on määritettävä kunkin tyyppi, esim. "FF" kahdella reaaliluvun arvolla tai "FI" ensimmäinen reaaliluku ja toinen on kokonaisluku parametri. Viimeinen parametri osoittaa funktion, jota kutsutaan aina, kun lausekkeen merkkijonossa on "tan". Koska tällä toiminnolla on tietty syntaksi, on se tehtävä omassa lähdekoodissa:
224+FParser.Identifiers.AddFunction('tan', 'F', 'F', @ExprTan);
225+```
236226
237-``` pascal
227+Tässä esimerkissä lisätään funktio tan(x) määrittelemällä sen nimi, koska se kutsutaan funktion lausekkeissa (ensimmäinen parametri), tulosarvojen tyyppi (toinen parametri, "F" = reaaliluku, "I" = kokonaisluku, "D" = päiväys/aika, "S" = merkkijono tai "B" = boolean) ja syöttöarvojen tyyppi (kolmas parametri, sama logiikka). Jos funktio hyväksyy useita syöttöparametreja, on määritettävä kunkin tyyppi, esim. "FF" kahdella reaaliluvun arvolla tai "FI" ensimmäinen reaaliluku ja toinen on kokonaisluku parametri. Viimeinen parametri osoittaa funktion, jota kutsutaan aina, kun lausekkeen merkkijonossa on "tan". Koska tällä toiminnolla on tietty syntaksi, on se tehtävä omassa lähdekoodissa:
228+```
238229procedure ExprTan(var Result: TFPExpressionResult; Const Args: TExprParameterArray);
239-var
240- x: Double;
241-begin
242- x := ArgToFloat(Args[0]);
243- Result.resFloat := tan(x);
244-end;
230+ var
231+ x: Double;
232+ begin
233+ x := ArgToFloat(Args[0]);
234+ Result.resFloat := tan(x);
235+ end;
245236```
246237
247-Laskennan tulos palautetaan parametrina `"Result"`, joka on edellä kuvattu `TFPExpressionResult`. Laskennan argumentit siirtyvät `Args`ille, joka on vain joukko TFPExpressionResult-arvoja - koska parametreilla voi olla useita tietotyyppejä. Termi TFPExpression*Results* on ehkä hieman harhaanjohtava, koska tämä taulukko sisältää kaikki * tulo * -parametrit, jotka on määritelty AddFunction-metodin tulotyypeillä.
238+Laskennan tulos palautetaan parametrina `"Result"`, joka on edellä kuvattu `TFPExpressionResult`. Laskennan argumentit siirtyvät `Args`ille, joka on vain joukko TFPExpressionResult-arvoja - koska parametreilla voi olla useita tietotyyppejä. Termi TFPExpression _Results_ on ehkä hieman harhaanjohtava, koska tämä taulukko sisältää kaikki * tulo * -parametrit, jotka on määritelty AddFunction-metodin tulotyypeillä.
248239
249240---
250-*From the Free Pascal wiki, page "How To Use TFPExpressionParser/fi", as it stood on 2022-08-06 after a change by Kai Burghardt, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
241+*From the Free Pascal wiki, page "How To Use TFPExpressionParser/fi", as the Internet Archive kept it on 2025-04-19, last changed on 2025-01-01. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history