Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ задача на изменение цвета фона

Автор: cinic 21.06.2007 22:14

Ув. программисты на дельфи, помогите пожалуйста с такой задачей:

1) Создать главное окно, содержащее меню вида: Input color, Change, Exit, при выборе Exit программа закрывается.
2) При выборе Input color открывается диалоговое окно, содержащее 3 поля типа Tedit, группу из 2-x кнопок TCheckBox в TGroupBox (кнопки left и right) и кноgre ок типа TBitBtn
В поля TEdit вводятся 3 ргб составляющие цвета. При выборе Change изменяется на заданный цвет фон главного окна (левая, правая или обе половины соответственно, в зависимости от выбора кнопок в диалоговом окне)

Так как я никогда не писал в дельфях, а задачу нужно срочно, то у меня возникла такая проблема:
Каким образом реализовывать изменение цвета? Насколько глупым будет создать две TPanel (соответственно, левую и правую) и красить в нужный цвет их?

Автор: volvo 22.06.2007 1:28

Цитата
создать две TPanel (соответственно, левую и правую) и красить в нужный цвет их?
Можно, конечно, и так... А можно просто отрисовать на канве формы:
  var i: integer;
...
Form1.Canvas.Brush.Color := ... // нужный тебе цвет.
i := byte(RadioButton1.Checked) + 2 * byte(RadioButton2.Checked);
Form1.Canvas.FillRect(Rect((form1.Width div 2) * (i - 1), 0, (form1.Width div 2) * i, form1.Height));

где Radiobutton1 отвечает за левую часть формы, а RadioButton2 - за правую...

P.S.
А, у тебя должен быть CheckBox? Я почему-то прочитал RadioButton... Тогда вот так:

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
Form1.Canvas.Brush.Color := ... // Твой цвет ...
if CheckBox1.Checked then // Левая сторона
Form1.Canvas.FillRect(Rect(0, 0, form1.Width div 2, form1.Height));
if CheckBox2.Checked then // Правая сторона
Form1.Canvas.FillRect(Rect(Form1.Width div 2, 0, form1.Width, form1.Height));
end;

Автор: мисс_граффити 22.06.2007 14:46

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

Автор: volvo 22.06.2007 14:58

Знаю, но:
а) про то, что надо обрабатывать сворачивание/разворачивание не было речи;
б) я не даю полное решение (и ты тоже об этом знаешь) - только показываю идею.

Автор: Andrei_25 24.06.2007 11:28

А почему бы и не поставить две пенли, только сделать это динамически.
Завести две глобальные переменные: panel,panel2:tpanel;
И написать такой код
procedure TForm1.FormCreate(Sender: TObject);
begin
panel:=tpanel.Create(owner);
panel.Color:=255;
panel.Width:=ClientWidth div 2;
panel.Parent:=form1;
panel.Align:=alleft;

panel2:=tpanel.Create(owner);
panel2.Color:=clGreen;
panel2.Parent:=form1;
panel2.Align:=alClient;
end;
Это, конечно только вариант, но я думаю, такой код будет пошустрее, чем каждые раз рисовать через МЕДЛЕННУЮ КАНВУ.
Думаю могут быть вопросы с преобразованием цвета. мой вариант:
red*1+green*256+blue*256*256;
panel2.Color:=200+200*256+200*256*256;получится темно-серая панель

Автор: мисс_граффити 24.06.2007 15:26

а зачем?
смысл создавать панели динамически? мы заранее знаем, где они должны быть, сколько их и т.д.

и правила форума почитай (про теги).

Автор: Andrei_25 27.06.2007 9:43

Цитата(Andrei_25 @ 24.06.2007 7:28) *

Ладно, убедили. Если использовать FillRect, то скорость тоже приличная и лишний раз мудрить не надо.