TListBox/fi
│
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