Форум: "Основная";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];
ВнизTListView :OnResizeColumn - предложите аналог Найти похожие ветки
← →
Сатир (2002-12-09 13:25) [0]Как узнать, что происходит изменение размера колонки?(необходимо для вызова метода TListView.Repaint, поскольку обрабатывается метод TListView.OnDrawItem).
Стандартных обработчиков нет:(
Заранее благодарен
← →
MBo (2002-12-09 13:38) [1]ListView_GetHeader
WM_NOTIFY от полученного хедера
HDN_***TRACK
← →
Сатир (2002-12-09 17:02) [2]2MBo © (09.12.02 13:38)
спасибо
а как связать ListView_GetHeader с событием, которое изменяет ширину колонки?
← →
Сатир (2002-12-10 14:22) [3]any ideas?
← →
MBo (2002-12-10 17:00) [4]да вроде я уж все сказал...
uses ...commctrl
procedure TForm1.FormCreate(Sender: TObject);
begin
hhd:=ListView_GetHeader(ListView1.Handle);
end;
procedure TForm1.wm_notify(var m: twmnotify);
begin
if (m.NMHdr.hwndFrom=hhd) and (m.NMHdr.code=hdn_endtrack) then
caption:="I like to move it, move it!"
end;
← →
Сатир (2002-12-10 17:42) [5]2MBo © (10.12.02 17:00)
круто... мне бы так%)
thnX
но вот одна заминка получается:
(c) CommCtrl.pas
PColorMap = ^TColorMap;
{$EXTERNALSYM _COLORMAP}
_COLORMAP = packed record
cFrom: TColorRef;
cTo: TColorRef;
end;
TColorMap = _COLORMAP;
{$EXTERNALSYM COLORMAP}
COLORMAP = _COLORMAP;
(с) SColors.pas
TColorMap = class(TComponent)
private
fColors: TSClrCollection;
fBase: TColorMap;
fChilds: TList;
...
property Colors: TSClrCollection read fColors write fColors stored False;
end;
результате чего получаем ошибку
Incompatible Types: "_COLORMAP" and "TColorMap"
Есть ли какая альтернатива в сложившейся ситуации?
← →
MBo (2002-12-10 18:19) [6]Не вижу связи с listview ;)
у тебя конфликт имен.
1) сделай fBase: SColors.TColorMap;
(как я понял, нужен твой тип, а не из commctrl)
2 путь - скопируй нужные определения из commctrl себе в модуль.
← →
Сатир (2002-12-10 20:31) [7]2MBo © (10.12.02 18:19)
вообщем, я в своём модуле просто изменил TColorMap на TXColorMap
но получилось совсем не то, что хотел:(
Есть PageControl1, на котором 2 страницы.
И вот когда я перехватываю это сообщение (WM_NOTIFY), при переходах между страницами не происходит отрисовки нужной страницы, а остается одна и таже страница.
Возможно, Вы указали неверный код сообщения (m.NMHdr.code=hdn_endtrack) которое мне нужно обработать.
Вообщем, если будет настроение, посмотрите на пробный исходник, может найдёте несоответствие.
procedure ListView1DrawItem(Sender: TCustomListView; Item: TListItem;
Rect: TRect; State: TOwnerDrawState);
procedure WMNotify(var Msg: TWMNotify);message WM_NOTIFY;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
lvHD:HWND;
implementation
{$R *.dfm}
procedure TForm1.WMNotify(var Msg: TWMNotify);
begin
if (Msg.NMHdr.hwndFrom=lvHD) and (Msg.NMHdr.code=HDN_ENDTRACK) then
ListView1.Repaint;
end;
procedure TForm1.ListView1DrawItem(Sender: TCustomListView;
Item: TListItem; Rect: TRect; State: TOwnerDrawState);
begin
with TListView(Sender).Canvas do begin
Brush.Color:=clWhite;
FillRect(Rect);
if odSelected in State then begin
Pen.Color:=clBlack;
Rectangle(Rect);
end;
with Rect do begin
TextOut(left+17,top+1,item.Caption);
left:=left+TListView(sender).Column[0].Width;
TextOut(left,top+1,item.SubItems[0]);
left:=left+TListView(sender).Column[1].Width;
TextOut(left,top+1,item.SubItems[1]);
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
lvHD:=ListView_GetHeader(ListView1.Handle);
end;
end.
Заранее благодарен.
← →
MBo (2002-12-10 20:57) [8]Все правильно - wm_notify посылается Parent-у ListView, в твоем случае это TabSheetX. Перехватить сообщения контролу (субклассировать) несколько сложнее, чем сообщения форме, но возможно.
private
OldProc:TWndMethod;
procedure NewProc(var m:tmessage);
...
procedure TForm1.FormCreate(Sender: TObject);
begin
hhd:=ListView_GetHeader(ListView2.Handle);
oldproc:=tabsheet2.WindowProc;
tabsheet2.WindowProc:=newproc;
end;
procedure TForm1.NewProc(var m: tmessage);
begin
if m.Msg=wm_notify then
with TWmnotify(m) do
if (NMHdr.hwndFrom=hhd) and (NMHdr.code=hdn_endtrack) then
caption:="I like to move it, move it!";
oldproc(m);
end;
← →
Сатир (2002-12-11 13:17) [9]2MBo © (10.12.02 20:57)
кстати, с Днём Рождения!
← →
Сатир (2002-12-11 13:57) [10]2MBo © (10.12.02 20:57)
Field TForm1.OldProc does not have a corresponding component. Remove the declaration? (Yes/No/Cancel/Help)
как быть? может нужно добавить обявление message ...в procedure NewProc(var m:tmessage);
← →
MBo (2002-12-11 14:17) [11]OldProc - поле формы, т.е. переменная, можно ее даже в var положить. Добавлять ничего не нужно. Вот полный рабочий код модуля, если ты где-то запутался (ListView2 лежит на TabSheet2)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, commctrl;
type
TForm1 = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
ListView2: TListView;
procedure FormCreate(Sender: TObject);
private
OldProc:TWndMethod;
procedure NewProc(var m:tmessage);
public
{ Public declarations }
end;
var
Form1: TForm1;
hhd:thandle;
implementation
{$R *.DFM}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
hhd:=ListView_GetHeader(ListView2.Handle);
oldproc:=tabsheet2.WindowProc;
tabsheet2.WindowProc:=newproc;
end;
procedure TForm1.NewProc(var m: tmessage);
begin
if m.Msg=wm_notify then
with TWmnotify(m) do
if (NMHdr.hwndFrom=hhd) and (NMHdr.code=hdn_endtrack) then
caption:="I like to move it, move it!";
oldproc(m);
end;
end.
← →
Сатир (2002-12-11 15:06) [12]2MBo © (11.12.02 14:17)
вообщем, почти то, что надо, но...
1)отрисовка происходит только после завершения изменения ширины колонки; хотелось бы, чтоб она выполнялась и вовремя изменения размера, как в TListView.OnResize. Насколько я могу предполагать, это зависит от NMHdr.code . Тогда вопрос: чему он должен равняться, чтобы перехватить событие не в конце изменения, а во время изменения размера?
2)кстати, у моего экземпляра TListView обрабатывается событие OnDrawItem и, соответственно, выставлен флаг OwnerDraw. Может и здесь есть какие-то неявные зависимости?
3)для чистоты эксперемента, создайте несколько колонок, задайте свойство ViewStyle=vsReport, добавьте несколько айтемов с подайтемами и поэксперементируйте в этом случае. Обратите внимание на то, что отрисовка происходит, но определение ширины колонок неверное:(. Может, по ходу нужно и ширину колонок вычислять по этой схеме? В CommCtrl есть ф-ция ListView_GetColumnWidth. Имеет ли смысл её использовать? Если да, то в контексте чего?
← →
MBo (2002-12-11 16:09) [13]procedure TForm1.NewProc(var m: tmessage);
begin
if m.Msg=wm_notify then
with TWmnotify(m) do
if (NMHdr.hwndFrom=hhd) then begin
memo1.lines.add(inttostr(hdn_first-NMHdr.code));
caption:=inttostr(ListView_GetColumnWidth(ListView2.Handle,0))
end;
oldproc(m);
end;
Проанализируй по commctrl, какие сообщения приходят.
Некоторые параметры ListView надежнее определять с помощью сообщений, как я здесь написал, а не через свойства и методы.
← →
Сатир (2002-12-11 18:28) [14]2MBo © (11.12.02 16:09)
в мемо во время изменения ширины колонки(пока не отпущена левая кнопка мышки) бегут нули и единички по очереди, то есть ...01010101010... . После отпускания мышки получаем 7, то есть ...01010170101 или 0101701. Есть предположение, что во время изменения размера постоянно генерятся 2 события:
HDN_BEGINTRACKA = HDN_FIRST-6;
HDN_ENDTRACKA = HDN_FIRST-7;
после отпускания мышки
HDN_TRACKA = HDN_FIRST-8;(не уверен);
вообщем, проблема решилась тем, что в обработчике OnDrawItem я заменил ListView1.Column[0].Width на ListView_GetColumnWidth(ListView1.Handle,0); и всё стало на свои места.
Большое спасибо, ещё раз с Днём Рождения
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c