Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 05.03.2016
Сообщений: 21

Закрашивание круга снизу вверх для визуализации уровня наполнения емкости топливного бака в автомобиле делфи

15.04.2024, 15:08. Показов 957. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Помогите переделать мой код так чтобы при заполнении бака на допустим 50% закрашивалась только нижняя часть круга а верхняя становилась белой не могу понять как это сделать правильно. Ниже приведу пример своего кода.
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
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
 
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    { Private declarations }
    FFillPercentage: Integer; // Переменная для хранения процента заполнения
  public
    { Public declarations }
    constructor Create(Owner: TComponent); override; // Конструктор формы
    procedure SetFillPercentage(const Value: Integer); // Метод для установки процента заполнения
  end;
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
constructor TForm1.Create(Owner: TComponent);
begin
  inherited Create(Owner);
  // Установим начальный процент заполнения
  FFillPercentage := 70; // Например, 70%
end;
 
procedure TForm1.SetFillPercentage(const Value: Integer);
begin
  if Value >= 0 then
    FFillPercentage := Value; // Обновляем процент заполнения
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Установим цвет фона формы на белый
 
  Color := clWhite;
end;
 
procedure TForm1.FormPaint(Sender: TObject);
var
  FillHeight: Integer;
begin
  // Рассчитать высоту закрашиваемой области (процент от высоты формы)
  FillHeight := Round(FFillPercentage   *   ClientHeight / 100);
 
 
  // Нарисовать черный контур вокруг формы
  Canvas.Pen.Color := clBlack;
  Canvas.Rectangle(0, 0, Width, Height);
 
  // Нарисовать закрашенный круг внутри формы
  Canvas.Brush.Color := clYellow;
  Canvas.Ellipse(0, 0, Width, Height);
 
  // Если процент заполнения меньше 100%, затемним нижнюю часть круга
  if FFillPercentage < 100 then
  begin
    Canvas.Brush.Style := bsClear; // Убираем заливку
    Canvas.Brush.Color := clGreen;
    Canvas.Pen.Color := clGreen;   // Используем красный цвет для затемнения
    Canvas.Rectangle(0, Height - FillHeight, Width, Height);
  end;
end;
 
end.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.04.2024, 15:08
Ответы с готовыми решениями:

Создать устройство автоматического наполнения воды в ёмкости с 1 концевым датчиком
Доброго времени суток! Хочу создать устройство автоматического наполнения воды в ёмкости с 1 концевым датчиком (для поддержания воды на...

Алгоритм для построения меню снизу вверх
Ребята, помогите! Знаю, что это несложно, но почему-то сижу над этим вопросом очень долго. Надо сделать меню снизу вверх. Не знаю как...

Определить обем цилиндрового бака, когда известная высота бака и радиус основы бака.
Помогите решыть пару задач, пожалуста, надо срочно... 1) Определить обем цилиндрового бака, когда известная высота бака и радиус основы...

6
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,329
15.04.2024, 16:17
Можно подготовить 2 картинки, на одной белый круг, на второй - закрашенный. Затем, просто выводить нужные куски в зависимости от заданного процента.

Добавлено через 53 минуты
Алексей17774, зачем переопределять конструктор формы?
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
15.04.2024, 16:30
Очень похоже, что ТС требуется Canvas.Chord()
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
15.04.2024, 17:34
да.
метод с двумя картинками кажется мне наиболее удобным

Цитата Сообщение от AzAtom Посмотреть сообщение
зачем переопределять конструктор формы
вполне нормальное место инициализации переменных
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,329
15.04.2024, 18:05
krapotkin, а у него ещё обработчик события FormCreate имеется. По мне так, можно всё в обработчике делать. Не вижу смысла переопределять конструктор.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
15.04.2024, 18:06
согласен, либо тот вариант либо другой
оба - избыточно и размывает читабельность
1
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,329
16.04.2024, 09:07
Лучший ответ Сообщение было отмечено Алексей17774 как решение

Решение

Как-то так получилось. Используется вся форма. Кнопками "Вверх" и "Вниз" меняется показатель заполненности:
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
87
88
89
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
 
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
    bmFuelE, bmFuelF: TBitmap;
    FFillPercentage: Integer; // Переменная для хранения процента заполнения
    procedure DrawFuel(ACanvas: TCanvas; x1, y1, x2, y2, fillperc: integer);
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
// https://www.cyberforum.ru/delphi-multimedia/thread3163611.html
// Помогите переделать мой код так чтобы при заполнении бака на допустим 50%
// закрашивалась только нижняя часть круга а верхняя становилась белой
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  bmFuelE := TBitmap.Create;
  bmFuelF := TBitmap.Create;
  FFillPercentage := 70;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(bmFuelE);
  FreeAndNil(bmFuelF);
end;
 
procedure TForm1.DrawFuel(ACanvas: TCanvas; x1, y1, x2, y2, fillperc: integer);
var
  hh: integer;
begin
  hh := Round((100-fillperc)*(y2-y1)/100);
  ACanvas.CopyRect(Rect(0, 0, x2, hh), bmFuelE.Canvas, Rect(0, 0, x2, hh));
  ACanvas.CopyRect(Rect(0, hh, x2, y2), bmFuelF.Canvas, Rect(0, hh, x2, y2));
end;
 
procedure TForm1.FormPaint(Sender: TObject);
begin
  DrawFuel(Canvas, 0, 0, ClientWidth, ClientHeight, FFillPercentage);
end;
 
procedure BuildEllipse(ABitmap: TBitmap; AWidth, AHeight: integer; AColor: TColor);
begin
  ABitmap.Width  := AWidth ;
  ABitmap.Height := AHeight;
  ABitmap.Canvas.Brush.Color := clWhite;
  ABitmap.Canvas.FillRect(Rect(0, 0, AWidth, AHeight));
  ABitmap.Canvas.Brush.Color := AColor;
  ABitmap.Canvas.Ellipse(0, 0, AWidth, AHeight);
end;
 
procedure TForm1.FormResize(Sender: TObject);
begin
  BuildEllipse(bmFuelE, ClientWidth, ClientHeight, clWhite);
  BuildEllipse(bmFuelF, ClientWidth, ClientHeight, clBlue);
  Repaint;
end;
 
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_UP then if FFillPercentage < 100 then FFillPercentage := FFillPercentage + 1;
  if Key = VK_DOWN then if FFillPercentage > 0 then FFillPercentage := FFillPercentage - 1;
  Repaint;
end;
 
end.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.04.2024, 09:07
Помогаю со студенческими работами здесь

Текст снизу вверх
Как можно поменять направление текста с снизу вверх на сверху вниз?Использую Client.UploadString() и из-за этого текст снизу вверх

Полосы снизу вверх
Здравствуйте. Купил новую видеокарту sapphire radeon hd 7950 vapor-x, с ней в некоторых играх видны полосы размером примерно 5 милиметров...

Скролл снизу вверх
Добрый день! У меня есть блок с отзывами, отзывы вывожу постранично. При нажатии на страницу (пагинация) я хочу, чтобы скролл поднялся...

Парсинг снизу вверх
Не могу разобраться, как заставить парсер, парсить не сверху вниз ,а снизу вверх. Public Function Pars1(ByRef strSource As String, ByRef...

Расширение снизу вверх
Всем привет! Есть код &lt;style&gt; .pers_life_center { position: absolute; width: 31px; height: 75px; cursor:...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru