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

Вниз

Подскажите простенькую замену 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.037 c
14-1121313940
Некто
2005-07-14 08:05
2005.08.07
Какие компьютеры у вас (дом, работа)?


1-1121860869
MegaVolt
2005-07-20 16:01
2005.08.07
Замена Move для маленьких объёмов данных.


4-1118341798
Dot
2005-06-09 22:29
2005.08.07
hangUp


14-1121491701
Kerk
2005-07-16 09:28
2005.08.07
С днем рожденья! 16 июля


1-1121408988
neat
2005-07-15 10:29
2005.08.07
I/O error 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
Английский Французский Немецкий Итальянский Португальский Русский Испанский