Zdarzenie po zmianie szerokości ListView

0

Witam, mam na formie 2 listview. Chciałbym, żeby jak ktoś zmieni szerokość kolumny jednego ListView, automatycznie zmieniła się szerokość drugiego ListView.

0

Jakieś pytanie może?

0

jak to zrobić technicznie (programistycznie)

0

Nie szukałeś pewnie nawet na google, czy jest jakiś przykładowy kod na wykrycie zmiany rozmiarów
kolumny w ListView. Ta strona wprawdzie przez chwilę nie działała, ale już działa. Tylko nie, że ja
osobiście nie sprawdzałem czy to działa, ale myślę że skoro większość porad na tej stronie jest po
opublikowaniu sprawdzana to działa: http://www.swissdelphicenter.ch/torry/showcode.php?id=1264
Chociaż jeżeli nie potrzebujesz dokładnej obsługi zdarzen zmiany rozmiaru kolumn tylko chcesz aby po
tym jak skończysz rozszerzać kolumnę pierwszego ListView to żeby jeżeli taka kolumna istnieje w już 2
zwykłym ListView to musisz niestety stworzyć tak jak na stronie powyżej komponent, który dziedziczy z
TListView i posiaada obsługę zdarzenia. Wtedy tworzysz dynamicznie ten ListVeiw z obsługą jednego
zdarzenia (albo dodając komponent jak masz taką możliwość i chcesz tylko że raczej radził bym robić
to dynamicznie bo akurat ten LsitView jest sztywno zrobiony dla tego programu ktory ma go używać) i
przy zmianie rozmiaru kolumny będzie zmieniał w drugim ListView jej rozmiar. Kod modułu ExListView:

unit exlistview;

interface

uses
  Windows, SysUtils, Messages, Classes, Controls, Forms, ComCtrls, CommCtrl;

type
  TPBExListview = class(TListview)
  protected
    function FindColumnIndex(pHeader: pNMHdr): Integer;
    procedure WMNotify(var Msg: TWMNotify); message WM_NOTIFY;
  end;

procedure Register;

implementation

uses main;

procedure Register;
begin
  RegisterComponents('Samples', [TPBExListview]);
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);
var
  Col : integer;
begin
  inherited;
  case Msg.NMHdr^.code of
    HDN_ENDTRACK:
    begin
     Col := FindColumnIndex(Msg.NMHdr);
     if Col <= MainForm.ListView2.Columns.Count - 1 then
       MainForm.ListView2.Columns[Col].Width := Self.Columns[Col].Width;
    end;
  end;
end;

end.

Jak widzisz używa on modułu main, w ktorym jest głowna formatka a na niej ListView2. Dodajesz do
sekcji uses moduł exlistview i w OnCreate przykłądowo taki kod tworzy Tobie dynamicznie co trzeba :)

procedure TMainForm.FormCreate(Sender: TObject);
var
  I : Byte;
  A : TPBExListview;
begin
  A := TPBExListview.Create(Self);
  A.ViewStyle := vsReport;
  for I := 1 to 3 do
  begin
  A.Columns.Add;
  end;
  A.Columns[0].Caption := 'a';
  A.Columns[0].Width := 50;
  A.Columns[1].Caption := 'b';
  A.Columns[1].Width := 50;
  A.Columns[2].Caption := 'c';
  A.Columns[2].Width := 50;
  A.Parent := Self;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1