Einzelnen Beitrag anzeigen

Jelen

Registriert seit: 5. Nov 2003
45 Beiträge
 
#4

Re: TLIstView Spaltenänderung Benachrichtigung

  Alt 9. Mär 2009, 15:42
Dieses Thema hat mir gerade weitergeholfen.
Um die Sache etwas eleganter nutzen zu können, habe ich eine Komponente daraus gemacht:
Delphi-Quellcode:
unit MyListView;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;

type TColWidthChangeEvent = procedure(Sender: TObject;
                                      ACol,AWidth: integer) of object;
     TMyListview = class(TListview)
     private
       FOnColWidthChange: TColWidthChangeEvent;
     protected
       procedure WMNotify(var Msg: TWMNotify); message WM_NOTIFY;
     published
       property OnColWidthChange: TColWidthChangeEvent read FOnColWidthChange
                                                       write FOnColWidthChange;
     end;

procedure Register;

implementation

uses commctrl;

procedure TMyListview.WMNotify(var Msg: TWMNotify);
 var ColumnIndex: integer;
 begin
  inherited;
  if (Msg.NMHdr^.code = HDN_ENDTRACK) and Assigned(OnColWidthChange)
  then begin { Ereignis OnColWidthChange generieren }
        ColumnIndex := PHDNotify(Msg.NMHdr)^.Item;
        OnColWidthChange(Self,ColumnIndex,Columns[ColumnIndex].Width);
       end;
 end;

procedure Register;
 begin
  RegisterComponents('My',[TMyListview]);
 end;

end.
Damit verfügt das TMyListView über das gewünschte OnColWidthChange-Ereignis.

Allerdings habe ich das commctrl.ListView_GetColumnWidth(Handle,ColumnInde x) rausgeworfen.
Es übergibt manchmal den Wert, bis zu dem der Anwender gezogen hat, aber nicht immer (?).

Columns[ColumnIndex].Width hingegen übergibt - zumindest bei mir - immer den Wert, der sich letztendlich einstellt, auch unter Berücksichtigung von MinWidth und MaxWidth.

@bitsetter: Falls Du dies noch liest, vielleicht kannst Du noch anfügen, warum Du ListView_GetColumnWidth benutzt hast.
  Mit Zitat antworten Zitat