Difference between revisions of "TListBox/fi"
(Created page with "{{TListBox}} '''TListBox''' image:tlistbox.png on komponentti, joka näyttää (vieritettävän) luettelon merkkijonoista, joista käyttäjä voi valita jonkun. TListBox...") |
m (Fixed syntax highlighting) |
||
Line 6: | Line 6: | ||
Seuraavassa on muutamia esimerkkejä kuinka käyttää TListBox:a ''ListBox1'' lomakkeella ''Form1'': | Seuraavassa on muutamia esimerkkejä kuinka käyttää TListBox:a ''ListBox1'' lomakkeella ''Form1'': | ||
+ | ==ListBox:n täyttö== | ||
− | |||
=== Komponettimuokkaimella === | === Komponettimuokkaimella === | ||
+ | |||
* Valitse ListBox lomakkeella yhdellä klikkauksella. | * Valitse ListBox lomakkeella yhdellä klikkauksella. | ||
* Mene komponenttimuokkaimessa ominaisuus-välilehden ominaisuuteen ''Items''. | * Mene komponenttimuokkaimessa ominaisuus-välilehden ominaisuuteen ''Items''. | ||
Line 15: | Line 16: | ||
===Koodilla painikkeen painamisen yhteydessä=== | ===Koodilla painikkeen painamisen yhteydessä=== | ||
+ | |||
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: | 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: | ||
− | < | + | |
+ | <syntaxhighlight lang=pascal> | ||
procedure TForm1.btnFillClick(Sender: TObject); | procedure TForm1.btnFillClick(Sender: TObject); | ||
begin | begin | ||
Line 25: | Line 28: | ||
ListBox1.Items.Add('Even a random number '+IntToStr(Random(100))); | ListBox1.Items.Add('Even a random number '+IntToStr(Random(100))); | ||
end; | end; | ||
− | </ | + | </syntaxhighlight> |
==StringList:n liittäminen== | ==StringList:n liittäminen== | ||
+ | |||
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: | 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: | ||
− | < | + | |
+ | <syntaxhighlight lang=pascal> | ||
procedure TForm1.btnFillClick(Sender: TObject); | procedure TForm1.btnFillClick(Sender: TObject); | ||
var | var | ||
Line 42: | Line 47: | ||
myStringList.Free; //Vapautetaan myStringList muistista | myStringList.Free; //Vapautetaan myStringList muistista | ||
end; | end; | ||
− | </ | + | </syntaxhighlight> |
==Merkkijonon lisääminen== | ==Merkkijonon lisääminen== | ||
+ | |||
* Laajennetaan esimerkkiä [[TListBox/fi#Koodilla painikkeen painamisen yhteydessä|''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. | * Laajennetaan esimerkkiä [[TListBox/fi#Koodilla painikkeen painamisen yhteydessä|''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. | ||
* Painikkeen ''OnClick'' tapahtumankäsittelijään täydennetään seuraavanlaiseksi: | * Painikkeen ''OnClick'' tapahtumankäsittelijään täydennetään seuraavanlaiseksi: | ||
− | < | + | |
+ | <syntaxhighlight lang=pascal> | ||
procedure TForm1.btnAddClick(Sender: TObject); | procedure TForm1.btnAddClick(Sender: TObject); | ||
begin | begin | ||
Line 53: | Line 60: | ||
Edit1.Text:=''; | Edit1.Text:=''; | ||
end; | end; | ||
− | </ | + | </syntaxhighlight> |
==Merkkijonon poistaminen== | ==Merkkijonon poistaminen== | ||
+ | |||
Oletuksena voidaan TListBox:sta valita vain yksi rivi. Jos halutaan että voidaan valita useita rivejä niin pitää laittaa ominaisuus ''MultiSelect'' arvoon ''True''. | Oletuksena voidaan TListBox:sta valita vain yksi rivi. Jos halutaan että voidaan valita useita rivejä niin pitää laittaa ominaisuus ''MultiSelect'' arvoon ''True''. | ||
===ItemIndex=== | ===ItemIndex=== | ||
+ | |||
* Laajennetaan esimerkkiä [[TListBox/fi#Koodilla painikkeen painamisen yhteydessä|''Koodilla painikkeen painamisen yhteydessä'']] komponentilla [[TButton/fi|TButton]] joka nimetään ''btnDel'' ja sen caption saa arvokseen ''delete string''. | * Laajennetaan esimerkkiä [[TListBox/fi#Koodilla painikkeen painamisen yhteydessä|''Koodilla painikkeen painamisen yhteydessä'']] komponentilla [[TButton/fi|TButton]] joka nimetään ''btnDel'' ja sen caption saa arvokseen ''delete string''. | ||
* Painikkeen ''OnClick'' tapahtumankäsittelijään täydennetään seuraavanlaiseksi: | * Painikkeen ''OnClick'' tapahtumankäsittelijään täydennetään seuraavanlaiseksi: | ||
− | < | + | |
+ | <syntaxhighlight lang=pascal> | ||
procedure TForm1.btnDelClick(Sender: TObject); | procedure TForm1.btnDelClick(Sender: TObject); | ||
begin | begin | ||
Line 67: | Line 77: | ||
ListBox1.Items.Delete(ListBox1.ItemIndex); | ListBox1.Items.Delete(ListBox1.ItemIndex); | ||
end; | end; | ||
− | </ | + | </syntaxhighlight> |
===Kaikki valitut merkkijonot=== | ===Kaikki valitut merkkijonot=== | ||
+ | |||
* Muutetaan edellisen esimerkin koodi seuraavanlaiseksi: | * Muutetaan edellisen esimerkin koodi seuraavanlaiseksi: | ||
− | < | + | |
+ | <syntaxhighlight lang=pascal> | ||
procedure TForm1.btnDelClick(Sender: TObject); | procedure TForm1.btnDelClick(Sender: TObject); | ||
var | var | ||
Line 81: | Line 93: | ||
ListBox1.Items.Delete(i); //...poistetaan kyseinen merkkijono (String) | ListBox1.Items.Delete(i); //...poistetaan kyseinen merkkijono (String) | ||
end; | end; | ||
− | </ | + | </syntaxhighlight> |
==Owner-drawn ListBox== | ==Owner-drawn ListBox== | ||
Line 90: | Line 102: | ||
* Komponenttimuokkaimen tapahtumat välilehdellä luodaan tapahtumankäsittelijä tapahtumalle ''OnDrawItem'' klikkaamalla [...]-painiketta. | * Komponenttimuokkaimen tapahtumat välilehdellä luodaan tapahtumankäsittelijä tapahtumalle ''OnDrawItem'' klikkaamalla [...]-painiketta. | ||
* tapahtumankäsittelijän koodi täydennetään seuraavanlaiseksi:: | * tapahtumankäsittelijän koodi täydennetään seuraavanlaiseksi:: | ||
− | < | + | |
+ | <syntaxhighlight lang=pascal> | ||
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; | procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; | ||
ARect: TRect; State: TOwnerDrawState); | ARect: TRect; State: TOwnerDrawState); | ||
Line 106: | Line 119: | ||
ListBox1.Canvas.TextRect(ARect, 2, ARect.Top+2, ListBox1.Items[Index]); //Piirretään teksti | ListBox1.Canvas.TextRect(ARect, 2, ARect.Top+2, ListBox1.Items[Index]); //Piirretään teksti | ||
end; | end; | ||
− | </ | + | </syntaxhighlight> |
+ | |||
{{Note|'''ListBoxDrawItem:n parametrit'''<br><br> | {{Note|'''ListBoxDrawItem:n parametrit'''<br><br> | ||
'''Control:'''<br> Jos useilla olioilla (esimerkiksi useita TListBox)on pääsy tähän tapahtumaan, tiedetään mikä olio aiheutti tapahtuman. Esimerkiksi esimerkissä '''<code>ListBox1.Canvas.FillRect(ARect)</code>'''sijasta käytetään '''<code>TListBox(Control).Canvas.FillRect(ARect)</code>'''. Kuitenkin olisi hyvä silti tarkistaa että tapahtuman aiheutti TListBox-luokka: | '''Control:'''<br> Jos useilla olioilla (esimerkiksi useita TListBox)on pääsy tähän tapahtumaan, tiedetään mikä olio aiheutti tapahtuman. Esimerkiksi esimerkissä '''<code>ListBox1.Canvas.FillRect(ARect)</code>'''sijasta käytetään '''<code>TListBox(Control).Canvas.FillRect(ARect)</code>'''. Kuitenkin olisi hyvä silti tarkistaa että tapahtuman aiheutti TListBox-luokka: | ||
− | < | + | |
+ | <syntaxhighlight lang=pascal> | ||
if Control is TListBox then | if Control is TListBox then | ||
TListBox(Control).Canvas.FillRect(ARect); | TListBox(Control).Canvas.FillRect(ARect); | ||
− | </ | + | </syntaxhighlight> |
+ | |||
'''Index:''' Määrittää kohteen sijainnin, joten voit käyttää merkkijonoa '''<code><ListBox>.Items[Index]</code>'''.<br> | '''Index:''' Määrittää kohteen sijainnin, joten voit käyttää merkkijonoa '''<code><ListBox>.Items[Index]</code>'''.<br> | ||
'''ARect:''' Määrittää suorakulmion joka on tarpeen taustan piirtämisessä.<br> | '''ARect:''' Määrittää suorakulmion joka on tarpeen taustan piirtämisessä.<br> | ||
Line 118: | Line 134: | ||
}} | }} | ||
+ | |||
* Tältä tämä esimerkki voisi näyttää: | * Tältä tämä esimerkki voisi näyttää: | ||
+ | |||
[[image:ListBoxBsp1.png]] -> [[image:ListBoxBsp2.png]] | [[image:ListBoxBsp1.png]] -> [[image:ListBoxBsp2.png]] | ||
==Katso myös== | ==Katso myös== | ||
+ | |||
* [[doc:lcl/stdctrls/tlistbox.html|TListBox dokumentaatio]] | * [[doc:lcl/stdctrls/tlistbox.html|TListBox dokumentaatio]] | ||
* [[TDBListBox]] | * [[TDBListBox]] | ||
{{LCL Components}} | {{LCL Components}} |
Latest revision as of 07:50, 1 March 2020
│
Deutsch (de) │
English (en) │
suomi (fi) │
français (fr) │
日本語 (ja) │
TListBox on komponentti, joka näyttää (vieritettävän) luettelon merkkijonoista, joista käyttäjä voi valita jonkun. TListBox löytyy komponenttipaletin Standard välilehdeltä. TListBox:n 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 TStrings
Seuraavassa on muutamia esimerkkejä kuinka käyttää TListBox:a ListBox1 lomakkeella Form1:
ListBox:n täyttö
Komponettimuokkaimella
- Valitse ListBox lomakkeella yhdellä klikkauksella.
- Mene komponenttimuokkaimessa ominaisuus-välilehden ominaisuuteen Items.
- Klikkaa painiketta, jossa on kolme pistettä. Merkkijonojen muokkain avautuu.
- Kirjoita teksti ja vahvista tekemäsi työ OK-painikkeella.
Koodilla painikkeen painamisen yhteydessä
Lisätään lomakkeelle 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:
procedure TForm1.btnFillClick(Sender: TObject);
begin
ListBox1.Items.Clear; //Poista kaikki olemassa olevat merkkijonot
ListBox1.Items.Add('First line');
ListBox1.Items.Add('Line with random number '+IntToStr(Random(100)));
ListBox1.Items.Add('Third line');
ListBox1.Items.Add('Even a random number '+IntToStr(Random(100)));
end;
StringList:n liittäminen
Lisätään lomakkeelle 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:
procedure TForm1.btnFillClick(Sender: TObject);
var
myStringList: TStringList;
begin
myStringList:=TStringList.Create; //Luodaan myStringList
myStringList.Add('This is the first line.'); //Tämä rivi lisätään
myStringList.Add('This is the second first line.');
myStringList.Add('This is the third line.');
myStringList.Add('etc.');
ListBox1.Items.Assign(myStringList); //Liitetään ListBox1:n myStringList:n tekstisisältö
myStringList.Free; //Vapautetaan myStringList muistista
end;
Merkkijonon lisääminen
- Laajennetaan esimerkkiä Koodilla painikkeen painamisen yhteydessä komponenteilla TEdit ja TButton joka nimetään btnAdd ja sen caption saa arvokseen add string. Tyhjennä Edit1 komponentin ominaisuus Text - tyhjä merkkijono.
- Painikkeen OnClick tapahtumankäsittelijään täydennetään seuraavanlaiseksi:
procedure TForm1.btnAddClick(Sender: TObject);
begin
ListBox1.Items.Add(Edit1.Text);
Edit1.Text:='';
end;
Merkkijonon poistaminen
Oletuksena voidaan TListBox:sta valita vain yksi rivi. Jos halutaan että voidaan valita useita rivejä niin pitää laittaa ominaisuus MultiSelect arvoon True.
ItemIndex
- Laajennetaan esimerkkiä Koodilla painikkeen painamisen yhteydessä komponentilla TButton joka nimetään btnDel ja sen caption saa arvokseen delete string.
- Painikkeen OnClick tapahtumankäsittelijään täydennetään seuraavanlaiseksi:
procedure TForm1.btnDelClick(Sender: TObject);
begin
if ListBox1.ItemIndex > -1 then //Poistetaan vain silloin, kun merkkijono valittu
ListBox1.Items.Delete(ListBox1.ItemIndex);
end;
Kaikki valitut merkkijonot
- Muutetaan edellisen esimerkin koodi seuraavanlaiseksi:
procedure TForm1.btnDelClick(Sender: TObject);
var
i: Integer;
begin
if ListBox1.SelCount > 0 then //Poistetaan vain, jos vähintään yksi merkkijono on valittuna
for i:=ListBox1.Items.Count - 1 downto 0 do //Käydään läpi kaikki
if ListBox1.Selected[i] then //Jos on valittu...
ListBox1.Items.Delete(i); //...poistetaan kyseinen merkkijono (String)
end;
Owner-drawn ListBox
Yleensä on edullista antaa TListBox:n näyttää teemaa 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:
- Voidaan muokata edellistä lähdekoodia tai tehdä uusi sovellus jossa on TListBox nimeltään ListBox1.
- Muutetaan komponenttimuokkaimessa ListBox1 ominaisuutta Style arvoon lbOwnerDrawFixed.
- Komponenttimuokkaimen tapahtumat välilehdellä luodaan tapahtumankäsittelijä tapahtumalle OnDrawItem klikkaamalla [...]-painiketta.
- tapahtumankäsittelijän koodi täydennetään seuraavanlaiseksi::
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
ARect: TRect; State: TOwnerDrawState);
var
aColor: TColor; //Taustavärin värimuuttuja
begin
if (Index mod 2 = 0) //Index kertoo mikä rivi on kysessää
then aColor:=$FFFFFF //Joka toinen rivi saa valkoisen taustavärin
else aColor:=$EEEEFF; //Joka toinen rivi saa pinkin taustavärin
if odSelected in State then aColor:=$0000FF; //Jos rivi on valittu niin se saa punaisen taustavärin
ListBox1.Canvas.Brush.Color:=aColor; //Asetetaan taustaväri
ListBox1.Canvas.FillRect(ARect); //Piirrä täytetty suorakulmio
ListBox1.Canvas.Font.Bold:=True; //Asetetaan kirjaisin lihavoiduksi
ListBox1.Canvas.TextRect(ARect, 2, ARect.Top+2, ListBox1.Items[Index]); //Piirretään teksti
end;
Huomaa: ListBoxDrawItem:n parametrit
Control:
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:
if Control is TListBox then
TListBox(Control).Canvas.FillRect(ARect);
Index: Määrittää kohteen sijainnin, joten voit käyttää merkkijonoa <ListBox>.Items[Index]
.
ARect: Määrittää suorakulmion joka on tarpeen taustan piirtämisessä.
State: Kohteen tila, onko normaali, keskittynyt, valittu jne
- Tältä tämä esimerkki voisi näyttää:
Katso myös