Sign in Join
Wiki copytemporary

TAChart Tutorial: Background design/fi: what changed

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

OldNewLine
11# Kaavion taustan suunnittelu
22
33## Johdanto
44
55![](/wiki-images/3/35/Tachart_background_finished.png)
66
77TChart-komponentin vakiokaavioissa on harmaa tausta. Muuttamalla `Color` ominaisuutta on mahdollista muuttaa koko kaavion taustaväriä ja ominaisuutta `BackColor` väriä vaihtamalla kaavion akselien rajaama alueen taustaväri muuttuu. Joka tapauksessa tälläin tehty suunnittelu on aika perinteinen. Onko mahdollista tehdä kaavion taustalle muunlainen suunnittelu?
88
99Tässä opetusohjelmassa esitetään että on suhteellisen helppoa tehdä muunkinlaisia taustoja hyödyntämällä yhtä tai kahta TChart:n tapahtumaa. Aluksi luodaan kaavio joka kartoittaa Lazaruksen latausten määrän muutoksia vuodessa joinakin vuosina. Kaaviota korostetaan näyttämällä Lazaruksen aloitusruutua taustakuvana
1010
1111## Esivalmistelu
1212
1313### Data
1414
1515Sourceforge tarjoaa luettelon Lazaruksen latausmääristä kuukaudessa. Paikasta <http://sourceforge.net/projects/lazarus/files/Lazarus%20Windows%2032%20bits/stats/timeline?dates=2003-01-01+to+2014-09-02> saadaan windows-32 asennustiedoston latausmääristä
1616
1717| Vuosi | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 |
1818|-----------|-------|--------|--------|--------|--------|--------|--------|--------|--------|
1919| Lataukset | 53299 | 119613 | 158060 | 218915 | 190567 | 230108 | 267858 | 298335 | 280586 |
2020
2121Nämä tiedot ovat kaavion perustana.
2222
2323### Kaavion tekeminen
2424
2525Luo uusi projekti ja lisää `TChart` lomakkeelle. Aseta Client-align siten, että kaavion täyttää koko lomakkeen. Vedä lomakkeen rajoja siten, että ikkuna on noin 400 pikseliä leveä ja 300 pikseliä korkea.
2626
2727Kaavio näytetään niin että vuodet (Years) ovat `x`-akselilla ja latauksien määrä (Download count) `y`-akselilla. Siksi mene bottom akselille, löydä ominaisuus `Title` ja kirjoita "Years" (tai "vuodet") kohtaan `Caption`. Jotta tämä Title näytetään, aseta sen kohta `Visible` arvoon `true`.
2828
2929Sopeututa muut ominaisuudet mieleiseksesi: usein otsikko näyttää pärempana lihavoituna ja suurempana (12). Joskus ristikko on ärsyttävää, sen voi poistaa käytöstä asettamalla `Grid` :n `Visible` omaisuus arvoon `false`. Tee samantapaisia muutoksia pystyakselille. Otsikko voisi olla nimeltään "Downloads per year" tai "latauksia vuodessa".
3030
3131Kaavion yläpuolella pitäisi myös laittaa otsikko. Kirjoita teksti "Lazarus lataukset" tai "Lazarus downloads" kaavion `Title` ominaisuuteen `Text`. Jälleen asettamaan kohta `Visible` arvoon `true` jotta otsikko näytetään. Voit myös halutessasi vaihtaa otsikon fontin lihavoiduksi ja kasvattaa sen kokoa hieman.
3232
3333![](/wiki-images/1/1b/Tachart_background_no_data.png) ![](/wiki-images/c/cb/Tachart_background_datapoints_editor.png)
3434
3535Hyvä kuvaaja tyyppi aikasarjoille on bar series (palkkikuvaaja). Aluksi lisäämme `TBarSeries` kaavioon: Kaksoisklikkaa kaaviota. Se avaa "Muokkaa kuvaajia" (series editor) ikkunan. klikkaa "Lisää" ja valitse "Pylväskuvaaja" (Bar series) avautuvasta luettelosta. Emme näe kuvaajaa koska sillä ei vielä ole tietoja.
3636
3737On olemassa useita erilaisia ​​tapoja määrittää kuvaajan data. Koska meillä on vakiodata jotka eivät muutu ohjelman aikana niin on sopivaa käyttää `TListSource`-komponenttia joka tarjoaa editorin tietojen tallentamiseen suunnitteluaikana. ListChartSource löytyy "Chart"-komponenttipaletin toisesta kuvakkeesta. Syöttääksesi tietoja, klikkaamalla kolmea pistettä komponentin `DataPoints` omaisuuden vieressä - tämä avaa "Datapisteiden muokkaimen" (DataPoints editor). Syötä tiedot edellä olevasta taulukosta muokkausikkunan taulukkoon: Siinä "vuosi" menee "X"-sarakkeeseen ja "lataukset" menee "Y"-sarakkeeseen. Mitään ei tarvitse syöttää "Väri" (Color) ja "Teksti" (Text) sarakkeisiin.
3838
3939Lopuksi kytke ListChartSource pylväspalkkikuvaajaan. Jokaisella kuvaajalla on ominaisuus`Source`. Klikkaa avattavaa nuolta ja valitse ListChartSource listasta. Välittömästi Pylväsdiagrammin näkyy.
4040
4141![](/wiki-images/d/d5/Tachart_background_first_version.png)
4242
4343## TChart piirrostapahtumat
4444
4545Toistaiseksi projekti on ollut aivan perustasolla. Joten tutkitaanpas piirtofunktioita...
4646
4747`TChart` tarjoaa useita tapahtumia, johon omaa koodia voidaan "koukuttaa":
4848
4949- Aluksi on piirtoprosessi `OnChartPaint`. Tämä tapahtuma on haasteellinen ja siihen pääsee kiinni vain koodista ei komponenttimuokkaimesta. Se "koukku" on tarjolla ennenkuin mitään piirretään kaaviossa ja tarjoaa `var` parametrin `ADoDefaultDrawing`
5050
5151Asettamalla se arvoon `false` niin se sulkee koko sisäänrakennetun piirustusprosessin ja mahdollistaa maalata kaavion täysin oman maun mukaan. Erittäin jännittävä ominaisuus, mutta liian raju meidän tarkoitukseen ...
5252
5353- Seuraava tapahtuma tapahtuu ennenkuin koko kaavion tausta on piirretty: `OnBeforeDrawBackground` . Siinäkin on `ADoDefaultDrawing` parametri. Jos asetamme sen arvoon `false` voimme korvata kaavion taustan piirtämisen omalla tavalla. Erittäin hyvä tähän tarkoitukseen.
5454
5555Jos jätämme sen arvoon `true` niin kaavioon piirretään perustausta mutta voimme hallita sitä myös komponenttimuokkaimesta.
5656
5757- Kun tausta on piirretty - joko oletuksen mukainen tai muokattu - on toinen tapahtuma `OnAfterDrawBackground`. Sitä voidaan käyttää piirtämään jotain taustassa, joka jää kuvaajan tai akselien alle, jotka piirretään myöhemmin.
5858- Vielä aivan alkuvaiheessa, meillä on `OnBeforeDrawBackwall` tapahtuma. Se tapahtuu ennen kuin rajaavat akselin suorakulmion ( "takaseinä") täytetään sen taustan väri / kuvio. Hyödyntämällä `ADoDefaultDrawing` parametrin taas voimme korvata takaseinään omilla menettelyä. Tämä on se mitä esimerkissä käytetään!
5959- Sitten piirretään kaavion otsikot, akselit, ruudukko, kuvaajat ja legenda (otsikkopalkki). Valitettavasti ei ole olemassa tapahtumia siepata niiden piirtämistä (paitsi legenda joka tarjoaa `OnDrawLegend` tapahtuma). Mutta meillä on joitakin valvonta piirustus prosessin kuluessa ryhmän kaavioelementtejä avulla niiden `ZPosition` ominaisuudella. Jos esimerkiksi kaaviossa, jossa on pylväskuvaaja ja viivakuvaaja ja halua rivi sarja on osittain katettu baareissa joudut antamaan viivakuvaajalle suuremman `ZPosition` arvon kuin pylväskuvaajalla - Ne joilla on suurempi `ZPosition`-arvo piirretään myöhemmin eli pienemmän `ZPosition`-arvon päälle .
6060- Piirtämisen aivan lopussa on tapahtuma, `OnAfterDraw` . Se on yleensä tarkoitettu "hallinnollisiin" tarkoituksiin, esimerkiksi mittaamaan piirtämisen aikaa. Aloitusaika saadaan lukemalla kello `OnChartPaint` tapahtumassa.
6161
6262### Taustakuvan näyttäminen
6363
6464Lazarus logo on tähän tarkoitukseen (Lazaruksen latauksien määrä) sopiva taustakuva. Tässä tämä halutaan akselien rajaamalle alueelle (back wall). Kuten yllä olevasta kaavion tapahtumaluettelosta nähdään niin `OnBeforeDrawBackwall`-tapahtuma sopii tähän hyvin.
6565
6666Ensin meidän täytyy saada logo saataville ohjelmaan. Logotiedoston on nimi "splash_logo.png" ja löytyy Lazarus asennuksen kansiosta "images". Yksinkertaisuuden vuoksi se kopioidaan kansioon johon syntyy ajettava ohjelma ns exe-tiedosto (tai sitten voidaan käyttää koko tiedostopolkua koodissa). Koska logo on png tiedosto tarvitsemme tyyppiä TPortableNetworkGraphic tai - mikä on joustavampi - TPicture. Määritellään muuttuja `FBackImage` jälkimmäisen tyypin muotoon ja lisätään koodin lomakkeen onCreate tapahtumaan kuvatiedoston lataus. Tietenkään älä unohda vapauttaa kuvaa, kun ohjelma sulkeutuu:
6767
6868``` pascal
6969type
7070 TForm1 = class(TForm)
7171 ...
7272 private
7373 FBackImage: TPicture;
7474 ...
7575
7676procedure TForm1.FormCreate(Sender: TObject);
7777begin
7878 FBackImage := TPicture.Create;
7979 FBackImage.LoadFromFile('splash_logo.png');
8080 // or: FBackImage.LoadFromFile('c:\lazarus\images\splash_logo.png');
8181end;
8282
8383procedure TForm1.FormDestroy(Sender: TObject);
8484begin
8585 FBackImage.Free;
8686end;
8787```
8888
8989Kun kuvaa ladaan suoraan tiedostosta edellytetään, että kuva jaetaan yhdessä exe-tiedoston kanssa. Tämä voidaan välttää, jos kuva lisätään resurssina binaaritiedostoon. Tätä varten sinun täytyy luoda resurssi tiedoston, joka sisältää kuvan - katso wiki artikkeli .... miten se tehdään. Lazarus images kansio sisältää valmiin resurssitiedoston logosta: "splash_logo.res". Jos haluat käyttää tätä lähestymistapaa, kopioida tiedoston projektikansioon ja käyttää tätä vaihtoehtoa `OnCreate` koodi (älä unohda lisätä `{$R splash_logo.res}` unitin alussa olevaan `implemenation` osaan):
9090
9191``` pascal
9292...
9393implementation
9494
9595{$R *.lfm}
9696{$R splash_logo.res}
9797
9898procedure TForm1.FormCreate(Sender: TObject);
9999begin
100100 FBackImage := TPicture.Create;
101101 FBackImage.LoadFromResourceName(HInstance, 'splash_logo');
102102end;
103103```
104104
105105Menetelmästä riippumatta mitä päätettiin käyttää - nyt on aika lisätä koodiin kaavion `OnBeforeDrawBackwall` tapahtuma. Se on hyvin yksinkertainen: käytetään hyödyksi Canvas:n StretchDraw metodia ja - tietenkin - asetamme `ADeDefaultDrawing` arvoon `false` jolloin ohitetaan oletus piirtomenetelmä. On tärkeää, että käytetään parametrinä annetun ACanvas:a ja sen StretchDrawmetodia, ei kaavion kankaalle, koska kaavion piirron suorittaa erityinen backend luokka, jotka voivat tarjota erilaisia ​​Canvas-luokkia, esimerkiksi jos kaavio on tulostettava.
106106
107107``` pascal
108108procedure TForm1.Chart1BeforeDrawBackWall(ASender: TChart; ACanvas: TCanvas;
109109 const ARect: TRect; var ADoDefaultDrawing: Boolean);
110110begin
111111 ACanvas.StretchDraw(ARect, FBackImage.Graphic);
112112 ADoDefaultDrawing := false;
113113end;
114114```
115115
116116Koska tapahtumakäsittely on ajonaikaista koodia täytyy ohjelma kääntää jotta nähdään millainen kaavio on tällä hetkellä:
117117
118118![](/wiki-images/0/03/Tachart_background_backwall.png)
119119
120120### Taustan liukuvärjäys
121121
122122Ulkoisella taustaalueella on vielä nähdään "kuuluisa" harmaa tausta. Miten se korvataan liukuvärjäyksellä? Koska Lazaruksen logo on pääosiltaan sininen voidaan liukuväritys aloittaa taivaan sinisellä (`clSkyBlue`) ja päättää se valkoisella (`clWhite`)
123123
124124Piirtotapahtumien yhteenvedosta tiedetään että `OnBeforeDrawBackground` on oikea tapahtuma, joka voidaan käyttää piirtämään kaavion taustan yksin. Mutta miten piirtää liukuvärjäys? Erittäin helppo: Canvas:lla on metodi `GradientFill` jolle annetaan alkava ja päättyvä värit sekä liukuvärjäyksen suunta.
125125
126126``` pascal
127127procedure TForm1.Chart1BeforeDrawBackground(ASender: TChart; ACanvas: TCanvas;
128128 const ARect: TRect; var ADoDefaultDrawing: Boolean);
129129begin
130130 ACanvas.GradientFill(ARect, clSkyBlue, clWhite, gdVertical);
131131 ADoDefaultDrawing := false;
132132end;
133133```
134134
135135![](/wiki-images/2/29/Tachart_background_backwall_gradient.png)
136136
137137### Viimeistely
138138
139139Pylväskuvaajan punaiset palkit näyttävät vähän "aggressiivisilta". Entä hillitympi taivaansininen? Valitse komponenttimuokkaimessa kyseinen BarSeries ja aseta `SeriesColor`:n arvoksi `clSkyBlue`.
140140
141141Ja olisi parempi nähdä enemmän Lazaruksen gepardia joka on suurelta osalta pylväiden takana. Pylväskuvaajilla on ominaisuus `Transparency`. Sen oletusarvo on nolla (0) joka tarkoittaa läpinäkymätön ja suurin sallittu arvo on 255 mikä tarkoittaa täysin läpinäkyvää. Pieni arvo, kuten 64 , lisää jonkin verran läpinäkyvyyttä ja näyttää enemmän gepardin yksityiskohtia, mutta ei työnnä pylväitä liikaa taustalle.
142142
143143Ja nämä lisäykset tekee kaavion, joka näkyy tämän sivun yläreunassa.
144144
145145## Yhteenveto
146146
147147Tässä on perusvaiheet **käyttäjän tekemällä kaavion taustalle**:
148148
149149- Käytä **`OnBeforeDrawBackWall` tapahtumaa** kun haluataan piirtää oma **tausta akselien rajaamaan suorakulmioon**.
150150- Vastaasti käytä **`OnBeforeDrawBackground` tapahtumaa** kun halutaan piirtää **kaavion tausta**.
151151- Aseta näissä piirtometodeissa **`ADoDefaultDrawing`** arvoon **`false`** jotta tapahtuu vain oma piirtäminen.
152152
153153## Lähdekoodi
154154
155155Tämän opetusohjelman lähdekoodi löytyy TAChart:n kansiosta *tutorials/background*.
156156
157157### Project file
158158
159159``` pascal
160160program backimage;
161161
162162{$mode objfpc}{$H+}
163163
164164uses
165165 {$IFDEF UNIX}{$IFDEF UseCThreads}
166166 cthreads,
167167 {$ENDIF}{$ENDIF}
168168 Interfaces, // this includes the LCL widgetset
169169 Forms, main, tachartlazaruspkg
170170 { you can add units after this };
171171
172172{$R *.res}
173173
174174begin
175175 RequireDerivedFormResource := True;
176176 Application.Initialize;
177177 Application.CreateForm(TForm1, Form1);
178178 Application.Run;
179179end.
180180```
181181
182182### Unit `main.pas`
183183
184184``` pascal
185185unit main;
186186{$mode objfpc}{$H+}
187187
188188interface
189189
190190uses
191191 Classes, SysUtils, FileUtil, TAGraph, TASeries, TASources, Forms, Controls,
192192 Graphics, Dialogs;
193193
194194type
195195
196196 { TForm1 }
197197
198198 TForm1 = class(TForm)
199199 Chart1: TChart;
200200 Chart1BarSeries1: TBarSeries;
201201 ListChartSource1: TListChartSource;
202202 procedure Chart1BeforeDrawBackground(ASender: TChart; ACanvas: TCanvas;
203203 const ARect: TRect; var ADoDefaultDrawing: Boolean);
204204 procedure Chart1BeforeDrawBackWall(ASender: TChart; ACanvas: TCanvas;
205205 const ARect: TRect; var ADoDefaultDrawing: Boolean);
206206 procedure FormCreate(Sender: TObject);
207207 procedure FormDestroy(Sender: TObject);
208208 private
209209 { private declarations }
210210 FBackImage: TPicture;
211211 public
212212 { public declarations }
213213 end;
214214
215215var
216216 Form1: TForm1;
217217
218218implementation
219219
220220{$R *.lfm}
221221
222222//{$R splash_logo.res}
223223
224224{ TForm1 }
225225
226226procedure TForm1.FormCreate(Sender: TObject);
227227begin
228228 FBackImage := TPicture.Create;
229229
230230 FBackImage.LoadFromFile('splash_logo.png');
231231 // this assumes that the logo is in the same folder as the binary
232232
233233 // or, using resources:
234234 //FBackImage.LoadFromResourceName(HInstance, 'splash_logo');
235235 // Don't forget ths {$R directive above...
236236end;
237237
238238procedure TForm1.Chart1BeforeDrawBackWall(ASender: TChart; ACanvas: TCanvas;
239239 const ARect: TRect; var ADoDefaultDrawing: Boolean);
240240begin
241241 ACanvas.StretchDraw(ARect, FBackImage.Graphic);
242242 ADoDefaultDrawing := false;
243243end;
244244
245245procedure TForm1.Chart1BeforeDrawBackground(ASender: TChart; ACanvas: TCanvas;
246246 const ARect: TRect; var ADoDefaultDrawing: Boolean);
247247begin
248248 ACanvas.GradientFill(ARect, clSkyBlue, clWhite, gdVertical);
249249 ADoDefaultDrawing := false;
250250end;
251251
252252procedure TForm1.FormDestroy(Sender: TObject);
253253begin
254254 FBackImage.Free;
255255end;
256256
257257end.
258258```
259259
260260### Form file `main.lfm`
261261
262-``` pascal
262+``` lfm
263263object Form1: TForm1
264264 Left = 340
265265 Height = 300
266266 Top = 154
267267 Width = 400
268268 Caption = 'Form1'
269269 ClientHeight = 300
270270 ClientWidth = 400
271271 OnCreate = FormCreate
272272 OnDestroy = FormDestroy
273273 LCLVersion = '1.3'
274274 object Chart1: TChart
275275 Left = 0
276276 Height = 300
277277 Top = 0
278278 Width = 400
279279 AxisList = <
280280 item
281281 Grid.Color = clSkyBlue
282282 Grid.Visible = False
283283 Marks.Format = '%.0n'
284284 Marks.Style = smsCustom
285285 Minors = <>
286286 Title.LabelFont.Height = -16
287287 Title.LabelFont.Orientation = 900
288288 Title.LabelFont.Style = [fsBold]
289289 Title.Visible = True
290290 Title.Caption = 'Downloads per year'
291291 end
292292 item
293293 Grid.Visible = False
294294 Alignment = calBottom
295295 Minors = <>
296296 Title.LabelFont.Height = -16
297297 Title.LabelFont.Style = [fsBold]
298298 Title.Visible = True
299299 Title.Caption = 'Year'
300300 end>
301301 Foot.Brush.Color = clBtnFace
302302 Foot.Font.Color = clBlue
303303 Title.Brush.Color = clBtnFace
304304 Title.Brush.Style = bsClear
305305 Title.Font.Color = clNavy
306306 Title.Font.Height = -17
307307 Title.Font.Style = [fsBold]
308308 Title.Text.Strings = (
309309 'Lazarus Downloads'
310310 )
311311 Title.Visible = True
312312 OnBeforeDrawBackground = Chart1BeforeDrawBackground
313313 OnBeforeDrawBackWall = Chart1BeforeDrawBackWall
314314 Align = alClient
315315 ParentColor = False
316316 object Chart1BarSeries1: TBarSeries
317317 Shadow.Color = clNavy
318318 Shadow.OffsetX = 4
319319 BarBrush.Color = clSkyBlue
320320 Source = ListChartSource1
321321 end
322322 end
323323 object ListChartSource1: TListChartSource
324324 DataPoints.Strings = (
325325 '2005|53299|?|'
326326 '2006|119613|?|'
327327 '2007|158060|?|'
328328 '2008|218915|?|'
329329 '2009|190567|?|'
330330 '2010|230108|?|'
331331 '2011|267858|?|'
332332 '2012|298335|?|'
333333 '2013|280586|?|'
334334 )
335335 left = 120
336336 top = 56
337337 end
338338end
339339```
340340
341341---
342342*From the Free Pascal wiki, page "TAChart Tutorial: Background design/fi", as it stood on 2020-02-28 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