Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

D10.3.2 VCL TListView - Brauche zündende Idee

12 views
Skip to first unread message

ktrie...@gmail.com

unread,
Sep 28, 2019, 9:47:07 AM9/28/19
to
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


Jens Köhler

unread,
Oct 1, 2019, 3:04:19 AM10/1/19
to
Am 28.09.2019 um 15:47 schrieb ktrie...@gmail.com:
> 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)
>

wie ist es mit nicht komplett neu aufbauen?

angeklickte User mit insert einfügen und deselektierte mit delete
löschen und von den anderen die Finger lassen.

Jens

ktrie...@gmail.com

unread,
Oct 2, 2019, 2:49:51 AM10/2/19
to
Hallo,

Danke, davor war ich aus irgendwelchen Gründen immer zurückgeschreckt, aber es klingt logisch. Werde ich die Tage austesten.

Cheers,
KT
0 new messages