Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.022 c
3-1181827882
hprx
2007-06-14 17:31
2007.10.21
Копирование данных


15-1190281655
Flikik
2007-09-20 13:47
2007.10.21
Delphi


15-1190563918
Каисса
2007-09-23 20:11
2007.10.21
Сложение в каноническом Си...


6-1163414321
anis
2006-11-13 13:38
2007.10.21
Как отобразить ход выполнения закачки IdFTP?


2-1190714903
zzzz
2007-09-25 14:08
2007.10.21
Узнать редактировался ли столбец