Delphi-PRAXiS
Seite 1 von 3  1 23      

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)

PeterPanino 5. Aug 2012 19:57

Nachricht NACH dem Löschen eines ListView.Item erhalten?
 
Hallo! Ich möchte eine Nachricht von einem Listview erhalten, NACHDEM ein Item aus der Listview gelöscht wurde. Ich habe folgenden Code probiert:
Delphi-Quellcode:
private
    { Private-Deklarationen }
    OriginalListViewWindowProc: TWndMethod;
    procedure ListViewWindowProcEx(var Message: TMessage);

procedure TForm1.FormCreate(Sender: TObject);
begin
  OriginalListViewWindowProc := MyListView1.WindowProc;
  MyListView1.WindowProc := ListViewWindowProcEx;
end;

procedure TForm1.ListViewWindowProcEx(var Message: TMessage);
begin
  if Message.Msg = CN_NOTIFY then
  begin
    if PNMHdr(Message.LParam)^.Code = LVN_DELETEITEM then
    begin
      // Funktioniert nicht, da das Item gelöscht wird,
      // NACHDEM die Nachricht gesendet wurde:
      Self.Caption := IntToStr(MyListView1.Items.Count);
    end;
  end;
  OriginalListViewWindowProc(Message);
end;
Es sollte die Anzahl der Items NACH dem Löschen angezeigt werden. Mit dem obigen Code wird aber die Anzahl der Items VOR dem Löschen des Items angezeigt!

Wie kann man also eine Nachricht NACH dem Löschen eines Items erhalten?

Bummi 5. Aug 2012 20:09

AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
 
Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls,CommCtrl, StdCtrls;

type
  TListView=Class(comCtrls.TListView)
        procedure CNNotify(var Message: TWMNotifyLV); message CN_NOTIFY;

  End;
  TForm2 = class(TForm)
    ListView1: TListView;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { 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 then
     if Message.Result=1 then Showmessage('Deleted');


end;

PeterPanino 5. Aug 2012 21:16

AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
 
Hallo Bummi, vielen Dank für den Code. Aber leider ist das Problem damit nicht gelöst: Die Anzahl der Items ist beim Erhalt der Nachricht gleich groß wie vorher. Sie müsste aber um die Zahl des gelöschten Items vermindert sein, in dieser Reihenfolge:

1. Anzahl der Items vorher ist n

2. 1 Item wird gelöscht

3. Nachricht sagt, Anzahl der Items ist nun n - 1

Es müsste also eine Nachricht sein, die NACH dem Löschen des Items die verminderte Zahl der Items zurückgibt.

Oder, wenn mehrere Items auf einmal gelöscht werden:

1. Anzahl der Items vorher ist n

2. x Items werden gelöscht

3. Nachricht sagt, Anzahl der Items ist nun n - x

haentschman 5. Aug 2012 21:36

AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
 
Mache dir doch ein eigenes Event was dir nach dem Löschen Befehl den neuen Count liefert. Was ist mit OnChange, OnDeletion des Listviews. Nach jedem Ändern bzw. Löschen wird es ausgelöst. Kannst du damit was anfangen ?

Irgendwie habe ich den Eindruck daß zu kompliziert gedacht wird. :gruebel: ... oder ich habe die Anforderung nicht richtig verstanden.

PeterPanino 5. Aug 2012 21:48

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

Zitat von haentschman (Beitrag 1176987)
Mache dir doch ein eigenes Event was dir nach dem Löschen Befehl den neuen Count liefert. Was ist mit OnChange, OnDeletion des Listviews. Nach jedem Ändern bzw. Löschen wird es ausgelöst. Kannst du damit was anfangen ?

Irgendwie habe ich den Eindruck daß zu kompliziert gedacht wird. :gruebel: ... oder ich habe die Anforderung nicht richtig verstanden.

OnDeletion wird genauso VOR der Verminderung der Items ausgelöst. OnChange ist ganz was anderes.

Sir Rufo 5. Aug 2012 21:56

AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
 
Wenn du die Anzahl der Items nach dem Löschen ausgeben möchtest, dann ist OnChange genau das Event, was du suchst. Dieses Ereignis wird nach jeder Änderung am ListView aufgerufen.

Du kannst also auch Items hinzufügen, alle Items auf einmal löschen, whatever, das Event wird anschließend abgefeuert.

PeterPanino 5. Aug 2012 22:10

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

Zitat von Sir Rufo (Beitrag 1176989)
Wenn du die Anzahl der Items nach dem Löschen ausgeben möchtest, dann ist OnChange genau das Event, was du suchst. Dieses Ereignis wird nach jeder Änderung am ListView aufgerufen.

Du kannst also auch Items hinzufügen, alle Items auf einmal löschen, whatever, das Event wird anschließend abgefeuert.

Nein. OnChange wird bei einem Selection-Wechsel aufgerufen. Je nach Anzahl der Items im Listview findet ein Selection-Wechsel nach dem Löschen von Items statt. Nimm aber ein Listview mit nur wenigen Items und lösche das unterste Item (Report-View), sodass kein Selection-Wechsel stattfindet: OnChange wird dann nicht aufgerufen.

PeterPanino 5. Aug 2012 22:23

AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
 
http://docwiki.embarcadero.com/Libra...TLVChangeEvent

Hier steht nichts von gelöschten Items.

jaenicke 5. Aug 2012 22:25

AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
 
1. Nimm einfach eine "richtige" Komponente, nämlich z.B. die TVirtualStringTree:
http://www.delphi-gems.com/index.php...rtual-treeview
Dort gibt es das Event OnFreeNode, in dem die Anzahl bereits die neue ist:
Delphi-Quellcode:
procedure TForm236.VirtualStringTree1FreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
begin
  Caption := IntToStr(Sender.RootNode.ChildCount);
end;
Außerdem ist die Komponente auch deutlich schneller (und einfacher zu benutzen sobald man die GUI ordentlich von der Datenhaltung trennt).

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.

PeterPanino 5. Aug 2012 22:33

AW: Nachricht NACH dem Löschen eines ListView.Item erhalten?
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 Uhr.
Seite 1 von 3  1 23      

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