Язык программирования Delphi. Работа с графикой, рисуем внутри TListBox:
Очень часто, для лучшего представления данных, тебе будет нужно рисовать внутри компонента TListBox. Что я имею ввиду? Посмотри на рисунок 1, и ты всё поймёшь.
Рис 1. Пример
Может это покажется странным, но всё это делается за семь строчек кода. Конечно же, в одну строку можно записать и двадцать операций, но я этот случай не учитываю.
Секрет рисования заключается в том, что у компонента TListBox1 параметр Style должен быть lbOwnerDrawFixed или lbOwnerDrawVariable .
После этого создаёшь обработчик события OnDrawItem и в нём пишешь:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
with ListBox1.Canvas do
begin
Brush.Color:=clRed; // Задаём красный цвет кисти.
Brush.Style:=TBrushStyle(Index); //Выбираем стиль кисти
Pen.Style:=psClear;
Rectangle(Rect.Left,Rect.Top,Rect.Left+100,Rect.Bottom);
Brush.Style:=bsClear;
Font.Color:=clBlue;
TextOut(Rect.Left+110,Rect.Top,IntToStr(index));
end;
end;
Вот и всё. Твоя прога готова, жми на запуск и наслаждайся. А я начинаю объяснять, что же я тут нарисовал.
Первая строка:
with ListBox1.Canvas do
Оператор "With" говорит, что все последующие операции будут производится с компонентом (объектом) "ListBox1". Для того, чтобы ты лучше понял я приведу код без этой строки:
Если у тебя есть глаза, то ты можешь увидеть, что в каждой строке появились подписи ListBox1.Canvas . Код стал очень не красивым. Постоянно нужно говорить, что Brush или ещё что-нибудь нужно взять у ListBox1.Canvas .
Поэтому я и использовал оператор With
With "Объект" do
Begin
Всё, что находится здесь, будет относиться к объекту "Объект".
Поэтому не надо писать имя объекта перед каждым используемым
Свойством или методом.
End;
Я надеюсь, что я доходчиво объяснил. Если ты опять что-то не понял, то не надо отчаиваться. Я же говорил, что мы будем изучать всё постепенно. Практика лучше всего откладывает в памяти любые знания, поэтому ею мы и занимаемся. А остальное дело времени.
Теперь ещё несколько подводных камней нашей проги. Конструкция Brush.Style:=TBrushStyle(Index) выбирает кисть в зависимости от рисуемого в данный момент элемента. Всего существует восемь стилей кисти. Когда вываливается сообщение OnDrawItem для первого элемента (об этом говорит параметр index передаваемый в процедуру ListBox1DrawItem), мы рисуем элемент с кистью первого стиля. Для второго элемента будет использоваться второй стиль кисти и т.д.
Рис 2. Пример
Карандаш я выбрал прозрачным Pen.Style:=psClear , это для того, чтобы не было никаких оборок. Попробуй убрать эту строку и строки в TListBox1 будут выглядеть уже как на рисунке 2. Как видишь, у каждой строки появились оборки. Вот именно их я убирал с помощью этой конструкции.
Функция Rectangle(х1,у2,х2,у2) с соответствующими координатами. Дальше я делал прозрачной кисть и задавал цвет фона. После этого я просто выводил текст строки с помощью функции TextOut(х, у, текст).
Всё очень просто. В любой книге по Delphi этот материал считается сложным, но я не вижу в этом ничего сложного. Надеюсь, для тебя эта статья тоже была очень лёгкой.
Попробуй сделать тоже самое с компонентом TComboBox. Не забудь про свойство Style у этого компонента. А в остальном, весь код будет таким же.