AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi ListView - automatische Spaltenbreite-Anpassung abfangen
Thema durchsuchen
Ansicht
Themen-Optionen

ListView - automatische Spaltenbreite-Anpassung abfangen

Ein Thema von eholzer · begonnen am 23. Jan 2013 · letzter Beitrag vom 24. Jan 2013
Antwort Antwort
eholzer

Registriert seit: 22. Okt 2009
51 Beiträge
 
#1

ListView - automatische Spaltenbreite-Anpassung abfangen

  Alt 23. Jan 2013, 07:10
Hallo,

wenn man in der ListView (Detailansicht und ListView hat Focus) Shift+Strg++ drückt, dann wird die erste Spalte and die Breite der Texte angepasst. Das gleiche passiert, wenn man Doppelklick auf den Spaltentrenner im Spaltenkopf macht.
Meine Frage dazu: is es möglich diese Aktionen abzufangen?

Gruß
Eric

Geändert von eholzer (23. Jan 2013 um 07:12 Uhr)
  Mit Zitat antworten Zitat
ThoPos

Registriert seit: 30. Jun 2004
Ort: Köln
69 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: ListView - automatische Spaltenbreite-Anpassung abfangen

  Alt 23. Jan 2013, 07:53
Hallo Eric,

ich habe mal in einem englischsprachigen Delphi-Forum (Quelle unbekannt) folgende Unit gefunden. Diese erweitert die Standard-Listview um die Events OnBeginColumnResize, OnColumnResize und OnEndColumnResize. Damit reagiere ich in meinen Programmen auf Änderungen der Spaltenbreiten.

Delphi-Quellcode:
unit ExListView;

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.
Gruß
Thomas
Thomas
  Mit Zitat antworten Zitat
eholzer

Registriert seit: 22. Okt 2009
51 Beiträge
 
#3

AW: ListView - automatische Spaltenbreite-Anpassung abfangen

  Alt 23. Jan 2013, 19:12
Hallo Thomas,

danke für deine Antwort, leider die Ereignise aus deinem Beispiel (OnBeginColumnResize, OnEndColumnResize, OnColumnResize) werden nicht abgefeuert, wenn man die Spaltenbreite-Anpassung startet so wie ich beschrieben habe.

Gruß
Eric
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#4

AW: ListView - automatische Spaltenbreite-Anpassung abfangen

  Alt 23. Jan 2013, 22:07
Hallo,

Du könntest mal folgendes Versuchen:

Delphi-Quellcode:
type
  TListView = class (Vcl.ComCtrls.TListView)
  private
    procedure WMNotify (var Msg : TWMNotify); message WM_NOTIFY;
  protected
    procedure KeyDown (var Key : Word; Shift : TShiftState); override;
  end;
im Interfaceteil Deiner Form deklarieren und

Delphi-Quellcode:
uses
  Winapi.CommCtrl;

procedure TListView.WMNotify (var Msg : TWMNotify);
begin
  if Msg.NMHdr.code = HDN_DIVIDERDBLCLICK then
    Exit;

  inherited
end;

procedure TListView.KeyDown (var Key : Word; Shift : TShiftState);
begin
  if (ssShift in Shift) and (ssCtrl in Shift) and (Key = VK_ADD) then
    Key := 0
end;
in Deinen Implementationsteil. Sollte es mit HDN_DIVIDERDBLCLICK nicht klappen, dann versuch es mit HDN_DIVIDERDBLCLICKW Gruß
Volker Zeller
  Mit Zitat antworten Zitat
eholzer

Registriert seit: 22. Okt 2009
51 Beiträge
 
#5

AW: ListView - automatische Spaltenbreite-Anpassung abfangen

  Alt 24. Jan 2013, 19:59
Hallo Volker,

danke, das ist genau was ich gesucht habe.

Eric
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 23:28 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