Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо