Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
но вот одна заминка получается:

PColorMap = ^TColorMap;
{$EXTERNALSYM _COLORMAP}
_COLORMAP = packed record
cFrom: TColorRef;
cTo: TColorRef;
end;
TColorMap = _COLORMAP;
{$EXTERNALSYM COLORMAP}
COLORMAP = _COLORMAP;
(c) CommCtrl.pas

TColorMap = class(TComponent)
private
fColors: TSClrCollection;
fBase: TColorMap;
fChilds: TList;
...
property Colors: TSClrCollection read fColors write fColors stored False;
end;
(с) SColors.pas
результате чего получаем ошибку
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
6-74869
shershR
2002-10-25 16:38
2002.12.23
Как правильно пользоваться мастером ActiveX ?


4-75028
bytebutcher
2002-11-06 23:51
2002.12.23
Как узнать частоту обновления для текущего видеорежима?


1-74635
bambina
2002-12-12 13:12
2002.12.23
TTreeview


14-74938
KidMan
2002-12-01 23:42
2002.12.23
Простите но опять об Инстал Шиилдс и BDE


3-74565
Shaman
2002-12-03 17:21
2002.12.23
Значение поля кот. было до обновления в триггере FOR UPDATE





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский