Sign in Join
Wiki copytemporary

TListBox/de: what changed

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

OldNewLine
11Diese Seite erklärt, wie man die [[doc:lcl/stdctrls/tlistbox.html|TListBox]] Komponente verwendet. Auf etwas klicken bedeutet immer ein Linksklick, ein Rechtsklick wird explizit erwähnt.
22
33## Beschreibung
44
55Eine scrollbare Liste von Strings.
66
7-<figure>
8-<img src="Comp_Standard_TListBox.png" title="Comp_Standard_TListBox.png" />
9-<figcaption>Comp_Standard_TListBox.png</figcaption>
10-</figure>
7+![](/wiki-images/d/d7/Comp_Standard_TListBox.png)
118
129## Verwendung
1310
1411Um eine [[doc:lcl/stdctrls/tlistbox.html|TListBox]] auf einem [[TForm/de|Formular]] zu nutzen, kann man sie einfach auf der Komponentenpalette *Standard* auswählen und, mit einem Klick auf das Formular, platzieren.\
1512Die, in der ListBox hinterlegten, [[String/de|Strings]] sind in der Eigenschaft *Items* hinterlegt, die vom Typ TStrings ist. Somit können Sie Strings der Listbox zuweisen oder entfernen, wie bei einer [[TStringList-TStrings Tutorial/de|TStringList]] oder ihres Vorfahrens [[TStringList-TStrings Tutorial/de|TStrings]].
1613
1714Nachfolgend ein paar Beispiele zur Verwendung einer ListBox *ListBox1* auf einem Formular *Form1*:
1815
1916### ListBox füllen
2017
2118#### per Objektinspektor
2219
2320- Wählen Sie die ListBox auf Ihrem Formular mit einem Klick an.
2421- Gehen Sie im Objektinspektor im Reiter Eigenschaften auf die Eigenschaft *Items*.
2522- Klicken Sie auf den Button mit den drei Punkten. Der Zeichenketteneditor öffnet sich.
2623- Geben Sie Ihre Texte ein und bestätigen Ihre Arbeit mit *OK*.
2724
2825#### per Code bei Buttonklick
2926
3027- Fügen Sie Ihrem Formular einen [[TButton/de|TButton]] hinzu mit dem Namen *btnFill* und Caption *Listbox füllen*. Im Eventhandler *OnClick* des Buttons schreiben Sie folgenden Code:
3128
3229``` pascal
3330procedure TForm1.btnFillClick(Sender: TObject);
3431begin
3532 ListBox1.Items.Clear; //Alle vorhandenen Strings löschen
3633 ListBox1.Items.Add('Erste Zeile');
3734 ListBox1.Items.Add('Zeile mit Zufallszahl '+IntToStr(Random(100)));
3835 ListBox1.Items.Add('Dritte Zeile');
3936 ListBox1.Items.Add('Noch eine Zufallszahl '+IntToStr(Random(100)));
4037end;
4138```
4239
4340#### Zuweisung einer StringList
4441
4542- Fügen Sie Ihrem Formular einen [[TButton/de|TButton]] hinzu mit dem Namen *btnFill* und Caption *Listbox füllen*. Im Eventhandler *OnClick* des Buttons schreiben Sie folgenden Code:
4643
4744``` pascal
4845procedure TForm1.btnFillClick(Sender: TObject);
4946var
5047 myStringList: TStringList;
5148begin
5249 myStringList:=TStringList.Create; //Meine StringList erstellen
5350 myStringList.Add('Das ist die erste Zeile.'); //dieser eine Zeile zufügen
5451 myStringList.Add('Das ist die zweite Zeile.');
5552 myStringList.Add('Das ist die dritte Zeile.');
5653 myStringList.Add('usw.');
5754 ListBox1.Items.Assign(myStringList); //der ListBox1 den Textinhalt meine StringList zuweisen
5855 myStringList.Free; //Meine StringList im Speicher wieder freigeben
5956end;
6057```
6158
6259### String zufügen
6360
6461- Erweitern Sie das Beispiel [[TListBox/de|ListBox füllen per Code bei Buttonklick]] um ein [[TEdit/de|TEdit]] und einen [[TButton/de|TButton]] mit einem Namen *btnAdd* und Caption *String zufügen*. Ändern Sie noch von *Edit1* die Eigenschaft Text zu "" - leerer String.
6562- Im Eventhandler *OnClick* des Buttons schreiben Sie folgenden Code:
6663
6764``` pascal
6865procedure TForm1.btnAddClick(Sender: TObject);
6966begin
7067 ListBox1.Items.Add(Edit1.Text);
7168 Edit1.Text:='';
7269end;
7370```
7471
7572### String löschen
7673
7774Standardgemäß ist eingestellt, dass Sie nur eine Zeile in Ihrer Listbox selektieren können. Wollen Sie mehere Zeilen in Ihrer ListBox auswählen können, müssten Sie die Eigenschaft *MultiSelect* auf *True* stellen.
7875
7976#### Lösche String bei ItemIndex
8077
8178- Erweitern Sie das Beispiel [[TListBox/de|String zufügen]] um einen [[TButton/de|TButton]] mit einem Namen *btnDel* und Caption *String löschen*.
8279- Im Eventhandler *OnClick* des Buttons schreiben Sie folgenden Code:
8380
8481``` pascal
8582procedure TForm1.btnDelClick(Sender: TObject);
8683begin
8784 if ListBox1.ItemIndex > -1 then //Nur löschen, wenn ein String in der Listbox selektiert ist
8885 ListBox1.Items.Delete(ListBox1.ItemIndex);
8986end;
9087```
9188
9289#### Lösche alle selektierten Strings
9390
9491- Erweitern Sie das Beispiel [[TListBox/de|String zufügen]] um einen [[TButton/de|TButton]] mit einem Namen *btnDel* und Caption *String löschen*.
9592- Im Eventhandler *OnClick* des Buttons schreiben Sie folgenden Code:
9693
9794``` pascal
9895procedure TForm1.btnDelClick(Sender: TObject);
9996var
10097 i: Integer;
10198begin
10299 if ListBox1.SelCount > 0 then //Nur löschen, wenn min. ein String in der Listbox selektiert ist
103100 for i:=ListBox1.Items.Count - 1 downto 0 do //Alle Items durchlaufen
104101 if ListBox1.Selected[i] then //Falls ausgewählt...
105102 ListBox1.Items.Delete(i); //...das Item (String) löschen
106103end;
107104```
108105
109106### ListBox selber zeichnen
110107
111108Allgemein ist es günstig, die ListBox in dem vom Nutzer eingestellen [Thema](http://de.wikipedia.org/wiki/Skin_%28Computer%29) darstellen zu lassen. In manchen Fällen (programmiert man z.B. ein Spiel mit einer bunten Oberfläche), kann man jedoch auch von diesem Standard abweichen und die Listbox nach eigenem Wunsch zeichnen. Wie das geht, können Sie jetzt ausprobieren:
112109
113110- Sie können das vorhergehende Beispiel modifizieren oder Sie erstellen eine neue Anwendung mit einer TListBox *ListBox1*.
114111- Ändern Sie von *ListBox1* im Objektinspektor die Eigenschaft *Style* auf *lbOwnerDrawFixed*.
115112- Erstellen Sie im Objektinspektor den Eventhandler für das Ereignis *OnDrawItem*, indem Sie auf den Button \[...\] klicken.
116113- Folgenden Code fügen Sie dem Eventhandler zu:
117114
118115``` pascal
119116procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
120117 ARect: TRect; State: TOwnerDrawState);
121118var
122119 aColor: TColor; //Hintergrundfarbe
123120begin
124121 if (Index mod 2 = 0) //Index sagt, um welches Item es sich handelt
125122 then aColor:=$FFFFFF //jedes zweite Item bekommt weiß als Hintergrundfarbe
126123 else aColor:=$EEEEFF; //jedes zweite Item bekommt rosa als Hintergrundfarbe
127124 if odSelected in State then aColor:=$0000FF; //Falls Item ausgewählt ist, dann rote Hintergrundfarbe
128125 ListBox1.Canvas.Brush.Color:=aColor; //Hintergrundfarbe festlegen
129126 ListBox1.Canvas.FillRect(ARect); //Ein ausgefülltes Rechteck zeichnen
130127
131128 ListBox1.Canvas.Font.Bold:=True; //Font auf "Fett" festlegen
132129 ListBox1.Canvas.TextRect(ARect, 2, ARect.Top+2, ListBox1.Items[Index]); //Itemtext zeichnen
133130end;
134131```
135132
136133> **Note:** **Parameter von ListBoxDrawItem:**\
137134> \
138135> **Control:**\
139136> Falls mehrere Controls (z.B. mehrere ListBoxen) auf diesen Eventhandler zugreifen, weiß man, welches diesen Event geworfen hat. Man könnte in unserem Beispiel statt **`ListBox1.Canvas.FillRect(ARect)`** auch **`TListBox(Control).Canvas.FillRect(ARect)`** schreiben, wobei man zuvor möglichst noch abfragen sollte, ob es ich um eine TListBox handelt:
140137>
141138> ``` pascal
142139> if Control is TListBox then
143140> TListBox(Control).Canvas.FillRect(ARect);
144141> ```
145142>
146143> **Index:** Gibt die Item-Stelle an, somit hat man Zugriff auf den String **`<ListBox>.Items[Index]`**.\
147144> **ARect:** Beschreibt das Rechteck, was zur Zeichnung des Hintergrundes notwendig ist.\
148145> **State:** Status des Items, ob normal, fokusiert, selektiert etc.
149146
150147- So könnte Ihr Beispiel dann aussehen:
151148
152149![](/wiki-images/2/26/ListBoxBsp1.png) -\> ![](/wiki-images/9/9f/ListBoxBsp2.png)
153150
154151## Siehe auch
155152
156153[[TMemo/de|TMemo]] - Ein Steuerelement um mehrzeilige Texte zu editieren
157154
158155---
159156*From the Free Pascal wiki, page "TListBox/de", 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