Текущий архив: 2007.10.21;
Скачать: CL | DM;
Внизсоздание объекта заданного цвета Найти похожие ветки
← →
smartleds (2007-09-26 00:11) [0]Посоветуйте как лучше сделать. Задача такая по заданному значению цвета RGB. При нажатии кнопки мне нужно создать объект (типа круг , квадрат, форма любая ) заданного цвета.
При следующем нажатии создать еще один объект рядом с этим, на той же форме и т.д. И еще этот чтобы этот объект можно было выделить мышкой и изменить его цвет, изменив параметры RGB.
Вопрос, при помощи каких компонент лучше делать такие объекты?
← →
Германн © (2007-09-26 00:33) [1]
> типа круг , квадрат, форма любая
> Вопрос, при помощи каких компонент лучше делать такие объекты?
>
Переведи на английский слово "форма" или "фигура", добавь к ответу первую букву T (латинскую разумеется) и получишь название компонента.
← →
Anatoly Podgoretsky © (2007-09-26 00:35) [2]> smartleds (26.09.2007 00:11:00) [0]
С помощью канвы
← →
{RASkov} © (2007-09-26 00:36) [3]> [0] smartleds (26.09.07 00:11)
Ну это не вопрос..... ответ не в "двух словах"....
Можно кучу вариантов придумать... Как простой вариант попробуй TShape.... Только для
> форма любая
не очень-то он подойдет :(
Тогда TPaintBox(ы).... можно на одном прорисовывать все фигуры, а можно несколько как отделные фигуры использовать этот компонент...
Вообщем ты зацепись за какую нибудь идею и задай конкретный вопрос, а потом и видно будет.
← →
smartleds (2007-09-26 00:43) [4]Спасибо за ответы.
Вот нарисовал круг при помощи канвы
with form1.canvas do begin
brush.color:=(RGB(R,G,B));
Ellipse(1,1,20,20);
end;
А как сделать чтобы при помощи мышки можно было этот круг выделить , чтобы изменить RGB?
← →
Германн © (2007-09-26 00:46) [5]
> {RASkov} © (26.09.07 00:36) [3]
> Вообщем ты зацепись за какую нибудь идею и задай конкретный
> вопрос
Так он его и задал. Точнее ему задали. :-)
> Только для
>
> > форма любая
>
> не очень-то он подойдет :(
Имхо, "форма любая" означает "форма не имеет значения. какаю сможешь, такую и нарисуй". Так что TShape в самый раз.
← →
Dmitro © (2007-09-26 00:46) [6]
> задай конкретный вопрос, а потом и видно будет
Согласен
← →
Германн © (2007-09-26 00:47) [7]
> Вот нарисовал круг при помощи канвы
Ну и зря.
> А как сделать чтобы при помощи мышки можно было этот круг
> выделить , чтобы изменить RGB?
А ты можешь выделить мышкой рисунок на бумаге?
← →
{RASkov} © (2007-09-26 01:04) [8]> [4] smartleds (26.09.07 00:43)
Не... давай другой вариант :)
Смотри, что бы использовать вариант тупа с канвой, тебе нужно где-то помнить параметры рисунка(фигур(ы)), и при перемещении "мышки" над некой канвой, учитывать нажата ли кнопка на мышке и если все ок, то нужно изменить некие параметры фигуры с учетом текущего положения мышки, предварительно стерев фигуру со старого места и нарисовать ее уже на новом.... это и будет перемещение. При этом нужно не затронуть другие :)
> А как сделать чтобы при помощи мышки можно было этот круг
> выделить , чтобы изменить RGB?
улыбнуло :)
Тут вообще "труба" PtInRect... даже PtInRegion потом как-то внутри программы выбрать некую фигуру, грубо ее параметры... и тот самый RGB :)
Вообщем тут не объяснишь на пальцах....
Глянь на T<Фигура>....
← →
Anatoly Podgoretsky © (2007-09-26 01:15) [9]> {RASkov} (26.09.2007 01:04:08) [8]
Ничего стирать не надо, надо просто рисовать. Подобные программы именно так пишутся, а то еще будет спрашивать, провел другим окошком поверх, а оно тютю. И конечно список объектов с учетом Z order
← →
{RASkov} © (2007-09-26 01:33) [10]> [9] Anatoly Podgoretsky © (26.09.07 01:15)
Согласен.... вот в примере ниже нет вот этого вот:
> учетом Z order
Ну да ладно.... пусть автор вопроса изучает принцип рисования(прорисовки)
> smartleds
Просто замени в новом проекте модуль формы на вот этот и пропиши обработчикиunit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type
TFig = class
X,Y,R: Integer;
CLR: TColor;
public
procedure Paint(Cnv: TCanvas); virtual;
function InMouse(const AX, AY: Integer): Boolean;
constructor Create(const AX, AY, AR: Integer);
end;
TRectFig = class(TFig)
public
procedure Paint(Cnv: TCanvas); override;
end;
TEllFig = class(TFig)
public
procedure Paint(Cnv: TCanvas); override;
end;
TForm1 = class(TForm)
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure FormPaint(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
CR: TRectFig;
CE: TEllFig;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TFig }
constructor TFig.Create(const AX, AY, AR: Integer);
begin
X:=AX; Y:=AY; R:=AR;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CR:=TRectFig.Create(40, 40, 30);
CE:=TEllFig.Create(150, 100, 30);
DoubleBuffered:=True;
end;
function TFig.InMouse(const AX, AY: Integer): Boolean;
begin
Result:=PtInRect(Rect(X-R, Y-R, X+R, Y+R), Point(AX, AY));
end;
procedure TFig.Paint(Cnv: TCanvas);
begin
Cnv.Brush.Color:=CLR;
end;
{ TRectFig }
procedure TRectFig.Paint(Cnv: TCanvas);
begin
inherited;
Cnv.Rectangle(X-R, Y-R, X+R, Y+R);
end;
{ TEllFig }
procedure TEllFig.Paint(Cnv: TCanvas);
begin
inherited;
Cnv.Ellipse(X-R, Y-R, X+R, Y+R);
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if not (ssLeft in Shift) then Exit;
if CR.InMouse(X, Y) then begin
CR.X:=X;
CR.Y:=Y;
if ssRight in Shift then CR.CLR:=RGB(Random(255), Random(255), Random(255));
end else if CE.InMouse(X, Y) then begin
CE.X:=X;
CE.Y:=Y;
if ssRight in Shift then CE.CLR:=RGB(Random(255), Random(255), Random(255));
end;
Invalidate;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
CR.Paint(Canvas);
CE.Paint(Canvas);
end;
end.
Не идеально, но на скорую руку для изучения может и пойдет.
← →
smartleds (2007-09-26 01:47) [11]Я так понял мне компонент Tshape курить?
← →
{RASkov} © (2007-09-26 01:50) [12]> [11] smartleds (26.09.07 01:47)
Кури все, что считаешь нужным....
Ты код [10] пробывал? Если смотрел, то суть понял?
← →
Германн © (2007-09-26 01:54) [13]
> smartleds (26.09.07 01:47) [11]
>
> Я так понял мне компонент Tshape курить?
>
Кури. "Начинающим" это полезно.
← →
Германн © (2007-09-26 01:59) [14]Удалено модератором
Примечание: Оффтоп
← →
{RASkov} © (2007-09-26 02:04) [15]Удалено модератором
Примечание: Оффтоп
← →
Джо © (2007-09-26 02:06) [16]Не оффтопьте, граждане, пожалуйста! :)
← →
Германн © (2007-09-26 02:08) [17]
> Джо © (26.09.07 02:06) [16]
Извини.
← →
Германн © (2007-09-26 02:13) [18]
> {RASkov} © (26.09.07 02:04) [15]
Я хотел сказать, что автору задали в "школе" задание. Он ничего пока не знает и код в [10] понять не сможет. Пусть начинает с "Hello World", с изучения компонента TShape. Форму этого компонента задать легко. Цвет - придётся ещё кое-что изучить.
← →
{RASkov} © (2007-09-26 03:21) [19]> [18] Германн © (26.09.07 02:13)
> Пусть начинает с изучения компонента TShape.
Да пусть конечно же...., я не против, даже помогу ему немного :)
> [16] Джо © (26.09.07 02:06)
Сорри за "безобразия" :)
> smartleds
Вот разберайся:unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure Shape1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
with TShape.Create(self) do begin
Parent:=Self;
Width:=50+Random(200);
Height:=50+Random(200);
Left:=X-Width div 2;
Top:=Y-Height div 2;
Shape:=TShapeType(Random(6)); //выберем случайный тип
Brush.Color:=RGB(Random(255), Random(255), Random(255)); //"Случайно покрасим"
OnMouseUp:=Shape1MouseUp; //Присвоим обработчик.
end;
end;
procedure TForm1.Shape1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
with (Sender as TShape) do begin //Обычно "здесь" еще и проверяют сендер, но в данном примере нет необходимости
if Button=mbLeft then begin //Если левой кнопкой мыши то
BringToFront; // "поднимем" наверх
Brush.Color:=clRed; // и "покрасим" в красный
end else begin // во всех других случаях(правой, средней)
SendToBack; // "Опустим" ниже кан... в самый низ
Brush.Color:=RGB(Random(255), Random(255), Random(255)); // "Разукрасим по полной"
end;
end;
end;
end.
....даже такое тяжело придумать начинающему.... и не только :о)
← →
{RASkov} © (2007-09-26 03:22) [20]> Вот разберайся
Т.е. разбирайся)
← →
Германн © (2007-09-26 03:50) [21]Я пожалуй предпочту молчание. Оно ведь золото :-)
← →
Anatoly Podgoretsky © (2007-09-26 07:47) [22]> Германн (26.09.2007 03:50:21) [21]
А я пошел курить.
Тема одновременна простая и сложная.
Страницы: 1 вся ветка
Текущий архив: 2007.10.21;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.046 c