Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TListview gibt es OnColumnResize o.ä.?? (https://www.delphipraxis.net/69677-tlistview-gibt-es-oncolumnresize-o-ae.html)

kaiser1401 18. Mai 2006 14:42


TListview gibt es OnColumnResize o.ä.??
 
Hallo,

gibt es ein Ereignis was ausgelöst wird wenn ich die spaltenbreite in einem listview änder?

Brauch soetwas um den inhalt dieser spalte neu zu zeichnen.

kaiser1401 18. Mai 2006 15:59

Re: TListview gibt es OnColumnResize o.ä.??
 
So, hab nun doch noch etwas gefunden womit das gehen sollte:

PBExListview

Delphi-Quellcode:
unit PBExListview;

interface

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

type
  TLVColumnResizeEvent = procedure(Sender: TCustomListview;
    columnindex: Integer;
    columnwidth: Integer) of object;
  TPBExListview = class(TListview)
  private
    FBeginColumnResizeEvent: TLVColumnResizeEvent;
    FEndColumnResizeEvent: TLVColumnResizeEvent;
    FColumnResizeEvent: TLVColumnResizeEvent;

  protected
    procedure DoBeginColumnResize(columnindex, columnwidth: Integer);
      virtual;
    procedure DoEndColumnResize(columnindex, columnwidth: Integer);
      virtual;
    procedure DoColumnResize(columnindex, columnwidth: Integer);
      virtual;
    procedure WMNotify(var Msg: TWMNotify); message WM_NOTIFY;
    function FindColumnIndex(pHeader: pNMHdr): Integer;
    function FindColumnWidth(pHeader: pNMHdr): Integer;
    procedure CreateWnd; override;
  published
    property OnBeginColumnResize: TLVColumnResizeEvent
      read FBeginColumnResizeEvent write FBeginColumnResizeEvent;
    property OnEndColumnResize: TLVColumnResizeEvent
      read FEndColumnResizeEvent write FEndColumnResizeEvent;
    property OnColumnResize: TLVColumnResizeEvent
      read FColumnResizeEvent write FColumnResizeEvent;
  end;

procedure Register;

implementation

uses CommCtrl;

procedure Register;
begin
  RegisterComponents('PBGoodies', [TPBExListview]);
end;

procedure TPBExListview.DoBeginColumnResize(columnindex, columnwidth: Integer);
begin
  if Assigned(FBeginColumnResizeEvent) then
    FBeginColumnResizeEvent(Self, columnindex, columnwidth);
end;

procedure TPBExListview.DoEndColumnResize(columnindex, columnwidth: Integer);
begin
  if Assigned(FEndColumnResizeEvent) then
    FEndColumnResizeEvent(Self, columnindex, columnwidth);
end;

procedure TPBExListview.DoColumnResize(columnindex, columnwidth: Integer);
begin
  if Assigned(FColumnResizeEvent) then
    FColumnResizeEvent(Self, columnindex, columnwidth);
end;

function TPBExListview.FindColumnIndex(pHeader: pNMHdr): Integer;
var
  hwndHeader: HWND;
  iteminfo: THdItem;
  ItemIndex: Integer;
  buf: array [0..128] of Char;
begin
  Result := -1;
  hwndHeader := pHeader^.hwndFrom;
  ItemIndex := pHDNotify(pHeader)^.Item;
  FillChar(iteminfo, SizeOf(iteminfo), 0);
  iteminfo.Mask := HDI_TEXT;
  iteminfo.pszText := buf;
  iteminfo.cchTextMax := SizeOf(buf) - 1;
  Header_GetItem(hwndHeader, ItemIndex, iteminfo);
  if CompareStr(Columns[ItemIndex].Caption, iteminfo.pszText) = 0 then
    Result := ItemIndex
  else
  begin
    for ItemIndex := 0 to Columns.Count - 1 do
      if CompareStr(Columns[ItemIndex].Caption, iteminfo.pszText) = 0 then
      begin
        Result := ItemIndex;
        Break;
      end;
  end;
end;

procedure TPBExListview.WMNotify(var Msg: TWMNotify);
begin
  inherited;
  case Msg.NMHdr^.code of
    HDN_ENDTRACK:
      DoEndColumnResize(FindColumnIndex(Msg.NMHdr),
        FindColumnWidth(Msg.NMHdr));
    HDN_BEGINTRACK:
      DoBeginColumnResize(FindColumnIndex(Msg.NMHdr),
        FindColumnWidth(Msg.NMHdr));
    HDN_TRACK:
      DoColumnResize(FindColumnIndex(Msg.NMHdr),
        FindColumnWidth(Msg.NMHdr));
  end;
end;

procedure TPBExListview.CreateWnd;
var
  wnd: HWND;
begin
  inherited;
  wnd := GetWindow(Handle, GW_CHILD);
  SetWindowLong(wnd, GWL_STYLE,
    GetWindowLong(wnd, GWL_STYLE) and not HDS_FULLDRAG);
end;

function TPBExListview.FindColumnWidth(pHeader: pNMHdr): Integer;
begin
  Result := -1;
  if Assigned(PHDNotify(pHeader)^.pItem) and
    ((PHDNotify(pHeader)^.pItem^.mask and HDI_WIDTH) <> 0) then
    Result := PHDNotify(pHeader)^.pItem^.cxy;
end;

end.
Leider bekomme ich, wenn ich den text kopiere und in eine .pas schreibe und diese dann als komponente installieren möchte einen Fehler: "Zugriddsverletzung bei Adresse 03652932. Lesen von Adresse FFFFFFFF."

Kann mir vieleicht jemand sagen woran das liegen könnte oder was ich an dem code ändern muss?

(Delphi Prof. 7)

kaiser1401 22. Mai 2006 08:19

Re: TListview gibt es OnColumnResize o.ä.??
 
*push*

Niemand eine Idee??

uligerhardt 22. Mai 2006 09:06

Re: TListview gibt es OnColumnResize o.ä.??
 
Funktioniert bei mir wie es soll.

Uli.

kaiser1401 22. Mai 2006 10:02

Re: TListview gibt es OnColumnResize o.ä.??
 
So, ich hab jetzt gefunden was den Fehler verursacht hat denk ich:

Ich hatte vor einiger Zeit Delphi Speedup installiert.

Nachdem ich nun nicht mehr weitergekommen bin hab ich angefangen sachen zu deinstallieren und nachdem ich das Speedup deinstalliert hab läuft jetzt wieder alles.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 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