Есть ли способ во время выполнения, кроме использования стилей, изменить цвет фона строк элементов TListBox? Могу ли я использовать событие OnPaint?
@Bosshoss На самом деле, это два разных вопроса. Вопрос, на который вы ссылались, задавал общий фон для всего TListBox
. Этот вопрос требует отдельного фона для каждого элемента. Хотя это и не упоминается, нужно будет прокручивать элементы и т. д.
есть ли причина, по которой вы не хотите использовать Style ?
@Боссхос. ИМО, стили Firemonkey немного сложны. Кроме того, документация очень плохая. Усердно пытаясь настроить свои собственные стили на стандартных компонентах, я не смог добиться желаемого результата, поэтому я сдался. Я предполагаю свою неспособность к этому предмету.
«Могу ли я использовать событие OnPaint
?»
Да, ты можешь. Но, возможно, это не считается ортодоксальным способом, поскольку он недоступен и может развалиться в будущих выпусках Delphi. В любом случае, если вы хотите попробовать, вот:
Вы хотите использовать событие OnPaint
класса TListBoxItem
. Однако событие OnPaint
элемента недоступно в дизайнере, поэтому вам нужно будет добавить его вручную в класс формы.
type
TForm1 = class(TForm)
Label1: TLabel;
ListBox1: TListBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
// add following manually (copy & paste)
procedure ListBoxItemPaint(Sender: TObject; Canvas: TCanvas;
const ARect: TRectF);
private
{ Private declarations }
procedure PopulateListBox;
public
{ Public declarations }
end;
Затем, когда вы добавляете элементы в ListBox1
, важно назначить ListBoxItemPaint
каждому событию элементов OnPaint
(см. конец процедуры):
procedure TForm1.PopulateListBox;
var
i: integer;
item: TListBoxItem;
begin
// Set default item height
// Individual heights are not possible
ListBox1.ItemHeight := 48;
// Set nr of columns, items arranged horizontally first, then vertically
ListBox1.Columns := 1; // 3;
// Add items
for i := 0 to 7 do
begin
item := TListBoxItem.Create(nil);
item.Parent := ListBox1;
item.Width := Listbox1.Width;
item.StyledSettings := []; // You are now responsible for corresponding
// item.TextSettings, e.g. font, style, color etc.
item.tag := i;
item.Text := 'Item ' + IntToStr(i);
item.OnPaint := ListBoxItemPaint; // This links the OnPaint event to your code
end;
end;
А это ListBoxItemPaint()
процедура:
procedure TForm1.ListBoxItemPaint(Sender: TObject; Canvas: TCanvas;
const ARect: TRectF);
var
Brush: TBrush;
Color: TAlphaColor;
Txt: string;
LocRect: TRectF;
begin
begin
Txt := (Sender as TListBoxItem).Text;
case (Sender as TListBoxItem).Tag of
0: Color := TAlphaColors.Aliceblue;
1: Color := TAlphaColors.Antiquewhite;
2: Color := TAlphaColors.Aqua;
3: Color := TAlphaColors.Aquamarine;
4: Color := TAlphaColors.Azure;
5: Color := TAlphaColors.Beige;
6: Color := TAlphaColors.Bisque;
else
Color := TAlphaColorRec.Chocolate;
end;
// Item background, color and shape
Brush := TBrush.Create(TBrushKind.Solid, Color);
try
Canvas.FillRect(ARect, 1, Brush); // rectangular item band
// alternatively use rounded corners
// Canvas.FillRect(ARect,11, 11, AllCorners, 1, Brush); // rounded corners
finally
Brush.Free;
end;
// Text color, font, style and size
Canvas.Fill.Color := TAlphaColors.Red;
Canvas.Font.Family := 'Segoe UI';
Canvas.Font.Style := [TFontStyle.fsBold, TFontStyle.fsItalic];
Canvas.Font.Size := 16;
// Item text location and drawing
LocRect := ARect;
LocRect.Left := LocRect.Left + 10;
Canvas.FillText(LocRect, Txt, False, 1, [], TTextAlign.Leading, TTextAlign.Leading);
end;
end;
Код написан и протестирован с помощью Delphi 10.4 и демонстрирует, как вы можете использовать разные цвета bg для каждого элемента в TListBox
.
Чтобы изменить цвет элементов во время выполнения, вам нужно переместить выбор цвета из OnPaint
в функцию поиска с логикой выбора, которую вы хотите использовать.
Спасибо. Я учту ваше предупреждение о будущих версиях Delphi.
Я знаю, что это другой вопрос, и прошу прощения за это. Можно ли добиться такого же эффекта во время выполнения со стилями?
Некоторое время назад кто-то еще спросил вас, почему бы не использовать стили, и тогда вы ответили, что не знаете, как использовать стили. В любом случае, это помогает. Я не могу прямо сейчас проверить себя, но, может быть, завтра или послезавтра. Если вы начали, но столкнулись с проблемой, опубликуйте новый вопрос и включите код, который у вас уже есть.
Да, по этому поводу я говорил об использовании стилей во время разработки, теперь я говорю об использовании во время выполнения.
Через пару дней я проверю, не публиковали ли вы какие-либо комментарии относительно использования стилей во время выполнения. Спасибо.
Хммм, я повторяю то, что сказал в своем предыдущем комментарии: опубликуйте новый вопрос и включите код, который у вас есть. Я не вижу ни одного нового вопроса, отправленного вами.
Я голосую за закрытие этого вопроса, вы уже публикуете то же самое stackoverflow.com/questions/75196388/…