Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для Alex Prozac
105 / 90 / 9
Регистрация: 25.11.2020
Сообщений: 261

ListBox в графическом режиме присваивает всем item последнее загруженное изображение. Как от этого избавиться?

19.01.2022, 15:29. Показов 1568. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем трям! У меня вот такого характера проблема: есть ListBox, который работает в графическом режиме. Мне нужно, чтобы он прорисовывал для каждого item свою картинку (ну, и еще чтобы текст в каждом item был своего цвета - в зависимости от содержимого, но это уже частности); но ListBox "хулиганит" малость, и ведет себя следующим образом: при добавлении очередного item он присваивает ВСЕМ уже существующим в нем item ту картинку, которую передали ему в крайний раз!.. То же происходит и с параметрами шрифта: если при крайней загрузке выставить ListBox1.Canvas.Font.Color, например, в красный - то во всех item шрифт станет красным - даже если перед этим его выводили, к примеру, синим цветом... Т.е., при каждом добавлении нового item ListBox перерисовывает весь свой список сообразно с крайним добавлением - чего мне, разумеется, не нужно(((

Подскажите, пожалуйста - как от этого избавиться? Как сделать, чтобы каждый новый item добавлялся со своей отдельной картинкой и параметрами? Код и скриншот того, как он работает - прилагаю.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, jpeg;
 
type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
 
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  bmp:TBitmap;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
   bmp:=TBitmap.Create;
end;
 
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
   bmp.LoadFromFile('000.bmp');
   ListBox1.Items.Add('Раз');
end;
 
procedure TForm1.BitBtn2Click(Sender: TObject);
var
jpg:TJPEGImage;
begin
   jpg:=TJPEGImage.Create;
   jpg.LoadFromFile('000.jpg');
   bmp.Assign(jpg);
   jpg.Free;
   ListBox1.Items.Add('Два');
end;
 
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
 
var
brect:TRect;
scale:double;
TopOffset,LeftOffset:integer;
 
begin
//Вычисляем пропорции изображения в списке
   if bmp.Height > bmp.Width then begin
      scale:=80 / bmp.Height;
      LeftOffset:=round((ListBox1.ItemHeight-bmp.Width*scale) / 2);
      TopOffset:=5; end else begin
      scale:=80 / bmp.Width;
      TopOffset:=round((ListBox1.ItemHeight-bmp.Height*scale) / 2);
      LeftOffset:=5;
      end;
 
//Очищаем кусок канвы для рисования
  (Control as TListBox).Canvas.FillRect(Rect);
//Рассчитываем место, куда будем выводить картинку
  brect:=Bounds(Rect.Left+LeftOffset,Rect.Top+TopOffset,
  Round(bmp.Width*scale),Round(bmp.Height*scale));
//Выводим картинку с подгонкой пропорций
  (Control as TListBox).Canvas.StretchDraw(brect,bmp);
//Выводим текст
  (Control as TListBox).Canvas.TextOut(Rect.Left+135,Rect.Top+5,ListBox1.Items[index]);
end;
end.
Миниатюры
ListBox в графическом режиме присваивает всем item последнее загруженное изображение. Как от этого избавиться?   ListBox в графическом режиме присваивает всем item последнее загруженное изображение. Как от этого избавиться?  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.01.2022, 15:29
Ответы с готовыми решениями:

Разработать программу, сохраняющую изображение экрана в текстовом режиме и восстанавливающую это изображение, но уже в графическом режиме
Модуль Graph-> 1. Нарисуйте египетскую «ступенчатую» пирамиду, вид сверху и сбоку. Грани «освещенные» одинаково заполните одинаковым...

Как избавиться от мерцания в графическом режиме на Free Pascal?
Пишу программу с графикой 1 раз, и столкнулся с такой проблемой, что при движении объектов они как бы мерцают. Движение осущетсвяю так:...

Как обрезать изображение, загруженное пользователем?
Доброго времени суток!! Сложилась следующая проблема, сделал на сайте возможность что бы пользователи могли загружать картинки, обрабатываю...

25
20.01.2022, 02:17
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от northener Посмотреть сообщение
Меня лично во всем этом смущает то что AV почему-то не возникло именно на 35 строке.
Свободный кусок памяти там был, скорее всего.
А потом, когда система захотела его использовать, ее обломали. )))

0
Модератор
4156 / 2365 / 814
Регистрация: 15.11.2015
Сообщений: 9,501
20.01.2022, 05:48
Цитата Сообщение от northener Посмотреть сообщение
смущает то что AV почему-то не возникло именно на 35 строке. А возникло где-то в другом месте.
Если портить память, обычно так и бывает, ведь.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
20.01.2022, 12:49
ну и 5 копеек
вместо динмассивов практически всегда лучше использовать списки, что для строк, что для числовых значений, что для объектов.
Например TStringList, Tlist<integer>, TObjectList<TBitmap>
конечно если у вас совсем дряхлая версия делфи, хотя бы обычный TList, TObjectList или его наследник
а потом оказывается что у нас есть
TObjectList для битмапов
TList для цвета
TStringList для текстов
и все одного размера
и вот уже приходит в голову простая мысль - объединить их
сделать исходный объект модели
Delphi
1
2
3
4
5
6
7
8
9
TMyModel = class
  text : string;
  bitmap : TBitmap;
  color: TColor;
end;
 
TMyList = class(TObjectList<TMyModel>)
...
end;
Так ли уж случайно все советуют сначала создать модель данных и хранить данные там, а потом по этой модели строить все компоненты на экране?
0
 Аватар для Alex Prozac
105 / 90 / 9
Регистрация: 25.11.2020
Сообщений: 261
21.01.2022, 20:51  [ТС]
krapotkin, спасибо за совет - учту на будущее! Я уже сделал все через дин.массив структур: собрал все необходимое для каждого итема в структуру (в т.ч. и TBitmap), а затем создал из них динамический массив. Лично мне такой код кажется логичнее и читабельнее (для меня, во всяком случае). Дельфа у меня - семерка, старая...

Добавлено через 1 минуту
То, что Вы показали, в сущности, похоже именно на то, как я и сделал - но не через класс, а через рекорд...
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
22.01.2022, 20:28
ну да, все верно.

и что, создаете записи через New / Dispose ?
в таком случае у классов просто синтаксис попроще )
то же и у массивов, добавление/удаление для массива и списка сильно проще для списков
0
 Аватар для Alex Prozac
105 / 90 / 9
Регистрация: 25.11.2020
Сообщений: 261
22.01.2022, 23:47  [ТС]
krapotkin, для меня, напротив, класс более замороченная вещь, чем работа с "классическими" типами данных))

Я создал рекорд, затем объявил динамический массив из этих рекордов, и работаю с ним, как с любым другим дин.массивом - через SetLength... Лично для меня так попроще будет)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.01.2022, 23:47

Как загруженное изображение представить в виде матрицы?
можно ли както загруженное изображение представить в виде матрицы( для дальнейшей обработки нейросетью)?

Как занести загруженное изображение в созданную папку
Вопрос как занести загруженное изображение в ранее созданную папку? &lt;?php //Директория $uploaddir = '../uploads/images/'; ...

Как обработать загруженное изображение и вывести результат на экран?
Я загружаю через форму изображение. Но мне необходимо его обработати и вывести результат на экран. Класс Изображения (файл models.py)...

Как подложить под загруженное png изображение белый фон?
Привет.:) Как подложить под загруженное png изображение белый фон? Использую следующий код: $image_p =...

Сессия и загруженное изображение?
Здравствуйте. Пытаюсь разобраться с реализацией 1 функции. Пока не совсем понимаю в какую сторону смотреть,вроде бы то,что мне нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru