Форум: "Основная";
Текущий архив: 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.049 c