Sign in Join
Wiki copytemporary

TAChart Tutorial: Userdefined ChartSource/fi: what changed

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

OldNewLine
11## Johdanto
22
33![](/wiki-images/4/40/TAChart_Population6.png)
44
55Tässä opetusohjelmassa käytämme TAChart-komponentteja piirtämään ikäjakauman maailman väestöstä. Näin tehdessään, opit
66
77- miten työskennellä [[TAChart documentation|aluekuvaajan]] kanssa
88- ja ennen kaikkea, miten soveltaa [[TAChart documentation|käyttäjän määrittämää dataa kaaviossa]]
99
1010Kuten tavallista, oletamme, että olet perehtynyt Lazarukseen ja Object Pascal kieleen ja on joitakin perustietoja TAChart paketista, jotka voit käymällä läpi [[TAChart Tutorial: Getting started/fi|Aloittajan opetusohjelman]].
1111
1212## Esivalmistelu
1313
1414### Data
1515
1616Saitti [www.census.gov](http://www.census.gov) sisältää runsaasti demografista tietoa. Tämä [linkki](http://www.census.gov/population/international/data/worldpop/tool_population.php) vie suoraan tietoihin, jotka halutaan piirtää: maailman väestö iän ja sukupuolen mukaan.
1717
1818Mene sivulle, valitse ja klikkaa "submit" (lähetä). Ikkunan alaosassa, näet taulukon sarakkeet *"Age"*, *"Both Sexes Population"*, *"Male population"*, *"Female population"* ja *"Sex ratio"*. Valitse hiirellä taulukon tiedot (mukaan lukien otsikko) ja kopioi ne leikepöydälle. Liitä tiedot tekstieditoriin ja tallenna nimellä "population.txt".
1919
2020Avaa Lazarus ja luo uusi projekti. Ensin meidän täytyy ladata tietoja, jotta ne voidaan piirtää.
2121
2222Määritellään tietue `TPopulationRecord` ja taulukko `TPopulationArray` joka pitää väestön tiedot taulukossa:
2323
2424``` pascal
2525type
2626 TPopulationRecord = record
2727 Age: Integer;
2828 Total: Double;
2929 Male: Double;
3030 Female: Double;
3131 Ratio: Double;
3232 end;
3333
3434 TPopulationArray = array of TPopulationRecord;
3535```
3636
3737Seuraavaksi luetaan tiedosto. Tutustu käännösyksikköön (unit) `population.pas` [[TAChart Tutorial: Userdefined ChartSource|lähdekoodiin]]. Löydät sieltä:
3838
3939``` pascal
4040procedure LoadPopulationData(const AFilename:string; var Data:TPopulationArray)
4141```
4242
4343mikä tekee tiedoston lukemisen ja tallentaa datan `TPopulationArray` taulukkoon.
4444
4545Sisällytä käännösyksikkö (unit) `population` `uses` -lauseen luetteloon jotta päästään käsiksi kyseiseen aliohjelmaan. Lisää muuttuja `PopulationData` joka on tyypiltään `TPopulationArray` lomakkeen luokan `private` osioon. Nyt meillä on kaikki valmiina jotta voidaan kutsua `LoadPopulationData` lomakkeen OnCreate tapahtumasta. Tämä lukee tiedoston tiedot taulukkoon `PopulationData`.
4646
4747``` pascal
4848uses
4949 ..., population;
5050
5151type
5252 TForm1 = class(TForm)
5353 // ...
5454 private
5555 PopulationData : TPopulationArray;
5656 // ...
5757 end;
5858
5959const
6060 POPULATION_FILE = 'population.txt';
6161
6262procedure TForm1.FormCreate(Sender: TObject);
6363begin
6464 LoadPopulationData(POPULATION_FILE, PopulationData);
6565end;
6666```
6767
6868Käännä tarkistaaksesi ilmeiset virheet pois. Voit saada ajonaikaisen virheen (runtime error), että tiedosto ei löydy. Tämä johtuu siitä, että tiedosto oletetaan sijaitsevan samassa kansiossa kuin ajettava tiedosto (ns. exe-tiedosto). Voit korjata tämän, joko muuttamalla vakio `POPULATION_FILE` osoittamaan oikeaan tallennuspaikkaan, tai kopioida "population.txt" on exe-kansioon. Nyt ohjelma pitäisi toimia hyvin, näet vaikka näet vain tyhjän lomakkeen.
6969
7070### Yhdistelmäruutu ComboBox ryhmän valitsimena
7171
7272Tiedosto sisältää eri ryhmiä: koko, miespuolinen ja naispuolinen väestö sekä mies-nais suhde. Miksi se ei näytä näitä tietoja meidän kaaviossa?
7373
7474Tehdään tämä pohjaksi
7575
7676- Lisätään paneeli (TPanel-komponentti) lomakkeelle. Asetetaan sen align arvoon `alTop` ja poistetaan siinä oleva teksti.
7777- Lisätään ComboBox tähän paneelin. Asetetaan sen `Style` arvoon `csDropdownList` , lisätään tekstit "Kokonaisväkiluku", "Miesväestö", "Naisväestö" ja "Suhde mies / nainen (%)" `Items` omaisuuteen sekä asetetaan `ItemIndex` arvoon 0.
7878
7979### Valmistellaan TChart
8080
8181Nyt on esivalmistelut tehty. On aika valmistella kaaviota...
8282
8383- Lisää `TChart` komponentti lomakkeelle, aseta sen align arvoon `alClient`.
8484- Aseta kaavion `BackColor` arvoon `clWhite` ja kummankin akselin `Grid.Color` arvoon `clSilver`.
8585- Laita kummankin akselin otsikot näkyviin asettamalla `LeftAxis.Visible` ja `BottomAxis.Visible` arvoon `true`.
8686- Kirjoita bottom akselin `Caption` ominaisuuteen joko "Age" tai "Ikä" ja left akselille "Total population" (tai jätä tyhjäksi - myöhemmin se korvataan kyseisen suorituksen mukaisen valinnan mukaan mikä on ComboBox:ssa valittuna )
8787- Kirjoita teksti "World population" tai "Maailman väestö" kaavion otsikoksi.
8888- Laita näiden fontin tyylit arvoon `fsBold`.
8989- Ehkä olisi hyvä idea näyttää viittaus mistä tiedot ovat peräisin. [[TAChart documentation|Footer]] - eli kaavion ominaisuus `Foot` voidaan käyttää tähän. Huomaa, että omaisuuteen Foot.Text (samoin kuin Title.Text ) voidaan merkkijonojen muokkaimen avulla kirjoittaa moni rivisiä otsikoita.
9090
9191![](/wiki-images/6/61/TAChart_Population2.png)
9292
9393## Luodaan aluekuvaaja
9494
9595Tällä kertaa näytetään tiedot [alue kuvaajan](https://en.wikipedia.org/wiki/Area_chart) avulla. Tämän tyyppinen kuvaaja yhdistää datapisteet, kuten viivakuvaaja, mutta myös täyttää alueen tietyllä värillä. On hyvin yleistä näyttää demografiset tiedot, kuten [väestöpyramidi](https://en.wikipedia.org/wiki/Population_pyramid) , tällä tavalla.
9696
9797Joten, lisää [[TAChart documentation|TAreaSeries]] (aluekuvaaja) kaavioon. Kuten tavallista, et näe sitä tällä hetkellä, koska se ei ole vielä mitään tietoa. Mutta voimme muokata sen joitakin ominaisuuksia:
9898
9999- Aseta sen `SeriesColor` arvoon `clSkyBlue`. Tämä on aluekuvaajan täyttöväri.
100100- Piilota pystysuorat viivat asettamalla `AreaLinesPen` :n `Style` arvoon `psClear`.
101101- Jos haluat, voit myös vaihtaa `ConnectType` arvoon `ctStepXY` tai `ctStepYX` saadaksesi askel efektin.
102102
103103Myöhemmin, kun kuvaajalla on dataa, voit tutustua näihin ja muihin ominaisuuksiin paremmin ja nähdä mitä ne tekevät.
104104
105105## Käyttäjän määrittämää dataa kaavioon
106106
107107Miten saadaan oma data aluekuvaajalle?
108108
109109Ensimmäinen ajatus ehkä on käydä läpi `PopulationData` taulukko ja kopioida data kuvaajalle käyttäen `AddXY` kutsua, näin:
110110
111111``` pascal
112112var
113113 i: Integer;
114114begin
115115 for i:=0 to High(PopulationData) do
116116 Chart1AreaSeries1.AddXY(PopulationData[i].Age, PopulationData[i].Total);
117117end;
118118```
119119
120120Haittana tässä lähestymistavassa on, että dataa olisi muistissa kahdesti: `PopulationData` taulukossa ja kuvaajassa - ei kovin hyvä ratkaisu: se tuhlaisi muistia ja lisäksi olisi sovitettava aina myös toisen varaston dataa kun dataa lisätään, poistetaan tai muokataan.
121121
122122![](/wiki-images/e/e0/TAChart_Population3.png)
123123
124124Tämän välttämiseksi lisäämme [[TAChart documentation|TUserDefinedChartSource]] lomakkeelle, se on kolmas tai neljäs kuvake vasemmalta Chart komponenttipaletilla. Tämä kaavio lähde on tehty liitännäksi kaikenlaisten tietojen varastoinnista, tämä lähde itsessään ei tallenna mitään tietoja. Täytyy vain kirjoittaa tapahtuman käsittelijä `OnGetChartDataItem` jotta voidaan siirtää tietoja. Tätä tarkoitusta varten, tapahtuma ottaa `var` parametrin `AItem` joka on tyyppiä `TChartDataItem` , joka on määritelty seuraavasti (elementtejä joita ei tarvita tässä on jätetty pois):
125125
126126``` pascal
127127type
128128 TChartDataItem = object
129129 X, Y: Double;
130130 // ...
131131 end;
132132```
133133
134134Kentät `X` ja `Y` ovat datapisteen koordinaatit.
135135
136136Nyt kirjoitetaan tapahtuman käsittelijä `OnGetChartDataItem`:
137137
138138``` pascal
139139procedure TForm1.UserDefinedChartSource1GetChartDataItem(
140140 ASource: TUserDefinedChartSource; AIndex: Integer; var AItem: TChartDataItem);
141141begin
142142 AItem.X := PopulationData[AIndex].Age;
143143 case Combobox1.ItemIndex of
144144 0: AItem.Y := PopulationData[AIndex].Total;
145145 1: AItem.Y := PopulationData[AIndex].Male;
146146 2: AItem.Y := PopulationData[AIndex].Female;
147147 3: AItem.Y := PopulationData[AIndex].Ratio;
148148 end;
149149end;
150150```
151151
152152`AIndex` on indeksi tietokohtaan joka kysytään. Koska sekä kaavion lähde ja `PopulationData`-taulukko alkaa indeksistä 0 niin vain luetaan data taulukkoa tällä indeksillä ja vastaavaan elementin data kopioidaan `AItem`:n . Huomaa, että poimimme y-koordinaatin sen mukaan, mitä on valittu yhdistelmäruutuun (ComboBox). Tällä tavoin UserDefinedChartSource voi tarjota monenlaisia ​​tietoja.
153153
154154On vielä joitakin tärkeitä asioita tekemättä:
155155
156156- Asettaa että kuvaaja käyttää UserDefinedChartSource:a (sisäänrakennetun lähteen sijaan). Tätä varten laitetaan kuvaajan ominaisuus `Source` osoittamaan `UserDefinedChartSource1` .
157157- Kertoa UserDefinedChartSource:lle kuinka monta datapistettä ulkoisten tietojen taulukko sisältää. Datamäärä syötetään UserDefinedChartSource:n ominaisuuteen `PointsNumber` . Datamäärää tunnetaan sen jälkeen kun procedure `LoadPopulationData`on päättynyt. Niinpä lisätään rivi, joka asettaa `PointsNumber` oikein `FormCreate` metodiin sen jälkeen kun aliohjelmaa `LoadPopulationData` on kutsuttu.
158158- Koska UserDefinedChartSource ei tiedä mitään rakennetta ulkoisista tiedoista niin täytyy ehdottomasti ilmoittaa aina, kun tiedot ovat käytettävissä tai on muutettu. Teemme tämän kutsumalla `UserDefinedChartSource1.Reset`:ä sopivasta paikasta. Joskus olet onnekas että joku muu tapa saattanut tehdä tämän jo. Mutta pitää muistaa, että aina kun kaavio, jossa on UserDefinedChartSource ja se ei käyttäydy odotetulla tavalla on olemassa mahdollisuus, että olet ehkä unohtanut kutsua `Reset`. Testaa, mitä tapahtuu jos "unohtaa" `Reset` kutsun.
159159
160160## Hienosäätö
161161
162162![](/wiki-images/4/48/TAChart_Population4.png)
163163
164164Käännä projekti tässä vaiheessa. Ei aivan huono, joitakin puutteita, vaikka.
165165
166166- Saattaa olla että y-akselin merkinnnät ovat outoja. Miksi he hypätä 80000000, 1 ja sitten 12? Tämä johtuu virheestä joka oli jossain vanhoissa FPC:n versioissa jossa `Format` toiminto ei toiminut oikein suurilla numeroilla. Jos sinulla tämä virhe, vaihda omaisuutta `LeftAxis.Marks.Format`. Tämä merkkijono välitetään `Format` funktiolle joka muuntaa numerot merkkijonoksi. Format tarkenteella "% .0n" vältetään muunnosvirhe ja lisäksi se lisää mukavan tuhaterottimen merkintöihin mikä tekee niistä paljon luettavaa. Huomaa kuitenkin, että "0" katkaisee desimaalit. Siksi tätä format tarkennetta kannattaa käyttää vain suurilla numeroilla.
167167- On pieni väli y-akselin ja täytetty alueen kuvaajan välissä. Samoin on täytetty alue ulottuu vähän x-akselin alle. Tämä johtuu kaavion `Margins` ominaisuudesta. Tämä ominaisuus on yleensä varsin hyödyllistä luoda tyhjän alueella lähellä piste akselilla, vapaa päällekkäisiä tunnuksista ja merkinnöistä. Mutta nyt se on epäedullinen. Joten asettaa `Chart.Margins.Left` ja `Chart.Margins.Bottom` arvoon 0.
168168- Ah niin yhdistelmäruutu (ComboBox) ei toimi vielä. Sille tarvitsee antaa toiminta sen `OnSelect` tapahtumaan. Mitä sillä valitaan? No, kun toinen ComboBox kohde valitaan niin UserDefinedChartSource raportoi sen y-arvon kuvaajalle - sitähän halutaan. Mutta miten saamme `OnGetChartDataItem` kutsuttua? Vain kaavion uudelleen piirtämistä! Kun kuvaaja piirtyy uudelleen se saa aina kyselyn tiedot kaaviosta lähteestä, joten sillä on päivitetyt tiedot automaattisesti. OK - kutsukaamme `Chart1.Invalidate` :
169169
170170``` pascal
171171procedure TForm1.ComboBox1Select(Sender: TObject);
172172begin
173173 Chart1.Invalidate;
174174end;
175175```
176176
177177Kun käännetään ja ohjelman ajossa valitaan toinen ComboBox kohde niin kuvaaja hienosti päivittyy valittuun luokkaan. Mutta akseli on jäätynyt, se ei muutu automaattisesti. Onko tämä virhe? Ei. Muutama rivi aikaisemmin, sanottiin, että kun kaavio, jossa on UserDefinedChartSource ei toimi odotetulla tavalla on olemassa mahdollisuus, että olet ehkä unohtanut kutsua `UserDefinedChartSource.Reset`. Siinä se on: korvataan `Invalidate` `Reset`-kutsulla . Ja voimme korjata myös toisen puutteen: kuvateksti y-akselin pitäisi muuttua, kun toinen luokka on valittu. Tämä onnistuu kopioimalla yhdistelmäruudusta (ComboBox) valittu teksti kaavion `LeftAxis.Title.Caption`. Lisätään tämä rivi yhdistelmäruudun (ComboBox) OnSelect tapahtumakäsittelijään:
178178
179179``` pascal
180180procedure TForm1.ComboBox1Select(Sender: TObject);
181181begin
182182 Chart1.LeftAxis.Title.Caption := Combobox1.Items[Combobox1.ItemIndex];
183183 UserDefinedChartSource1.Reset;
184184end;
185185```
186186
187187Nyt dataluokkien vaihto yhdistelmäruudulla (ComboBox) toimii hyvin.
188188
189189Huomaa vasen alakulma: Koska y arvot eivät sisällä nollaa y-akselilla niin sen takia automaattinen akselin skaalaus ei ala nollasta. Mutta olisi mukavaa, jos siellä oli nolla. Tätä varten meidän täytyy osittain poistaa automaattinen akselin skaalaus. `Chart.Extent` määrittelee minimi ja maksimi x- ja y-arvot suorakulmiota varten . Kun asetamme `Chart.Extent.UseYMin` arvoon `true`, y-akselin minimiksi on otettu arvo `Chart.Extent.YMin` ja tämä on nolla oletuksena. Näin saadaan nolla takaisin.
190190
191191![](/wiki-images/1/13/TAChart_Population5.png)
192192
193193Mutta on toinenkin pieni ongelma nyt: alin ruudukkoviiva piirretään x-akselin päälle. Ensinnäkin, mustat viivat, joita ehkä pidetään akseleina eivät ole akseleita, mutta kuuluvat kehyksen ympärille, ne piirretään kuvaaja alueella oletuksena. Voit testata tämän asettamalla `Chart1.Frame.Visible` väliaikaisesti arvoon `false` . Akseleilla on ominaisuus `AxisPen` jossa "true" kytkee akselin viivan päälle `AxisPen.Visible = true`. Sen jälkeen kun tekee tämän, x-akseli on edelleen katkoviivalla. Tämä johtuu piirustussekvenssistä. Oletuksena y-akseli, yhdessä sen ruudukko, piirretään x-akselin jälkeen. Jos halutaan saada niin että x-akselin piirretään ensin niin mene objektipuuhun ja vedä x-akseli y-akselin edelle.
194194
195195Kun tämän jälkeen käännät ja ajat kaavion niin se on täydellinen.
196196
197197![](/wiki-images/4/40/TAChart_Population6.png)
198198
199199![](/wiki-images/f/fc/TAChart_Population7.png)
200200
201201## Lähdekoodi
202202
203203### Project file
204204
205205``` pascal
206206program project1;
207207
208208{$mode objfpc}{$H+}
209209
210210uses
211211 {$IFDEF UNIX}{$IFDEF UseCThreads}
212212 cthreads,
213213 {$ENDIF}{$ENDIF}
214214 Interfaces, // this includes the LCL widgetset
215215 Forms, Unit1, tachartlazaruspkg, population
216216 { you can add units after this };
217217
218218{$R *.res}
219219
220220begin
221221 RequireDerivedFormResource := True;
222222 Application.Initialize;
223223 Application.CreateForm(TForm1, Form1);
224224 Application.Run;
225225end.
226226```
227227
228228### population.pas
229229
230230``` pascal
231231unit population;
232232
233233{$mode objfpc}{$H+}
234234
235235interface
236236
237237uses
238238 Classes, SysUtils;
239239
240240type
241241 TPopulationRecord = record
242242 Age: Integer;
243243 Total: Double;
244244 Male: Double;
245245 Female: Double;
246246 Ratio: Double;
247247 end;
248248
249249type
250250 TPopulationArray = array of TPopulationRecord;
251251
252252procedure LoadPopulationData(const AFileName: String; var Data: TPopulationArray);
253253
254254implementation
255255
256256procedure LoadPopulationData(const AFileName: String; var Data: TPopulationArray);
257257
258258 function StripThousandSep(const s: String): String;
259259 var
260260 i: Integer;
261261 begin
262262 Result := s;
263263 for i:=Length(Result) downto 1 do
264264 if Result[i] = ',' then
265265 Delete(Result, i, 1);
266266 end;
267267
268268var
269269 List1, List2: TStringList;
270270 i, j, n: Integer;
271271 s: String;
272272 ds: char;
273273begin
274274 ds := FormatSettings.DecimalSeparator;
275275 List1 := TStringList.Create;
276276 try
277277 List1.LoadFromFile(AFileName);
278278 n := List1.Count;
279279 SetLength(Data, n-2);
280280 FormatSettings.DecimalSeparator := '.';
281281 List2 := TStringList.Create;
282282 try
283283 List2.Delimiter := #9;
284284 List2.StrictDelimiter := true;
285285 j := 0;
286286 for i:=2 to n-1 do begin
287287 List2.DelimitedText := List1[i];
288288 s := List1[i];
289289 with Data[j] do begin
290290 if i < n-1 then
291291 Age := StrToInt(trim(List2[0]))
292292 else
293293 Age := 100;
294294 Total := StrToFloat(StripThousandSep(trim(List2[1])));
295295 Male := StrToFloat(StripThousandSep(trim(List2[2])));
296296 Female := StrToFloat(StripThousandSep(trim(List2[3])));
297297 Ratio := StrToFloat(trim(List2[4]));
298298 end;
299299 inc(j);
300300 end;
301301 finally
302302 List2.Free;
303303 end;
304304 finally
305305 FormatSettings.DecimalSeparator := ds;
306306 List1.Free;
307307 end;
308308end;
309309
310310end.
311311```
312312
313313### Unit1.pas
314314
315315``` pascal
316316unit Unit1;
317317
318318{$mode objfpc}{$H+}
319319
320320interface
321321
322322uses
323323 Classes, SysUtils, FileUtil, TAGraph, TASources, TASeries, Forms, Controls,
324324 Graphics, Dialogs, ExtCtrls, StdCtrls, population, TACustomSource;
325325
326326type
327327
328328 { TForm1 }
329329
330330 TForm1 = class(TForm)
331331 Chart1: TChart;
332332 Chart1AreaSeries1: TAreaSeries;
333333 ComboBox1: TComboBox;
334334 Panel1: TPanel;
335335 UserDefinedChartSource1: TUserDefinedChartSource;
336336 procedure ComboBox1Select(Sender: TObject);
337337 procedure FormCreate(Sender: TObject);
338338 procedure UserDefinedChartSource1GetChartDataItem(
339339 ASource: TUserDefinedChartSource; AIndex: Integer;
340340 var AItem: TChartDataItem);
341341 private
342342 { private declarations }
343343 PopulationData: TPopulationArray;
344344 public
345345 { public declarations }
346346 end;
347347
348348var
349349 Form1: TForm1;
350350
351351implementation
352352
353353{$R *.lfm}
354354
355355const
356356 POPULATION_FILE = 'population.txt';
357357
358358{ TForm1 }
359359
360360procedure TForm1.FormCreate(Sender: TObject);
361361begin
362362 LoadPopulationData(POPULATION_FILE, PopulationData);
363363 UserDefinedChartSource1.PointsNumber := Length(PopulationData);
364364 Chart1.LeftAxis.Title.Caption := Combobox1.Items[Combobox1.ItemIndex];
365365end;
366366
367367procedure TForm1.ComboBox1Select(Sender: TObject);
368368begin
369369 Chart1.LeftAxis.Title.Caption := Combobox1.Items[Combobox1.ItemIndex];
370370 UserDefinedChartSource1.Reset;
371371end;
372372
373373procedure TForm1.UserDefinedChartSource1GetChartDataItem(
374374 ASource: TUserDefinedChartSource; AIndex: Integer; var AItem: TChartDataItem);
375375begin
376376 AItem.X := PopulationData[AIndex].Age;
377377 case Combobox1.ItemIndex of
378378 0: AItem.Y := PopulationData[AIndex].Total;
379379 1: AItem.Y := PopulationData[AIndex].Male;
380380 2: AItem.Y := PopulationData[AIndex].Female;
381381 3: AItem.Y := PopulationData[AIndex].Ratio;
382382 end;
383383end;
384384
385385end.
386386```
387387
388388### Unit1.lfm
389389
390-``` pascal
390+``` lfm
391391object Form1: TForm1
392392 Left = 342
393393 Height = 360
394394 Top = 128
395395 Width = 480
396396 Caption = 'World population'
397397 ClientHeight = 360
398398 ClientWidth = 480
399399 OnCreate = FormCreate
400400 Position = poScreenCenter
401401 LCLVersion = '1.1'
402402 object Panel1: TPanel
403403 Left = 0
404404 Height = 36
405405 Top = 0
406406 Width = 480
407407 Align = alTop
408408 ClientHeight = 36
409409 ClientWidth = 480
410410 TabOrder = 0
411411 object ComboBox1: TComboBox
412412 Left = 12
413413 Height = 23
414414 Top = 5
415415 Width = 196
416416 ItemHeight = 15
417417 ItemIndex = 0
418418 Items.Strings = (
419419 'Total population'
420420 'Male population'
421421 'Female population'
422422 'Ratio male/female (%)'
423423 )
424424 OnSelect = ComboBox1Select
425425 Style = csDropDownList
426426 TabOrder = 0
427427 Text = 'Total population'
428428 end
429429 end
430430 object Chart1: TChart
431431 Left = 0
432432 Height = 324
433433 Top = 36
434434 Width = 480
435435 AxisList = <
436436 item
437437 Grid.Visible = False
438438 Alignment = calRight
439439 AxisPen.Visible = True
440440 Marks.Visible = False
441441 Minors = <>
442442 end
443443 item
444444 Grid.Color = clSilver
445445 Alignment = calBottom
446446 AxisPen.Visible = True
447447 Minors = <>
448448 Title.LabelFont.Style = [fsBold]
449449 Title.Visible = True
450450 Title.Caption = 'Age'
451451 end
452452 item
453453 Grid.Color = clSilver
454454 AxisPen.Visible = True
455455 Marks.Format = '%.0n'
456456 Marks.Style = smsCustom
457457 Minors = <>
458458 Title.LabelFont.Orientation = 900
459459 Title.LabelFont.Style = [fsBold]
460460 Title.Visible = True
461461 end>
462462 BackColor = clWhite
463463 Extent.UseYMin = True
464464 Foot.Alignment = taLeftJustify
465465 Foot.Brush.Color = clBtnFace
466466 Foot.Font.Color = clBlue
467467 Foot.Text.Strings = (
468468 'Source:'
469469 'http://www.census.gov/population/international/data/worldpop/tool_population.php'
470470 )
471471 Foot.Visible = True
472472 Margins.Left = 0
473473 Margins.Right = 0
474474 Margins.Bottom = 0
475475 Title.Brush.Color = clBtnFace
476476 Title.Font.Color = clBlue
477477 Title.Font.Style = [fsBold]
478478 Title.Text.Strings = (
479479 'World population'
480480 )
481481 Title.Visible = True
482482 Align = alClient
483483 ParentColor = False
484484 object Chart1AreaSeries1: TAreaSeries
485485 AreaBrush.Color = clSkyBlue
486486 AreaLinesPen.Style = psClear
487487 Source = UserDefinedChartSource1
488488 end
489489 end
490490 object UserDefinedChartSource1: TUserDefinedChartSource
491491 OnGetChartDataItem = UserDefinedChartSource1GetChartDataItem
492492 left = 552
493493 top = 152
494494 end
495495end
496496```
497497
498498---
499499*From the Free Pascal wiki, page "TAChart Tutorial: Userdefined ChartSource/fi", as it stood on 2020-02-29 after a change by Trev, 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).*

Back to history