Форум: "Основная";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];
ВнизДобавление компонентов CheckBox в столбец ListView Найти похожие ветки
← →
r9000 (2004-06-04 12:40) [0]Не могли бы вы ответить еще на такой вопрос? Можно ли добавлять
компонент CheckBox в непервый, а скажем в третий столбец ListView
(Viewstyle=vsReport),т.е. 2 SubItems? Если можно на примере. Как при этом запретить пользователю изменять его состояние, и как делать это программно? Заранее спасибо.
← →
Семен Сорокин © (2004-06-04 12:46) [1]1. можно отрисовать в OnDraw
два битмапа с включеным и выключеным состоянием + сохранять статус, отлавливать клик - менять статус - перерисовывать. (делал :))
2. Можно попробовать вставлять TCheckBox внутрь ListView, но тогда надо будет ловить все скроллы и т.п. (не делал)..
ЗЫ. Если без лишего геморроя - то в первую колонку - достаточно добавить стиль VS_CHECKBOXES (или что-то подобное)
← →
r9000 (2004-06-04 13:24) [2]А можно пример йз вашего первого случая, пожалуйста.
← →
Семен Сорокин © (2004-06-04 15:57) [3]Тот шмат кода канул в лету :)
вот из другого проектаprocedure TfmSelGraph.lvParGraphsCustomDrawSubItem(Sender: TCustomListView;
Item: TListItem; SubItem: Integer; State: TCustomDrawState;
var DefaultDraw: Boolean);
var
_bmp : TBitmap;
_rect: TRect;
_clr : TColor;
begin
if Assigned(Item.Data) and (SubItem in [4, 5]) then begin
DefaultDraw := false;
ListView_GetSubItemRect(lvParGraphs.Handle, Item.Index, SubItem, 0, @_rect);
if SubItem = 4 then begin
_bmp := TBitmap.Create;
try
if _rect.Right - _rect.Left > 32 then
_rect.Right := _rect.Left + 32;
if _rect.Bottom - _rect.Top > 16 then
_rect.Bottom := _rect.Top + 16;
_bmp.Height := 16;
_bmp.Width := 32;
_bmp.Transparent := true;
imgs32x16.GetBitmap(iif((Item.StateIndex = 1) or (PParameter(Item.Data)^.Selected = psCode), 3, 1), _bmp);
lvParGraphs.Canvas.CopyRect(_rect, _bmp.Canvas, _bmp.Canvas.ClipRect);
finally
_bmp.Free
end
end
...
lvParGraphs - TListView
imgs32x16 - TImageList
← →
r9000 (2004-06-07 07:04) [4]Добрый день!
А можно спросить, что это за процедура такая ListView_GetSubItemRect(lvParGraphs.Handle, Item.Index, SubItem, 0, @_rect);
И не очень понятна строка:
imgs32x16.GetBitmap(iif((Item.StateIndex = 1) or (PParameter(Item.Data)^.Selected = psCode), 3, 1), _bmp);
наверно if но почему-то жалуется на PParameter(Item.Data)^.Selected
Заранее спасибо.
← →
Семен Сорокин © (2004-06-07 08:57) [5]процедура ListView_GetSubItemRect объявлена в commctrl.pas.
PParameter(Item.Data)^.Selected = psCode - это моё условие какую картинку вытаскивать из ImageList, не обращай внимания - там в GetBitmap первым параметром индекс должен быть.
← →
r9000 (2004-06-07 09:55) [6]Если я пишу так
ListView_GetSubItemRect(ListView1.Handle, Item.Index, SubItem, 0, @rect);
DefaultDraw := false;
bmp := TBitmap.Create;
try
bmpwidth:=(rect.Bottom-rect.Top);
rect.Right:=rect.Left+bmpwidth;
ImageList1.GetBitmap(2,bmp);
ListView1.Canvas.CopyRect(rect, bmp.Canvas, bmp.Canvas.ClipRect);
ListView1.Canvas.TextOut(rect.Left+bmpwidth,rect.Top,Item.SubItems.CommaText);
finally
bmp.Free
end
то получается, только если необходимо выводить текст, то
Item.SubItems.Text выводит строку 5,8,10, а не значение соответствующего SubItems. Как вывести в данном случае это значение? И почему-то в столбце следующем за столбцом в котором вставляется иконка сбивается шрифт(становится жирным), что нужно сделать чтобы он не изменялся?
← →
Семен Сорокин © (2004-06-07 11:28) [7]Item.SubItems.Text выводит строку 5,8,10, а не значение соответствующего SubItems. Как вывести в данном случае это значение?
так ты бери не Item.SubItems.Text, а Item.SubItems[колонка]
И почему-то в столбце следующем за столбцом в котором вставляется иконка сбивается шрифт(становится жирным), что нужно сделать чтобы он не изменялся?
вручную отрисовывать последующие итем"ы, имхо бага борланда.
← →
r9000 (2004-06-07 12:47) [8]Когда подставляю Item.SubItems[SubItem] выдается ошибка. Из-за чего она может происходить? А при попытке прорисовывать другие ячейки неправильно отображаются данные:
ListView_GetSubItemRect(ListView1.Handle, Item.Index, SubItem, 0, @rect);
DefaultDraw := false;
if (Item.SubItems[0]<>"6") and (SubItem=2) then
begin
if (trim(Item.SubItems[1])="20") then
TListView(sender).Canvas.Brush.Color:=clgreen
else
if (trim(Item.SubItems[1])="25") then
TListView(sender).Canvas.Brush.Color:=clblue
else
if (trim(Item.SubItems[1])="23") then
TListView(sender).Canvas.Brush.Color:=clred
else
TListView(sender).Canvas.Brush.Color:=clWhite;
bmp := TBitmap.Create;
try
bmpwidth:=(rect.Bottom-rect.Top);
rect.Right:=rect.Left+bmpwidth;
ImageList1.GetBitmap(2,bmp);
ListView1.Canvas.Font.Size:=8;
ListView1.Canvas.Font.Style:=[];
ListView1.Canvas.CopyRect(rect, bmp.Canvas, bmp.Canvas.ClipRect);
ListView1.Canvas.TextOut(rect.Left+bmpwidth,rect.Top,Item.SubItems[1])
finally
bmp.Free
end
end
else
begin
ListView1.Canvas.Font.Size:=8;
ListView1.Canvas.Font.Style:=[];
try
ListView1.Canvas.TextOut(rect.Left,rect.Top,Item.SubItems[SubItem] )
except
end;
end;
Почему?
← →
Семен Сорокин © (2004-06-07 12:57) [9]Когда подставляю Item.SubItems[SubItem] выдается ошибка. Из-за чего она может происходить?
нумерация SubItem c 1, подставляй так:
Item.SubItems[SubItem-1]
← →
r9000 (2004-06-07 13:55) [10]Да, спасибо, вы правы! Но почему при выделении цветом ячеек SubItems выделяются цветом только цифры, а не вся ячейка? Как сделать чтобы выделялась цветом вся ячейка, если в ней нет рисунка, или от рисунка до конца ячейки если он есть в моем коде?
ListView_GetSubItemRect(ListView1.Handle, Item.Index, SubItem, 0, @rect);
DefaultDraw := false;
if (Item.SubItems[0]<>"6") and (SubItem=2) then
begin
if (trim(Item.SubItems[1])="20") then
TListView(sender).Canvas.Brush.Color:=clgreen
else
if (trim(Item.SubItems[1])="25") then
TListView(sender).Canvas.Brush.Color:=clblue
else
if (trim(Item.SubItems[1])="23") then
TListView(sender).Canvas.Brush.Color:=clred
else
TListView(sender).Canvas.Brush.Color:=clWhite;
bmp := TBitmap.Create;
try
bmpwidth:=(rect.Bottom-rect.Top);
rect.Right:=rect.Left+bmpwidth;
ImageList1.GetBitmap(2,bmp);
ListView1.Canvas.Font.Size:=8;
ListView1.Canvas.Font.Style:=[];
ListView1.Canvas.CopyRect(rect, bmp.Canvas, bmp.Canvas.ClipRect);
ListView1.Canvas.TextOut(rect.Left+bmpwidth,rect.Top,Item.SubItems[1])
finally
bmp.Free
end
end
else
begin
if (trim(Item.SubItems[1])="20") then
TListView(sender).Canvas.Brush.Color:=clgreen
else
if (trim(Item.SubItems[1])="25") then
TListView(sender).Canvas.Brush.Color:=clblue
else
if (trim(Item.SubItems[1])="23") then
TListView(sender).Canvas.Brush.Color:=clred
else
TListView(sender).Canvas.Brush.Color:=clWhite;
ListView1.Canvas.Font.Size:=8;
ListView1.Canvas.Font.Style:=[];
ListView1.Canvas.TextOut(rect.Left,rect.Top,Item.SubItems[SubItem-1] )
end
← →
Семен Сорокин © (2004-06-07 14:06) [11]...
bmp := TBitmap.Create;
try
bmp.Transparent := true;
ListView1.Canvas.FillRect(rect);
bmpwidth:=(rect.Bottom-rect.Top);
rect.Right:=rect.Left+bmpwidth;
ImageList1.GetBitmap(2,bmp);
ListView1.Canvas.Font.Size:=8;
ListView1.Canvas.Font.Style:=[];
ListView1.Canvas.CopyRect(rect, bmp.Canvas, bmp.Canvas.ClipRect);
ListView1.Canvas.TextOut(rect.Left+bmpwidth, rect.Top, Item.SubItems[1])
...
← →
r9000 (2004-06-07 14:18) [12]Спасибо еще раз! А когда нет рисунка, т.е. в коде
else
begin
if (trim(Item.SubItems[1])="20") then
TListView(sender).Canvas.Brush.Color:=clgreen
else
if (trim(Item.SubItems[1])="25") then
TListView(sender).Canvas.Brush.Color:=clblue
else
if (trim(Item.SubItems[1])="23") then
TListView(sender).Canvas.Brush.Color:=clred
else
TListView(sender).Canvas.Brush.Color:=clWhite;
ListView1.Canvas.Font.Size:=8;
ListView1.Canvas.Font.Style:=[];
ListView1.Canvas.TextOut(rect.Left,rect.Top,Item.SubItems[SubItem-1] )
end
что необходимо сделать, чтобы выделялась цветом вся ячейка?
← →
Семен Сорокин © (2004-06-07 14:28) [13]FillRect
← →
r9000 (2004-06-07 14:40) [14]Большое спасибо, получилось !
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.032 c