Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Nachricht NACH dem Löschen eines ListView.Item erhalten? (https://www.delphipraxis.net/169696-nachricht-nach-dem-loeschen-eines-listview-item-erhalten.html)

Bummi 5. Aug 2012 22:50

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.

PeterPanino 6. Aug 2012 00:00

AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
 
Zitat:

Zitat von Bummi (Beitrag 1176996)
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...

Phantastisch, es scheint zu funktionieren!!!

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?

Bummi 6. Aug 2012 00:08

AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
 
Delphi-Quellcode:
   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
hat mit der "Wartesschlange" zu tun , deshalb Postmessage statt SendMessage.
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.

PeterPanino 6. Aug 2012 00:22

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!

Bummi 6. Aug 2012 00:58

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 ....

jaenicke 6. Aug 2012 06:33

AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
 
Zitat:

Zitat von PeterPanino (Beitrag 1176994)
Zitat:

Zitat von jaenicke (Beitrag 1176993)
2. Da du an der Stelle weißt, dass das Item gelöscht werden wird, kannst du doch auch einfach eins von der Anzahl abziehen.

Das Programm weiß ja nicht, wie viele Items der Benutzer löscht. Das sollte das Programm NACH dem Löschen ja erfahren. Tut es aber nicht. Deswegen meine Fragestellung.

Naja, du bekommst aber bei jedem gelöschten Item eine solche Message. Das gilt auch z.B. für Clear, wenn du alle löschst...

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...)

PeterPanino 6. Aug 2012 07:34

AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
 
Zitat:

Zitat von jaenicke (Beitrag 1177018)
Naja, du bekommst aber bei jedem gelöschten Item eine solche Message.

Naja, streng genommen ist es - vom Zeitpunkt der Nachricht her - eine Vorhersage (z.B. bei OnDeletion). Mit der Methode von Bummi wird der Nachrichtenzeitpunkt auf die Zeit NACH der Aktion verschoben. Das ist vom Standpunkt des Benutzers aus überzeugender.

Furtbichler 6. Aug 2012 07:36

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?

Bummi 6. Aug 2012 07:37

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

PeterPanino 6. Aug 2012 07:44

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 21:30 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz