Sign in Join
Wiki copytemporary

TListBox/fi: what changed

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

Title: TListBox/fi

OldNewLine
1+**TListBox** ![](/wiki-images/7/77/Tlistbox.png) on komponentti, joka näyttää (vieritettävän) luettelon merkkijonoista, joista käyttäjä voi valita jonkun. TListBox löytyy [[Component Palette|komponenttipaletin]] [[Standard tab|Standard välilehdeltä]]. TListBox:n [[String|merkkijonot (string)]] on tallennettu *Items* ominaisuuteen. Se on [[TStrings]] tyyppiä. Täten voidaan liittää ja poistaa yhdistelmäruudun merkkijonoja kuten [[TStringList]]:sä tai sen vanhemmassa [[TStringList-TStrings Tutorial|TStrings]]
2+
3+Seuraavassa on muutamia esimerkkejä kuinka käyttää TListBox:a *ListBox1* lomakkeella *Form1*:
4+
5+## ListBox:n täyttö
6+
7+### Komponettimuokkaimella
8+
9+- Valitse ListBox lomakkeella yhdellä klikkauksella.
10+- Mene komponenttimuokkaimessa ominaisuus-välilehden ominaisuuteen *Items*.
11+- Klikkaa painiketta, jossa on kolme pistettä. Merkkijonojen muokkain avautuu.
12+- Kirjoita teksti ja vahvista tekemäsi työ *OK*-painikkeella.
13+
14+### Koodilla painikkeen painamisen yhteydessä
15+
16+Lisätään lomakkeelle [[TButton/fi|painike (TButton)]] joka nimetään *btnFill* ja caption-ominaisuuteen kirjoitetaan *fill ListBox*. Tehdään sille *OnClick* tapahtumankäsittelijä jota täydennetään niin että se näyttää seuraavalta:
17+
18+``` pascal
19+procedure TForm1.btnFillClick(Sender: TObject);
20+begin
21+ ListBox1.Items.Clear; //Poista kaikki olemassa olevat merkkijonot
22+ ListBox1.Items.Add('First line');
23+ ListBox1.Items.Add('Line with random number '+IntToStr(Random(100)));
24+ ListBox1.Items.Add('Third line');
25+ ListBox1.Items.Add('Even a random number '+IntToStr(Random(100)));
26+end;
27+```
28+
29+## StringList:n liittäminen
30+
31+Lisätään lomakkeelle [[TButton/fi|painike (TButton)]] joka nimetään *btnFill* ja caption-ominaisuuteen kirjoitetaan *fill ListBox*. Tehdään sille *OnClick* tapahtumankäsittelijä jota täydennetään niin että se näyttää seuraavalta:
32+
33+``` pascal
34+procedure TForm1.btnFillClick(Sender: TObject);
35+var
36+ myStringList: TStringList;
37+begin
38+ myStringList:=TStringList.Create; //Luodaan myStringList
39+ myStringList.Add('This is the first line.'); //Tämä rivi lisätään
40+ myStringList.Add('This is the second first line.');
41+ myStringList.Add('This is the third line.');
42+ myStringList.Add('etc.');
43+ ListBox1.Items.Assign(myStringList); //Liitetään ListBox1:n myStringList:n tekstisisältö
44+ myStringList.Free; //Vapautetaan myStringList muistista
45+end;
46+```
47+
48+## Merkkijonon lisääminen
49+
50+- Laajennetaan esimerkkiä [[TListBox/fi|Koodilla painikkeen painamisen yhteydessä]] komponenteilla [[TEdit/fi|TEdit]] ja [[TButton/fi|TButton]] joka nimetään *btnAdd* ja sen caption saa arvokseen *add string*. Tyhjennä *Edit1* komponentin ominaisuus *Text* - tyhjä merkkijono.
51+- Painikkeen *OnClick* tapahtumankäsittelijään täydennetään seuraavanlaiseksi:
52+
53+``` pascal
54+procedure TForm1.btnAddClick(Sender: TObject);
55+begin
56+ ListBox1.Items.Add(Edit1.Text);
57+ Edit1.Text:='';
58+end;
59+```
60+
61+## Merkkijonon poistaminen
62+
63+Oletuksena voidaan TListBox:sta valita vain yksi rivi. Jos halutaan että voidaan valita useita rivejä niin pitää laittaa ominaisuus *MultiSelect* arvoon *True*.
64+
65+### ItemIndex
66+
67+- Laajennetaan esimerkkiä [[TListBox/fi|Koodilla painikkeen painamisen yhteydessä]] komponentilla [[TButton/fi|TButton]] joka nimetään *btnDel* ja sen caption saa arvokseen *delete string*.
68+- Painikkeen *OnClick* tapahtumankäsittelijään täydennetään seuraavanlaiseksi:
69+
70+``` pascal
71+procedure TForm1.btnDelClick(Sender: TObject);
72+begin
73+ if ListBox1.ItemIndex > -1 then //Poistetaan vain silloin, kun merkkijono valittu
74+ ListBox1.Items.Delete(ListBox1.ItemIndex);
75+end;
76+```
77+
78+### Kaikki valitut merkkijonot
79+
80+- Muutetaan edellisen esimerkin koodi seuraavanlaiseksi:
81+
82+``` pascal
83+procedure TForm1.btnDelClick(Sender: TObject);
84+var
85+ i: Integer;
86+begin
87+ if ListBox1.SelCount > 0 then //Poistetaan vain, jos vähintään yksi merkkijono on valittuna
88+ for i:=ListBox1.Items.Count - 1 downto 0 do //Käydään läpi kaikki
89+ if ListBox1.Selected[i] then //Jos on valittu...
90+ ListBox1.Items.Delete(i); //...poistetaan kyseinen merkkijono (String)
91+end;
92+```
93+
94+## Owner-drawn ListBox
95+
96+Yleensä on edullista antaa TListBox:n näyttää [teemaa](http://en.wikipedia.org/wiki/Skin_%28computing%29) jonka käyttäjä on valinnut hänen asetuksilla. Joissakin tapauksissa (esimerkiksi jos ohjelmoidaan värikäs peli), voidaan poiketa tästä standardista ja piirtää oman valinnan mukaan. Tätä voi kokeilla:
97+
98+- Voidaan muokata edellistä lähdekoodia tai tehdä uusi sovellus jossa on TListBox nimeltään *ListBox1*.
99+- Muutetaan komponenttimuokkaimessa *ListBox1* ominaisuutta *Style* arvoon *lbOwnerDrawFixed*.
100+- Komponenttimuokkaimen tapahtumat välilehdellä luodaan tapahtumankäsittelijä tapahtumalle *OnDrawItem* klikkaamalla \[...\]-painiketta.
101+- tapahtumankäsittelijän koodi täydennetään seuraavanlaiseksi::
102+
103+``` pascal
104+procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
105+ ARect: TRect; State: TOwnerDrawState);
106+var
107+ aColor: TColor; //Taustavärin värimuuttuja
108+begin
109+ if (Index mod 2 = 0) //Index kertoo mikä rivi on kysessää
110+ then aColor:=$FFFFFF //Joka toinen rivi saa valkoisen taustavärin
111+ else aColor:=$EEEEFF; //Joka toinen rivi saa pinkin taustavärin
112+ if odSelected in State then aColor:=$0000FF; //Jos rivi on valittu niin se saa punaisen taustavärin
113+ ListBox1.Canvas.Brush.Color:=aColor; //Asetetaan taustaväri
114+ ListBox1.Canvas.FillRect(ARect); //Piirrä täytetty suorakulmio
115+
116+ ListBox1.Canvas.Font.Bold:=True; //Asetetaan kirjaisin lihavoiduksi
117+ ListBox1.Canvas.TextRect(ARect, 2, ARect.Top+2, ListBox1.Items[Index]); //Piirretään teksti
118+end;
119+```
120+
121+> **Note:** **ListBoxDrawItem:n parametrit**\
122+> \
123+> **Control:**\
124+> Jos useilla olioilla (esimerkiksi useita TListBox)on pääsy tähän tapahtumaan, tiedetään mikä olio aiheutti tapahtuman. Esimerkiksi esimerkissä **`ListBox1.Canvas.FillRect(ARect)`**sijasta käytetään **`TListBox(Control).Canvas.FillRect(ARect)`**. Kuitenkin olisi hyvä silti tarkistaa että tapahtuman aiheutti TListBox-luokka:
125+>
126+> ``` pascal
127+> if Control is TListBox then
128+> TListBox(Control).Canvas.FillRect(ARect);
129+> ```
130+>
131+> **Index:** Määrittää kohteen sijainnin, joten voit käyttää merkkijonoa **`<ListBox>.Items[Index]`**.\
132+> **ARect:** Määrittää suorakulmion joka on tarpeen taustan piirtämisessä.\
133+> **State:** Kohteen tila, onko normaali, keskittynyt, valittu jne
134+
135+- Tältä tämä esimerkki voisi näyttää:
136+
137+![](/wiki-images/2/26/ListBoxBsp1.png) -\> ![](/wiki-images/9/9f/ListBoxBsp2.png)
138+
139+## Katso myös
140+
141+- [[doc:lcl/stdctrls/tlistbox.html|TListBox dokumentaatio]]
142+- [[TDBListBox]]
143+
144+---
145+*From the Free Pascal wiki, page "TListBox/fi", as it stood on 2020-03-01 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