![]() |
AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
Items.Count wird auch über eine Message abgerufen, zu einem Zeitpunkt zu dem das Messagehandling in dem Fall noch nicht abgeschlossen ist. "Ausbrechen" könnte man in der Art, zum weiterbasteln...
Delphi-Quellcode:
unit Unit2;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls,CommCtrl, StdCtrls; const WM_MyInfoMessage=WM_USER + 777; type TListView=Class(comCtrls.TListView) private FOnItemDeleted: TNotifyEvent; procedure CNNotify(var Message: TWMNotifyLV); message CN_NOTIFY; Procedure MyInfomessage(var Message: TWMNotify);message WM_MyInfoMessage; published Property OnItemDeleted:TNotifyEvent read FOnItemDeleted write FOnItemDeleted; End; TForm2 = class(TForm) ListView1: TListView; Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private procedure OnItemDel(sender: TObject); { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; implementation {$R *.dfm} { TListView } procedure TListView.CNNotify(var Message: TWMNotifyLV); begin inherited; if (Message.NMHdr.code = LVN_DELETEITEM) or (Message.NMHdr.code = LVN_DELETEALLITEMS ) then if Message.Result=1 then begin PostMessage(Handle,WM_MyInfoMessage,0,0); end; end; procedure TForm2.Button1Click(Sender: TObject); begin Showmessage('Before:'+IntToStr(ListView1.Items.Count)); ListView1.Items.Delete(0); end; procedure TForm2.FormCreate(Sender: TObject); begin ListView1.OnItemDeleted := OnItemDel; end; Procedure TForm2.OnItemDel(sender:TObject); begin Showmessage('After:' + IntToStr(TListView(Sender).Items.Count)); end; procedure TListView.MyInfomessage(var Message: TWMNotify); begin if Assigned(FOnItemDeleted) then FOnItemDeleted(Self); end; end. |
AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
Zitat:
Es ist mir aber noch nicht ganz klar, wieso. Du schickst beim Erhalt der LVN_DELETEITEM message einfach nochmals eine User-Message an das eigene Fenster. Wieso wird die dann erst NACH dem eigentlichen Delete-Ereignis verarbeitet, wenn die LVN_DELETEITEM Message noch VOR dem Delete gesendet wird? Hat das vielleicht etwas mit der Message-Warteschlange zu tun? |
AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
Delphi-Quellcode:
hat mit der "Wartesschlange" zu tun , deshalb Postmessage statt SendMessage.
inherited; // hier ist schön gelöscht (Originalmessagehandling abgeschlossen), aber wir sind noch in der "Schlange"
if Message.NMHdr.code=LVN_DELETEITEM then if Message.Result=1 then // Result wird nach dem Löschen im inherited gesetzt BTW ich hatte es nochmals geändert, die Message wird jetzt innerhalb des LV verarbeitet, falls Du das ganze für eine Komponente brauchen solltest. |
AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
Weil PostMessage wartet, bis die Nachricht verarbeitet wurde, und deshalb das das Delete-Ereignis dann schon abgearbeitet ist?
Du meinst, dass die User-Message nicht an das Fenster, sondern an die eigene ListView gesendet wird? VIELEN, VIELEN HERZLICHEN DANK!!! Ich spendiere dir hiermit ein frisches, kühles virtuelles Lager-Pils! |
AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
SendMessage wartet, Postmessage nicht, es wird einfach in die Schlange eingereiht...
habe nochmals etwas umgebaut .... |
AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
Zitat:
Wie löschst du denn sonst mehrere auf einmal? (Nebenbei kann der Benutzer selbst ohnehin nix löschen, sondern nur der Programmierer mit dem passenden Befehl, so dass der Zeitpunkt danach ohnehin feststeht und erreichbar ist...) |
AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
Zitat:
|
AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
Wie kann ein Anwender Einträge aus einer ListView löschen? Welche Tasten muss man da drücken?
|
AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
Leider bei Clear nicht hier wäre noch LVN_DELETEALLITEMS zu behandeln...
Delphi-Quellcode:
if (Message.NMHdr.code = LVN_DELETEITEM) or (Message.NMHdr.code = LVN_DELETEALLITEMS ) then
|
AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
@Bummi: Wenn es nun aber mehrere Instanzen der so modifizierten TListView im Programm gibt: Wie könnte man erfahren, welche Instanz die Message gesendet hat? Wie würdest du diese Information so in PostMessage kodieren, dass sie in MyInfomessage wieder dekodiert werden kann? Und wie kann CNNotify erfahren, von welcher Instanz die Nachricht kommt?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz