k***@gmail.com
2019-09-28 13:47:05 UTC
Hallo,
Habe wahrscheinlich ein Brett vorm Kopf, aber ich komme irgendwie nicht auf eine Lösung. Obwohl das eigentlich ganz einfach klingt.
Folgende Situation: ich habe auf meinem Form zwei TListViews. Das eine (LVU) enthält eine Liste von Mail-Usern, das andere (LVM) die einzelnen Mails dieser User.
Multiselect des ersten LV ist true.
Ich möchte folgendes erreichen:
1. klickt man auf einen der User im LVU, sollen im LVM die einzelnen Mails dieses Users aufgelistet werden
2. markiert man nun mehrere User im LVU, sollen alle Mails dieser markierten User im LVM erscheinen
3. de-selektiert man einen User im LVU, sollen dessen Mails auch nicht mehr im LVM erscheinen (logisch)
Kling soweit trivial.
Beim Selektieren eines Users im LVU wird also das LVM geleert, und dann werden alle Mails des selektierten Users im LVM aufgelistet.
Und zwar wie folgt:
for i := 0 to LVU.Items.Count - 1 do
begin
if LVU.Items[i].Selected then
begin
User := GetUserByName(LVU.Items[i].Caption);
for iMail := 0 to User.MailList.Count - 1 do
LVMAdd(User.UserName, TMail(User.MailList.Items[iMail]));
end;
end;
Ich dachte, der Event OnSelectItem des LVU wäre hierfür geeignet, aber weit gefehlt:
Sobald ich mehrere User im LVU selecte, z.B. mit der Tastatur (Shift-Up oder Shift-Down, oder Ctrl-A), oder mit der Maus (Ctrl-Click oder Shift-Click), wird dieser Event mehrfach getriggert, und zwar wenn ein Item unselected wird, und dann nochmal, für den neu selektierten Item. Und wenn ich z.B. mit dem Curser auf dem obersten Eintrag im LVU stehe, und dann Ctrl-End drücke (alles von oben nach unten markieren), triggert der Event für jeden einzelnen der Einträge. Hierbei wird also jedesmal das LVM geleert und neu befüllt. Die Anzahl der Mails pro User geht in die Tausende, so dass dies jedesmal unglaublich lange dauert.
Der Event OnChange des LVU erscheint mir auch nicht passend, weil der auch jedesmal feuert, wenn ich das LVU initial befülle, oder die Mails der User aus der Datenbank hole, deren Anzahl (u.a. Sachen) dann im ULV erscheinen. Nämlich jedesmal, wenn sich der Text der Caption oder eines der SubItem.Text ändert.
Habe natürlich schon dran gedacht, einen Zähler zu setzen, und das LVM erst zu aktualisieren, wenn der wieder auf Null steht, aber man weiß ja nie, wann die Selection im LVU beendet ist. Es gibt ja auch keinen Event OnEndSelect o.ä.
Habt ihr da eine Idee?
Danke
KT
Habe wahrscheinlich ein Brett vorm Kopf, aber ich komme irgendwie nicht auf eine Lösung. Obwohl das eigentlich ganz einfach klingt.
Folgende Situation: ich habe auf meinem Form zwei TListViews. Das eine (LVU) enthält eine Liste von Mail-Usern, das andere (LVM) die einzelnen Mails dieser User.
Multiselect des ersten LV ist true.
Ich möchte folgendes erreichen:
1. klickt man auf einen der User im LVU, sollen im LVM die einzelnen Mails dieses Users aufgelistet werden
2. markiert man nun mehrere User im LVU, sollen alle Mails dieser markierten User im LVM erscheinen
3. de-selektiert man einen User im LVU, sollen dessen Mails auch nicht mehr im LVM erscheinen (logisch)
Kling soweit trivial.
Beim Selektieren eines Users im LVU wird also das LVM geleert, und dann werden alle Mails des selektierten Users im LVM aufgelistet.
Und zwar wie folgt:
for i := 0 to LVU.Items.Count - 1 do
begin
if LVU.Items[i].Selected then
begin
User := GetUserByName(LVU.Items[i].Caption);
for iMail := 0 to User.MailList.Count - 1 do
LVMAdd(User.UserName, TMail(User.MailList.Items[iMail]));
end;
end;
Ich dachte, der Event OnSelectItem des LVU wäre hierfür geeignet, aber weit gefehlt:
Sobald ich mehrere User im LVU selecte, z.B. mit der Tastatur (Shift-Up oder Shift-Down, oder Ctrl-A), oder mit der Maus (Ctrl-Click oder Shift-Click), wird dieser Event mehrfach getriggert, und zwar wenn ein Item unselected wird, und dann nochmal, für den neu selektierten Item. Und wenn ich z.B. mit dem Curser auf dem obersten Eintrag im LVU stehe, und dann Ctrl-End drücke (alles von oben nach unten markieren), triggert der Event für jeden einzelnen der Einträge. Hierbei wird also jedesmal das LVM geleert und neu befüllt. Die Anzahl der Mails pro User geht in die Tausende, so dass dies jedesmal unglaublich lange dauert.
Der Event OnChange des LVU erscheint mir auch nicht passend, weil der auch jedesmal feuert, wenn ich das LVU initial befülle, oder die Mails der User aus der Datenbank hole, deren Anzahl (u.a. Sachen) dann im ULV erscheinen. Nämlich jedesmal, wenn sich der Text der Caption oder eines der SubItem.Text ändert.
Habe natürlich schon dran gedacht, einen Zähler zu setzen, und das LVM erst zu aktualisieren, wenn der wieder auf Null steht, aber man weiß ja nie, wann die Selection im LVU beendet ist. Es gibt ja auch keinen Event OnEndSelect o.ä.
Habt ihr da eine Idee?
Danke
KT