2. Teil meiner Serie zur TAdvOutlookList von TMS Software.
Dieser Teil befasst sich mit dem Suchen oder Ermitteln von Einträgen, die in einer TAdvOutlook – Liste erfasst sind.
Drei Funktionen werden dabei vorgestellt:
- Liste aller Einträge innerhalb Ihrer AdvOutlooklist ermitteln
- Spaltenwerte an einer bestimmten Position ermitteln
- Einen bestimmten Texteintrag suchen
Liste aller Einträge innerhalb Ihrer AdvOutlooklist ermitteln
Das folgende Beispiel ermittelt die Liste aller Einträge auch über mehrere Gruppen hinweg und legt den Wert der Spalte (also Spalten[0] im Beispiel, was der 1. Spalte entspricht) in einer Listbox ab.
procedure TForm1.AdvGlowButton1Click(Sender: TObject);
var i,z:Integer; spalten:TStrings;
begin
ListBox1.Items.clear;
if AdvOutlookList1.GroupCount>0 then
begin
for i := 0 to AdvOutlookList1.GroupCount-1 do
begin
if AdvOutlookList1.Groups[i].ChildCount>0 then
begin
for z := 0 to AdvOutlookList1.Groups[i].ChildCount-1 do
begin
spalten:=AdvOutlookList1.Groups[i].ChildItem[z];
ListBox1.Items.Add(spalten[0])
end;
end;
end;
end;
end;
AdvOutlookList1.GroupCount ermittelt die Anzahl der Gruppen
AdvOutlookList1.Groups[i].ChildCount ermittelt die Anzahl der Einträge innerhalb einer Gruppe
AdvOutlookList1.Groups[i].ChildItem[z] ermittelt alle Spaltenwert und legt es in eine TStrings-Variable ab, über diese kann man mit dem entsprechenden SpaltenIndex auf der Inhalt der jeweiligen Spalte zugreifen, z.B. also mit Spalten[0] auf den entsprechenden Wert der 1. Spalte (Delphi beginnt ja mit 0 zu zählen).
Spaltenwerte an einer bestimmten Position ermitteln
Folgende Funktion ermittelt einen bestimmten Spaltenwert der angegebenen Zeile innerhalb der von Ihnen gewünschten Gruppe:
function TForm1.GetSpaltenWert(intGruppe,intZeile,intSpalte:Integer):String;
var spalten:TStrings;
begin
if (intGruppe>AdvOutlookList1.GroupCount)or
(intZeile>AdvOutlookList1.Groups[intGruppe-1].ChildCount) or
(intSpalte>AdvOutlookList1.Columns.Count) then
exit(‚-1‘);
spalten:=AdvOutlookList1.Groups[intGruppe-1].ChildItem[IntZeile-1];
result:=spalten[IntSpalte-1];
end;
Der Block:
if (intGruppe>AdvOutlookList1.GroupCount)or
(intZeile>AdvOutlookList1.Groups[intGruppe-1].ChildCount) or
(intSpalte>AdvOutlookList1.Columns.Count) then
exit(‚-1‘);
prüft, ob die übergebenden Werte nicht Eintragsgrenzen überschreiben – werden Werte übergeben, die in einen ungültigenBereich liegen, so gibt die Funktion -1 (als String) zurück.
Die Variablen intGruppe, intSpalte, IntZeile folgen mehr menschlicher Logik, d.h. die Zählung beginnt immer mit
1. Die Funktion rechnet es dann intern in die Delphi-Logik um, wo ja immer mit Null die Zählung beginnt.
Beachten Sie, dass der Aufruf
exit(‚-1′)
erst ab Delphi 2009 funktioniert, in älteren Versionen müssen Sie dies durch
begin result:=‘-1′; exit; end; ersetzen
Einen bestimmten Texteintrag suchen
Folgende Funktion ermittelt das dazugehörige PoglItem, welches den gewünschten Wert enthält.
function TForm1.findentry(suchtext:String):POGLItem;
var g,z,c:Integer; spalten:TStrings;
begin
if self.AdvOutlookList1.GroupCount>0 then
begin
for g := 0 to self.AdvOutlookList1.GroupCount-1 do
begin
if self.AdvOutlookList1.Groups[g].ChildCount>0 then
begin
for z := 0 to self.AdvOutlookList1.Groups[g].ChildCount-1 do
begin
spalten:=self.AdvOutlookList1.Groups[g].ChildItem[z];
for c := 0 to spalten.Count-1 do
if UpperCase(suchtext)=UpperCase(spalten[c]) then
exit(self.AdvOutlookList1.Groups[g].ChildOGLItem[z]);
end;
end;
end;
end;
exit(nil);
end;
Die Funktion gibt Nil zurück, wenn der Suchtext nicht gefunden wird, ansonsten das PoglItem, welches den Wert enthält. Gefunden wird immer der erste Eintrag, auch wenn ein Wert mehrmals vorkommt.Sollen mehrere Einträge ermittelt werden, muss die Funktion von Ihnen entsprechend ausgebaut werden.
Eine PoglItem ist eine Art Zeiger auf die entsprechenden Listeneinträge.
Das Ergebnis könnten Sie dann z.B. wie folgt auswerten:
var gItem:PoglItem; Inhalt:TStrings;
begin
gItem:=findentry(‚Projektmodul‘);
IF gItem<>Nil then
begin
Inhalt:=advOutlooklist1.GetItemData(gItem);
Showmessage(Inhalt[1]);
end else
ShowMessage(‚Nicht gefunden‘);
Sinnvoll wäre z.B. wenn alle Einträge Ihrer Outlookliste eine Spalte mit eindeutigen Indexwerten enthalten würde.
Arbeiten Sie z.B. mit Datenbanken könnten Sie so schnell die Position eines Eintrages in der Liste ermitteln und z.B. den Werte von Spalte X ermitteln oder diesen durch entsprechende Programmierung aktualisieren (z.B., wenn sich der Wert in der Datenbank verändert hat, Sie aber nicht die ganze Liste neu einlesen möchten, sondern lieber gezielt nur eine veränderte Zeile oder gar Spalte aktualisieren möchten).
Obige Routinen geben Ihnen zumindest das Handwerkszeug, um Ihre Anforderungen zu programmieren.
Viel Spaß beim Programmieren und Testen !