In Teil 1 haben wir die AdvListView dem Formular hinzugefügt und diese auch bereits mit Daten aus einer Query (alternativ kann man auch eine Tabelle, Table-Komponente verwenden) gefüllt. In Teil 2 gehen wir mehr ins Detail, um die Möglichkeiten der Komponente besser auszuschöpfen.
1. In Abhängigkeit eines bestimmten Wertes eine individuelle Grafik für jede Zeile anzeigen
Nehmen wir an Sie haben eine Aufgabenliste. Diese Aufgaben können verschiedener Art sein, z.B. ein Telefonanruf, eine Email oder anderes. Um nun leichter erkennen zu können, welche Art von Aufgabe es ist, möchten Sie dies durch eine Grafik hervorheben.
Hierzu legen Sie zunächst eine Imagelist an mit den gewünschten Grafiken (am besten PNG, 16x16px). Diese weisen Sie nun der AdvListView zu: hierzu verwenden Sie die Eigenschaft SmallImages im Delphi Objektinspektor.
Im Code erstellen wir ja jede neue Zeile, die einen Datensatz repräsentiert, wie folgt:
newItem := advliste.Items.add;
newItem.ImageIndex := query.fieldbyname(‘aufgabentyp’).asInteger
Entscheidend ist also .ImageIndex. Im Beispiel wird davon ausgegangen, dass in der Tabelle ein Feld existiert, dessen Integerwert mit dem Index einer Imagelist korrespondiert
Einfach, oder? Die Grafik wird nun ganz links, also in der 1. Spalte angezeigt.
Wie Sie in Abhängigkeit von einem Feldwert die einzelnen Zeilen unterschiedlich färben können
Wieder beim Beispiel einer Aufgabenliste. Sie möchten z.B. Aufgaben in Abhängigkeit von der Fälligkeit anzeigen, z.B. Grau für erledigt, rot für überfällig…
Hierzu verwenden Sie das Ereignis (Event) : OnDrawItemProp
Dieses sieht wie folgt aus :
procedure TMeineForm.AdvListeDrawItemProp(Sender: TObject; ItemIndex, SubitemIndex: Integer; AState: TOwnerDrawState; ABrush: TBrush; AFont: TFont; ItemText: string);
begin
if aliste.Items[ItemIndex].SubItems[3] = ‚Ja‘ then
AFont.Color := clgray
else
begin
if aliste.Items[ItemIndex].SubItems[2] <> “ then
begin
if Now() < StrTODatetime(advliste.Items[ItemIndex].SubItems[2]) then
AFont.Color := clgreen
else
AFont.Color := clred
end else
AFont.Color := clBlack;
end;
end;
Im Beispiel wird davon ausgegangen, dass in der 5. Spalte (entspricht Subitems[3]) ein Wert Ja ausgegeben ist, wenn die Aufgabe erledigt ist. In Spalte 4 steht ein Datumswert, welcher angibt, wann die Aufgabe fällig ist. Entsprechend den in diesen beiden Spalten angegebenen Werten werden die einzelnen Zeilen dann unterschiedlich eingefärbt.
Wichtig ist hierbei auch noch, dass im Objekt Inspektor für die AdvListe OwnerDraw = True ist, so dass Ihre Routine oben den Standard ersetzt.
Wie Sie herausbekommen, welche Zeile geklickt wurde und damit den entsprechenden Daten ermitteln können
Je nachdem, was Sie machen möchten stehen Ihnen dafür z.B. OnItemSelect oder OnItemDblClick/OnItemClick zur Verfügung.
OnItemSelect liefert Ihnen praktischerweise auch gleich das Item direkt zurück
procedure TMeineForm.AdvListeSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean);
var datensatz:Integer;
begin
if Item <> nil then
begin
datensatz:=StrToInt(Item.caption)
end;
end;
Hierbei wird davon ausgegangen, dass Sie in Spalte 1 (entspricht Item.caption) einen ID-Wert für den einzelnen Datensatz hinterlegt haben. Dies ist eigentlich zwingend notwendig, da es ansonsten schwierig wird eine Zuordnung zur Datenbanktabelle zu bekommen. Verwenden Sie nicht Recno, zumindest nicht in einer Client/Server – Umgebung, da dieser Wert dann nicht mehr brauchbar ist, da er ja Änderungen durch Maßnahmen anderer Anwender im Netzwerk unterliegen kann.
Verwenden Sie OnItemClick bzw. OnItemDblClick, so müssen Sie das aktuelle Item (bzw. die aktuelle Zeile), die der Anwender ausgewählt hat, natürlich erst bestimmten:
Tipp: sinnvollerweise sollte HideSelection auf False gesetzt sein
var
myItem: TListItem;
begin
// gibt es überhaupt Daten?
if AdvListe.Items.count>0 then
begin
// ist ein Item ausgewählt?
if AdvListe.ItemIndex >0 then
begin
myItem:=AdvListe.Items[advListe.ItemIndex];
if myItem<>Nil then
begin
datensatz:=StrToInt(myItem.caption)
// mach was mit
end;
end;
end;
end;
Wie Sie z.B. den Wert von Zeile 3, Spalte 2 bekommen
Die erste Spalte entspricht Item.caption, die 2. Spalte = Item.subitems[0], die 3. Spalte = Items.subitems[1]
Um nun den Wert von Zeile 3, Spalte 2 zu bekommen, geben Sie einfach ein
SpaltenWert:=AdvListe.Items[3].subitems[0]
Wie Sie eine Progressbar in Ihrer AdvListView anzeigen
Normalerweise füllen Sie die Liste mit
newItem := AdvListe.Items.Add;
newItem.caption:=’Wert’
newItem.SubItems[0]:=’Wert’;
Möchten Sie nun in der 1. Spalte eine Progressbar anzeigen, so verwenden Sie statt dessen:
AdvListe.Progress[newItem.Index, 1]:= IntegerWert (zwischen 0 und 100)
Natürlich gibt es noch viel mehr Möglichkeiten, diese interessante und einfach einzusetzende Komponente zu verwenden. Ich würde mich aber freuen, wenn einige meiner Tipps bereits nützlich waren und Ihnen den Start etwas erleichtern.