![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ListBox
Washington © (2007-03-25 21:23:00)Как сделать в ListBox'е один элемент жирным (шрифт), а другой обычным? Причём элементы добавляются из ADOQuery.
RASkov (2007-03-26 13:53:00) [1]> В итоге вместо 5 элементов разного шрифта вылезает последний.
Ну дык ты - " Index:=StrToInt(Label3.Caption);" индекс переназначаешь. Зачем?
А "Label3.Caption = IntToStr(i);", i - в свою очередь равняется ADOQuery3.RecordCount
Вот и получается, что при перерисовки у тебя отрисовывается только i-ый элемент списка.
TextOut(Rect.Left, Rect.Top, (Control as TListBox).Items[ Index]);
т.е. листбокс содержит i раз i-ый элемент.
RASkov (2007-03-26 13:45:00) [2][4] в корне вобще не верно все... в часности событие onDrawItem.
Если поле 'Punkt' числовое, то можно так:
это при добавлении
ListBox1.AddItem(ADOQuery3.FieldByName('Plan').asString, TObject(ADOQuery3.FieldByName('Punkt').asInteger));
при отрисовке
if Integer(Items.Objects[Index])=1 then Canvas.Font.Style:=Canvas.Font.Style+[fsBold]
else Canvas.Font.Style:=Canvas.Font.Style-[fsBold];
Вот для наглядности:
procedure TForm1.FormCreate(Sender: TObject);
var N, J: Integer;
begin
Randomize;
ListBox1.Style:=lbOwnerDrawFixed; ListBox1.Clear;
for N := 0 to 10 do begin
J:=Random(2);
ListBox1.AddItem('Item '+IntToStr(N)+' - '+IntToStr(J), TObject(J));
end;
end;
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
with Control as TListBox do begin
if Integer(Items.Objects[Index])=1 then Canvas.Font.Style:=Canvas.Font.Style+[fsBold]
else Canvas.Font.Style:=Canvas.Font.Style-[fsBold];
Canvas.FillRect(Rect);
Canvas.TextOut(Rect.Left+2, Rect.Top, Items[Index]);
end;
end;
_Knight_ (2007-03-26 11:42:00) [3]Я так понимаю, что человек хочет задать формат текста сразу при формировании списка ListBox.. при onDraw эти "жирности" надо запоминать где-то ещё, т.к. в самом LostBox механизма хранения этих данных нет...
Плохиш (2007-03-26 11:31:00) [4]
> Washington (26.03.07 10:57) [4]
Какое отношение к отрисовке ListBox имеет ADOQuery3?
_Knight_ (2007-03-26 11:02:00) [5]Сделай компонент на основе ListBox с новым свойством ItemsFont в котором пропиши шрифты соответствующие итемсам... и отрисовку, чтобы она использовала эти шрифты... дёшего, сердито и всё на автомате. Ну можено ещё компонент поискать в котором это уже реализовано :)
Washington (2007-03-26 10:57:00) [6]
with ADOQuery3 do
begin
close;
SQL.Clear;
SQL.Add('Select Plan,Punkt');
SQL.Add('From Organaiser');
open;
end;
m:=ADOQuery3.RecordCount;
for i:=1 to m do
begin
ListBox1.AddItem(ADOQuery3.FieldByName('Plan').asString,nil);
Label3.Caption:=IntToStr(i);
ADOQuery3.Next;
end;
Это я добавляю элементы в ListBox.
Index:=StrToInt(Label3.Caption);
if ADOQuery3.FieldByName('Punkt').AsInteger=1 then
begin
with (Control as TListBox).Canvas do
begin
Font.Style:=[fsBold];
FillRect(Rect);
TextOut(Rect.Left, Rect.Top, (Control as TListBox).Items[Index]);
end;
end;
Это событие onDrawItem.
В итоге вместо 5 элементов разного шрифта вылезает последний.
Затупил.
Washington (2007-03-26 10:54:00) [7][code]
with ADOQuery3 do
begin
close;
SQL.Clear;
SQL.Add('Select Plan,Punkt');
SQL.Add('From Organaiser');
open;
end;
m:=ADOQuery3.RecordCount;
for i:=1 to m do
begin
ListBox1.AddItem(ADOQuery3.FieldByName('Plan').asString,nil);
Label3.Caption:=IntToStr(i);
ADOQuery3.Next;
end;
[/code]
Это я добавляю элементы в ListBox.]
[code]
Index:=StrToInt(Label3.Caption);
if ADOQuery3.FieldByName('Punkt').AsInteger=1 then
begin
with (Control as TListBox).Canvas do
begin
Font.Style:=[fsBold];
FillRect(Rect);
TextOut(Rect.Left, Rect.Top, (Control as TListBox).Items[Index]);
end;
end;
[/code]
Это событие onDrawItem.
В итоге вместо 5 элементов разного шрифта вылезает последний.
trubin (2007-03-25 22:03:00) [8]
> Причём элементы добавляются из ADOQuery.
А какая разница откуда они добавляются?
Джо (2007-03-25 21:30:00) [9]OnDrawItem