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

Вниз

Добавление компонентов 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.942 c
1-1086297558
Deep_NEW
2004-06-04 01:19
2004.06.20
Про RichEdit.....


1-1086322949
korvin
2004-06-04 08:22
2004.06.20
Вывод отчёта нестандартной ширины


14-1086265406
Undert
2004-06-03 16:23
2004.06.20
Вопрос по SSL


1-1086361437
Kair
2004-06-04 19:03
2004.06.20


3-1085051535
Jann
2004-05-20 15:12
2004.06.20
Копирование