Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Вниз

OwnerDraw в KOLListView   Найти похожие ветки 

 
Dimaxx ©   (2003-07-16 23:33) [0]

Прошу не пинать, если повторюсь - времени мало. Как отрисовывать элементы в listview в режиме Detail. Меня интересует рисование курсора-полоски, выделение выбранных элементов цветом. Как пользоваться drawstate и itemstate? Можно с примером... Сенькс!


 
Кладов   (2003-07-17 15:54) [1]


function TForm2.LVStackLVCustomDraw(Sender: PControl; DC: HDC;
 Stage: Cardinal; ItemIdx, SubItemIdx: Integer; const Rect: TRect;
 ItemState: TDrawState; var TextColor, BackColor: Integer): Cardinal;
   procedure ProvideColors;
   begin
     if odsSelected in ItemState then
     begin
       if LVStack.Focused then
       begin
         Sender.Canvas.Brush.Color := clHighlight;
         Sender.Canvas.Font.Color := clHighlightText;
       end
         else
       begin
         Sender.Canvas.Brush.Color := Color2RGB( clBtnFace );
         Sender.Canvas.Font.Color := clWindowText;
       end;
     end
       else
     begin
       Sender.Canvas.Brush.Color := clWindow;
       Sender.Canvas.Font.Color := clWindowText;
     end;
     Sender.Canvas.DeselectHandles;
   end;

var StartAddr, ItemAddr: Integer;
   Txt: String;
   R: TRect;
   SubItem: Integer;
   SI: Integer;
begin
 if Stage and CDDS_PREERASE = CDDS_PREERASE then
 begin
   ProvideColors;
   Result := CDRF_NOTIFYITEMDRAW;
 end
   else
 if LongBool(Stage and CDDS_PREPAINT) and (ItemIdx >= 0) then
 begin
   ProvideColors;
   StartAddr := EmuZ.rSP and 1;
   ItemAddr := StartAddr + ItemIdx * 2;
   R := Sender.LVItemRect( ItemIdx, lvipBounds );
   R.Right := R.Left;
   for SI := 0 to 3 do
   begin
     CASE SI OF
     0: SubItem := ColSP;
     1: SubItem := ColAddr;
     2: SubItem := ColValue;
     else SubItem := ColChars;
     END;
     CASE SubItem OF
     ColSP: if EmuZ.rSP = ItemAddr then Txt := "SP"
                                   else Txt := "";
     ColAddr:  Txt := Int2Dig( ItemAddr, 4 );
     ColValue: Txt := Int2Dig( EmuZ.PeekWord( ItemAddr ), 4 );
     ColChars: Txt := ByteToChar( EmuZ.PeekByte( ItemAddr + 1 ) ) +
                   ByteToChar( EmuZ.PeekByte( ItemAddr ) );
     END;
     R.Left := R.Right;
     R.Right := R.Left + Sender.LVColWidth[ SubItem ];
     Sender.Canvas.TextRect( R, R.Left, R.Top, Txt );
   end;
   Result := CDRF_SKIPDEFAULT;
 end
   else
   Result := CDRF_NOTIFYITEMDRAW;
end;


 
Gandalf ©   (2003-07-17 22:48) [2]

Я пожалуй в FAQ занесу.


 
Dimaxx ©   (2003-07-17 23:32) [3]

Спасибо!!


 
Dimaxx ©   (2003-07-19 00:03) [4]

В моем приложении есть TabControl. На нем динамически создаются вкладки, а на вкладках - KOLListView в режиме Detail.

var
 LVS: array[0..15] of PControl;    // Массив динамических ListView


Мои проблемы с KOLListView:


1) После создания мне нужно прицепить на OnLVCustomDraw создаваемого ListView функцию LVDraw. Определяю эту самую функцию LVDraw:

function TMain.LVDraw(Sender: PControl; DC: HDC; Stage: cardinal; ItemIdx,SubItemIdx: integer; const Rect: TRect; ItemState: TDrawState; var TextColor,BackColor: integer): cardinal;
begin
 ...
 ...    // Отрисовка элементов
 ...
end;


далее в процедуре создания ListView пишу:

...
LVS[<индекс>].OnLVCustomDraw:=TOnLVCustomDraw(MakeMethod(LVS[<индекс>],@LVDraw));
...


А компилятор ругается на @LVDraw, типа, нужна переменная. Какая, к чертям, переменная??!! Как правильно динамически прикрутить событие?


2) Далее. Мне нужно, чтобы при активации какой-либо вкладки фокус переходил на соответствующий ListView (с выбором элемента 0), который на ней лежит. Пишу в событии OnChange (также динамически этот ListView уже заполнен необходимой информацией):

...
LVS[<индекс>].CurItem:=0;
...


Получаю Access violation...!!!!! По идее, ListView должен получить фокус и выбрать самый верхний элемент! Шиш!!! Так где я не прав?

Спасибо!


 
Gandalf ©   (2003-07-19 10:31) [5]


> LVS[<индекс>].OnLVCustomDraw:=TOnLVCustomDraw(MakeMethod(LVS[<индекс>],@LVDraw));


А LVDraw то твонму что? LVS[<индекс>].OnLVCustomDraw:=VDraw;

> LVS[<индекс>].CurItem:=0;


Разве трудно запомнить что для ListView - все фишки начинаются с LV? Попробуй LVS[<индекс>].LVCurItem:=0;


 
Кладов   (2003-07-19 11:37) [6]

Это уже метод, зачем же его через MakeMethod пытаться в метод превращать. Чтобы не ошибаться, проще всего сделать так. Положить в design-time на формы TKOLListView, обычным способом создать обработчик события (достаточно между begin и end вставить комментарий //). Событие можно в ObjectInspector"е переименовать по вкусу. Теперь ненужный list view с формы можно удалить. Присваивать событие обычным :=, без всяких премудростей. Это метод формы, при вызове он получает первый (невидимый) параметр Self - объект формы, второй у него Sender, и дальше как объявлено.

По 2), разберитесь, что такое LVS[ ], и чем оно заполнено. И что за CutItem. В list view LVCurItem - это первая или единственная строка. У вас же есть возможность остановиться в нужном месте и исследовать, что в этот момент чему равно.


 
Dimaxx ©   (2003-07-19 23:44) [7]

С событием разобрался - все навешивается. Спасибо!

2 Gandalf: LVS[<индекс>].LVCurItem:=0 не помогает - все равно Access violation...


 
Dimaxx ©   (2003-07-22 01:15) [8]

Что-то опять не пойму со своим массивом ListView!

Элемент массива с индексом 0 содержит PControl от ListView, созданного в design-time. Далее я написал процедуру динамического создания новых ListView:

procedure CreateListView(Parent: PControl; P: array of PControl);
var I: integer;
begin
 //
 // Переменная I содержит индекс первого свободного в массиве PControl (<>nil)
 //
 P[I]:=NewListView(Parent,lvsDetail,[lvoIconLeft,lvoEditLabel,lvoMultiselect,lvoRowSelect,lvoOwnerDrawFixed],nil,nil,nil);
 P[I].Align:=caClient;
 P[I].Font.FontStyle:=[fsBold];
 P[I].LVColAdd("AAA",taLeft,242);
 P[I].LVColAdd("BBB",taLeft,39);
 P[I].LVColAdd("CCC",taRight,67);
 P[I].LVColAdd("DDD",taLeft,99);
 P[I].LVColAdd("EEE",taLeft,34);
 P[I].LVBkColor:=clBtnFace;
 P[I].LVTextBkColor:=clBtnFace;
 P[I].OnLVCustomDraw:=LVDraw;

 // Далее идет заполнение элементов по умолчанию первичной информацией - это не интересно

 P[I].LVControl.Visible:=True;
end;


Вызываю ее из другой процедуры:

var NP: PControl;
begin
 ...
 NP:=TabControl.TC_Insert(TabControl.Count,"ABC",-1);
 // Передаем тот самый массив PControl
 CreateListView(NP,LVS);
 ...
end;


Далее. Если поставить бряк на последнюю команду в процедуре создания и посмотреть содержимое массива Р, то оказывается следующее:

Элемент 0 - не изменился (он был занесен при создании формы)
Элемент 1 - новый, только что созданный ListView. Все вроде бы о"кэй.
Остальные равны nil, так как не заполнены еще.

Дальше - самое интересное! На форме (то бишь на вкладке TabControl"а) ListView отображается, данные в него занесены при создании правильно (присутствуют и редактируются, так как включен режим редактирования), но режим OwnerDraw не действует. Смотрю в массив после завершения всех этих операций, а там исчез только что созданный ListView!!!!! Вместо него стоит nil! Как быть? Может, кто посоветует другой способ хранения информации о динамически создаваемых контролах? Нужна возможность удалять и создавать динамически.


 
Dimaxx ©   (2003-07-24 23:29) [9]

Ответ нашелся сам собой. Я несколько упростил вопрос: у меня PControl лежат не в массиве, а в массиве записей как элемент записи:

var LVS: array[0..31] of record
     ...
     LV: PControl;
     ...
   end;


Оказывается, в этом случае и происходит сброс. А если записано array of PControl, то все в порядке и ничего не теряется.



Страницы: 1 вся ветка

Форум: "KOL";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.032 c
6-1074348927
AlexC
2004-01-17 17:15
2004.04.04
Тестирование программ без сети


6-1074524774
det_sim
2004-01-19 18:06
2004.04.04
Не удается отправить сообщение по протоколу TCP/IP


6-1074585782
KIE
2004-01-20 11:03
2004.04.04
Два компа по удаленке ...


6-1074086073
able
2004-01-14 16:14
2004.04.04
Сокеты


8-1070048856
$TOR(V)
2003-11-28 22:47
2004.04.04
DynamicSkinForm v5.32





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский