Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.07;
Скачать: CL | DM;

Вниз

Подскажите простенькую замену TListView в виртуальном режиме.   Найти похожие ветки 

 
MegaVolt ©   (2005-07-14 16:05) [0]

Подскажите замену TListView.
Самую простую дез каких либо наворотов но с исправлеными косяками родного. Обязательно наличие виртуального режима (OwnerData:=true;) и поддержка CheckBox на каждой строчке.

Заранее благодарен.


 
Просто Джо ©   (2005-07-14 16:06) [1]


>  но с исправлеными косяками родного.

О "косяках" нужно бы подробнее. А то разные мысли возникают...


 
Digitman ©   (2005-07-14 16:06) [2]


> с исправлеными косяками родного


это какие же ?


 
MegaVolt ©   (2005-07-14 16:19) [3]

Ну навскидку если

OwnerData:=true;
CheckBoxes:=true;
StateImages:=ImageList1; // пустой (заполняется сам, как понятия не имею. Если вдруг незаполнится напихать любыми иконками для примера это не суть важно)
ReadOnly:=true;

procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
begin
 Item.Caption:="123"; // пофигу что пишем :)
 Item.StateIndex:=1; // пусть для начала все будут включены
end;


Теперь если запустить это чудо и наблюдать за OnMouseDown и OnMouseUp наблюдается очень странное поведение:

Нажимает Down на Картинке(CheckBox)
OnMouseDown
OnMouseUp // с какого перепугу если кнопку не отпустили?
Отпускаем кнопку мыши
OnMouseUp // как и положено

Нажимает Down на Тексте(CheckBox)
Нифига не вызывается
Отпускаем кнопку мыши
OnMouseDown // с какого перепугу
OnMouseUp // как и положено

И только если нажимать на полях которые пустые (пустые строчки или место где закончились столбцы всё работает как надо)

Если это не глюк то что? И как сделать так чтобы я мог по OnMouseUp поменять значение StateImage чтобы изменить значение чекбокса?


 
MegaVolt ©   (2005-07-14 16:22) [4]

Чуть не забыл.
При создании формы ListView1.Items.Count:=100;


 
Просто Джо ©   (2005-07-14 16:43) [5]

Не вполне понял суть этих манипуляций. OnSelectItem - работает? Или нужно нечто другое?


 
MegaVolt ©   (2005-07-14 16:55) [6]

RК алению в виртуальном режиме (OwnerData:=true) CheckBox-ы являются картинками которые сам LisView не переключает :( Их значения нужно хранить самому и переключать по нажатию тоже самому. Так вот когда я нажимаю на CheckBox у меня возникает ДВА события OnMouseUp и следовательно менять значение я должен только на втором цикле. А вот когда в другом месте происходит нажатие то OnMouseUp возникает более менее нормально. Т.е. нужно как то коряжится и отфильровывать один из двух ненужных OnMouseUp. Что на мо взгляд несколько кривовато. :(


 
begin...end ©   (2005-07-14 17:10) [7]

> MegaVolt ©   (14.07.05 16:55) [6]

> Так вот когда я нажимаю на CheckBox у меня возникает
> ДВА события OnMouseUp

Ну а OnClick-то одно возникает?


 
sniknik ©   (2005-07-14 17:11) [8]

> Что на мо взгляд несколько кривовато. :(
мышка случаем не западает?
либо чтото перекрывает/мешает, повтори сам, все что описал, на пустом проекте... ничего противоестественного
procedure TMyForm1.ListView1MouseDown(Sender: TObject;
 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 Label1.Caption:= IntToStr(StrToInt(Label1.Caption)+1);
end;

procedure TMyForm1.ListView1MouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 Label1.Caption:= IntToStr(StrToInt(Label1.Caption)-1);
end;

сколько не кликал, с нуля (изначального Label1.Caption:= "0";) не ушол...


 
Digitman ©   (2005-07-14 17:16) [9]

да, чудо действительно имеет место быть

не менее дивное чудо пронаблюдал, запустив тот же исп.файл с твоим тест-примером под Wine на линуховой машине - там было все наоборот : проблемы с генерацией событий возникали при щелчке на зоне "пустых полей"

так что "глюк Борланда" - это вряд ли


 
Просто Джо ©   (2005-07-14 17:22) [10]

Сейчас нет возможности проверить, но может быть это:
Set CheckBoxes to True to make check boxes appear next to the list items when ViewStyle is vsList or vsReport. Each line in the list displays a single check box.
Пока не проверял, может там со стилями что-то накручено?


 
sniknik ©   (2005-07-14 17:25) [11]

получилось с установкой стиля vsList. каждое нажатие (MouseDown) тут же вызывает MouseUp, одновременно. дальше нормально, один раз отпустили один MouseUp. и независимо от того где кликну, на иконке/тексте или пустом поле.


 
MegaVolt ©   (2005-07-14 17:28) [12]

>Ну а OnClick-то одно возникает?

одно но при нажатии а мне очень очень хочется чтобы при отпускании происходило изменение.

>сколько не кликал, с нуля не ушол

очень странно. А какая версия ComCtl32.dll? Что за версия Delphi? А можешь попробовать на другой машине? Просто я действительно наблюдаю глюк причём на совершенно разных машинах. Можешь прислать прогу, исходники, файлами ComCtrls и Controls мне на мыло? MegaVoltik[a]yahoo.com

>да, чудо действительно имеет место быть

Что можно порекомендовать мне в этой ситуации?

Была идея использовать просто SmallImages для тех же целей. И работает вроде нормально но при выделении выделяется и чекбокс что очень погано смотрится :( Где то в инете находил пример как это исправить но теперь не могу :( Может кто в курсе как сделать так чтобы картинка не выделялась? Это вполне решило бы мою задачу.


 
MegaVolt ©   (2005-07-14 17:30) [13]

sniknik я исспользую стиль vsReport


 
Digitman ©   (2005-07-14 17:37) [14]


> Что можно порекомендовать мне в этой ситуации?


можно отказаться от StateImages и от чек-боксов в пользу обработчика OnAdvancedCustomDrawItem/SubItem, чтобы рисовать на канве контрола изображения чек-боксов


 
MegaVolt ©   (2005-07-14 17:43) [15]

>рисовать на канве контрола.

Т.е. просто рисовать и чекбоксы и текст и выделение самому? Или только чекбоксы а остальное как то автоматом?


 
Digitman ©   (2005-07-14 17:48) [16]

наверно будет достаточно только чек-боксы рисовать


 
MegaVolt ©   (2005-07-14 18:00) [17]

>наверно будет достаточно только чек-боксы рисовать

попробую но есть огромное подозрение что они тогда выделятся будут :(


 
MegaVolt ©   (2005-07-15 10:35) [18]

Попробовал. Вышло вроде то что нужно но с кучей хитростей. Может есть рецепты как обойтись без них?

Хитрость первая.
Чтобы ListView выделил место под картинки и сделал высоту строк побольше приходится присваивать SmallImages пустой ImageList. Можно ли как то без этого изменить высоту строк?

Хитрость вторая.

procedure TForm2.ListView1CustomDrawItem(Sender: TCustomListView;
 Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
 r1: TRect;
 style: Cardinal;
begin
 With TListview(Sender).Canvas do
   begin
     DefaultDraw := false;
     if BaseAll[Item.Index].Checked
       then Style := DFCS_BUTTONCHECK or DFCS_CHECKED or DFCS_FLAT
       else Style := DFCS_BUTTONCHECK or DFCS_FLAT;//DFCS_CHECKED or DFCS_MONO;
     R1 := Item.DisplayRect(drBounds);
     R1.Left:=R1.Left+3;
     R1.Top:=R1.Top+2;
     R1.Right:=16;
     R1.Bottom:=R1.Bottom-2;
     DrawFrameControl(Handle, R1, DFC_BUTTON, Style);
     DefaultDraw := true;
     if Item.Selected
       then Font.Color := clHighlightText
       else Font.Color := clblack;
 end;
end;


Если после DrawFrameControl убрать изменение цвета шрифта то текст начинает выводится жирным и смещённым вниз. Почему?


 
MegaVolt ©   (2005-07-15 17:40) [19]

Господа ну хоть какие то соображения есть?


 
Digitman ©   (2005-07-15 18:07) [20]

в понедельник обязательно найдутся !
потерпи уж ..


 
Igor_thief   (2005-07-15 23:36) [21]

Я тоже напарился с прорисовкой ListView, когда хотел сделать что-то похожее на ACDSee (я хотел отображать в нем thumbnails). Очень бы хотелось взглянуть на твой код, когда ты его завершиш. Выложи его куда-нить, плиз.


 
MegaVolt ©   (2005-07-18 10:54) [22]

Если это ты мне то я выложил завернщенный код. Меня интересовали только чекбоксы я их и нарисовал. Хотя наличие пустого ImageList для регулировки высоты строк, и непонятной вставки где зачем то изменяется цвет шрифта напрягают.



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

Текущий архив: 2005.08.07;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.047 c
14-1120578423
NewWonder
2005-07-05 19:47
2005.08.07
Сделал курсовик и ...


14-1121262293
Pil
2005-07-13 17:44
2005.08.07
Где взять документацию для XLReport на русском языке?


14-1121373404
DeMoN-777
2005-07-15 00:36
2005.08.07
Лимиты в WinXP


1-1121691910
Alias
2005-07-18 17:05
2005.08.07
Можно ли в StatusBar изменить шрифт?


6-1114873644
Dextor
2005-04-30 19:07
2005.08.07
TServerSocket в DLL - реально ли ?