TListBox/de: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: TListBox/de
| Old | New | Line | |
|---|---|---|---|
| 1 | + | Diese 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. | |
| 2 | + | ||
| 3 | + | ## Beschreibung | |
| 4 | + | ||
| 5 | + | Eine scrollbare Liste von Strings. | |
| 6 | + | ||
| 7 | + | <figure> | |
| 8 | + | <img src="Comp_Standard_TListBox.png" title="Comp_Standard_TListBox.png" /> | |
| 9 | + | <figcaption>Comp_Standard_TListBox.png</figcaption> | |
| 10 | + | </figure> | |
| 11 | + | ||
| 12 | + | ## Verwendung | |
| 13 | + | ||
| 14 | + | Um 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.\ | |
| 15 | + | Die, 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]]. | |
| 16 | + | ||
| 17 | + | Nachfolgend ein paar Beispiele zur Verwendung einer ListBox *ListBox1* auf einem Formular *Form1*: | |
| 18 | + | ||
| 19 | + | ### ListBox füllen | |
| 20 | + | ||
| 21 | + | #### per Objektinspektor | |
| 22 | + | ||
| 23 | + | - Wählen Sie die ListBox auf Ihrem Formular mit einem Klick an. | |
| 24 | + | - Gehen Sie im Objektinspektor im Reiter Eigenschaften auf die Eigenschaft *Items*. | |
| 25 | + | - Klicken Sie auf den Button mit den drei Punkten. Der Zeichenketteneditor öffnet sich. | |
| 26 | + | - Geben Sie Ihre Texte ein und bestätigen Ihre Arbeit mit *OK*. | |
| 27 | + | ||
| 28 | + | #### per Code bei Buttonklick | |
| 29 | + | ||
| 30 | + | - 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: | |
| 31 | + | ||
| 32 | + | ``` pascal | |
| 33 | + | procedure TForm1.btnFillClick(Sender: TObject); | |
| 34 | + | begin | |
| 35 | + | ListBox1.Items.Clear; //Alle vorhandenen Strings löschen | |
| 36 | + | ListBox1.Items.Add('Erste Zeile'); | |
| 37 | + | ListBox1.Items.Add('Zeile mit Zufallszahl '+IntToStr(Random(100))); | |
| 38 | + | ListBox1.Items.Add('Dritte Zeile'); | |
| 39 | + | ListBox1.Items.Add('Noch eine Zufallszahl '+IntToStr(Random(100))); | |
| 40 | + | end; | |
| 41 | + | ``` | |
| 42 | + | ||
| 43 | + | #### Zuweisung einer StringList | |
| 44 | + | ||
| 45 | + | - 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: | |
| 46 | + | ||
| 47 | + | ``` pascal | |
| 48 | + | procedure TForm1.btnFillClick(Sender: TObject); | |
| 49 | + | var | |
| 50 | + | myStringList: TStringList; | |
| 51 | + | begin | |
| 52 | + | myStringList:=TStringList.Create; //Meine StringList erstellen | |
| 53 | + | myStringList.Add('Das ist die erste Zeile.'); //dieser eine Zeile zufügen | |
| 54 | + | myStringList.Add('Das ist die zweite Zeile.'); | |
| 55 | + | myStringList.Add('Das ist die dritte Zeile.'); | |
| 56 | + | myStringList.Add('usw.'); | |
| 57 | + | ListBox1.Items.Assign(myStringList); //der ListBox1 den Textinhalt meine StringList zuweisen | |
| 58 | + | myStringList.Free; //Meine StringList im Speicher wieder freigeben | |
| 59 | + | end; | |
| 60 | + | ``` | |
| 61 | + | ||
| 62 | + | ### String zufügen | |
| 63 | + | ||
| 64 | + | - 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. | |
| 65 | + | - Im Eventhandler *OnClick* des Buttons schreiben Sie folgenden Code: | |
| 66 | + | ||
| 67 | + | ``` pascal | |
| 68 | + | procedure TForm1.btnAddClick(Sender: TObject); | |
| 69 | + | begin | |
| 70 | + | ListBox1.Items.Add(Edit1.Text); | |
| 71 | + | Edit1.Text:=''; | |
| 72 | + | end; | |
| 73 | + | ``` | |
| 74 | + | ||
| 75 | + | ### String löschen | |
| 76 | + | ||
| 77 | + | Standardgemäß 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. | |
| 78 | + | ||
| 79 | + | #### Lösche String bei ItemIndex | |
| 80 | + | ||
| 81 | + | - Erweitern Sie das Beispiel [[TListBox/de|String zufügen]] um einen [[TButton/de|TButton]] mit einem Namen *btnDel* und Caption *String löschen*. | |
| 82 | + | - Im Eventhandler *OnClick* des Buttons schreiben Sie folgenden Code: | |
| 83 | + | ||
| 84 | + | ``` pascal | |
| 85 | + | procedure TForm1.btnDelClick(Sender: TObject); | |
| 86 | + | begin | |
| 87 | + | if ListBox1.ItemIndex > -1 then //Nur löschen, wenn ein String in der Listbox selektiert ist | |
| 88 | + | ListBox1.Items.Delete(ListBox1.ItemIndex); | |
| 89 | + | end; | |
| 90 | + | ``` | |
| 91 | + | ||
| 92 | + | #### Lösche alle selektierten Strings | |
| 93 | + | ||
| 94 | + | - Erweitern Sie das Beispiel [[TListBox/de|String zufügen]] um einen [[TButton/de|TButton]] mit einem Namen *btnDel* und Caption *String löschen*. | |
| 95 | + | - Im Eventhandler *OnClick* des Buttons schreiben Sie folgenden Code: | |
| 96 | + | ||
| 97 | + | ``` pascal | |
| 98 | + | procedure TForm1.btnDelClick(Sender: TObject); | |
| 99 | + | var | |
| 100 | + | i: Integer; | |
| 101 | + | begin | |
| 102 | + | if ListBox1.SelCount > 0 then //Nur löschen, wenn min. ein String in der Listbox selektiert ist | |
| 103 | + | for i:=ListBox1.Items.Count - 1 downto 0 do //Alle Items durchlaufen | |
| 104 | + | if ListBox1.Selected[i] then //Falls ausgewählt... | |
| 105 | + | ListBox1.Items.Delete(i); //...das Item (String) löschen | |
| 106 | + | end; | |
| 107 | + | ``` | |
| 108 | + | ||
| 109 | + | ### ListBox selber zeichnen | |
| 110 | + | ||
| 111 | + | Allgemein 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: | |
| 112 | + | ||
| 113 | + | - Sie können das vorhergehende Beispiel modifizieren oder Sie erstellen eine neue Anwendung mit einer TListBox *ListBox1*. | |
| 114 | + | - Ändern Sie von *ListBox1* im Objektinspektor die Eigenschaft *Style* auf *lbOwnerDrawFixed*. | |
| 115 | + | - Erstellen Sie im Objektinspektor den Eventhandler für das Ereignis *OnDrawItem*, indem Sie auf den Button \[...\] klicken. | |
| 116 | + | - Folgenden Code fügen Sie dem Eventhandler zu: | |
| 117 | + | ||
| 118 | + | ``` pascal | |
| 119 | + | procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; | |
| 120 | + | ARect: TRect; State: TOwnerDrawState); | |
| 121 | + | var | |
| 122 | + | aColor: TColor; //Hintergrundfarbe | |
| 123 | + | begin | |
| 124 | + | if (Index mod 2 = 0) //Index sagt, um welches Item es sich handelt | |
| 125 | + | then aColor:=$FFFFFF //jedes zweite Item bekommt weiß als Hintergrundfarbe | |
| 126 | + | else aColor:=$EEEEFF; //jedes zweite Item bekommt rosa als Hintergrundfarbe | |
| 127 | + | if odSelected in State then aColor:=$0000FF; //Falls Item ausgewählt ist, dann rote Hintergrundfarbe | |
| 128 | + | ListBox1.Canvas.Brush.Color:=aColor; //Hintergrundfarbe festlegen | |
| 129 | + | ListBox1.Canvas.FillRect(ARect); //Ein ausgefülltes Rechteck zeichnen | |
| 130 | + | ||
| 131 | + | ListBox1.Canvas.Font.Bold:=True; //Font auf "Fett" festlegen | |
| 132 | + | ListBox1.Canvas.TextRect(ARect, 2, ARect.Top+2, ListBox1.Items[Index]); //Itemtext zeichnen | |
| 133 | + | end; | |
| 134 | + | ``` | |
| 135 | + | ||
| 136 | + | > **Note:** **Parameter von ListBoxDrawItem:**\ | |
| 137 | + | > \ | |
| 138 | + | > **Control:**\ | |
| 139 | + | > 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: | |
| 140 | + | > | |
| 141 | + | > ``` pascal | |
| 142 | + | > if Control is TListBox then | |
| 143 | + | > TListBox(Control).Canvas.FillRect(ARect); | |
| 144 | + | > ``` | |
| 145 | + | > | |
| 146 | + | > **Index:** Gibt die Item-Stelle an, somit hat man Zugriff auf den String **`<ListBox>.Items[Index]`**.\ | |
| 147 | + | > **ARect:** Beschreibt das Rechteck, was zur Zeichnung des Hintergrundes notwendig ist.\ | |
| 148 | + | > **State:** Status des Items, ob normal, fokusiert, selektiert etc. | |
| 149 | + | ||
| 150 | + | - So könnte Ihr Beispiel dann aussehen: | |
| 151 | + | ||
| 152 | + |  -\>  | |
| 153 | + | ||
| 154 | + | ## Siehe auch | |
| 155 | + | ||
| 156 | + | [[TMemo/de|TMemo]] - Ein Steuerelement um mehrzeilige Texte zu editieren | |
| 157 | + | ||
| 158 | + | --- | |
| 159 | + | *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).* |
