AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Nachricht NACH dem Löschen eines ListView.Item erhalten?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von PeterPanino · begonnen am 5. Aug 2012 · letzter Beitrag vom 6. Aug 2012
Antwort Antwort
Seite 1 von 3  1 23      
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#1

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

  Alt 5. Aug 2012, 20:57
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?

Geändert von PeterPanino ( 5. Aug 2012 um 21:00 Uhr) Grund: Typo
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

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

  Alt 5. Aug 2012, 21:09
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;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 5. Aug 2012, 22:16
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

Geändert von PeterPanino ( 5. Aug 2012 um 22:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 5. Aug 2012, 22:36
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. ... oder ich habe die Anforderung nicht richtig verstanden.
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#5

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

  Alt 5. Aug 2012, 22:48
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. ... oder ich habe die Anforderung nicht richtig verstanden.
OnDeletion wird genauso VOR der Verminderung der Items ausgelöst. OnChange ist ganz was anderes.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

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

  Alt 5. Aug 2012, 22:56
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#7

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

  Alt 5. Aug 2012, 23:10
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.
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#8

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

  Alt 5. Aug 2012, 23:23
http://docwiki.embarcadero.com/Libra...TLVChangeEvent

Hier steht nichts von gelöschten Items.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#9

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

  Alt 5. Aug 2012, 23:25
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#10

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

  Alt 5. Aug 2012, 23:33
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:36 Uhr.
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