Автор: yngwie-malmsteen 14.05.2006 1:11
Вот задали прогу..
Нужно создать свой класс "прямоугольник", вывести на канву восемь объектов разных цветов этого класса в 2 строки, затем по щелчку запомнить выбранный цвет в переменную, которую в дальнейшем можно будет как-то использовать в других процедурах.После вывести на канву 8 объектов так, чтобы цвета располагались в другом порядке и снова запомнить выбранный цвет.
Я вот создал свой класс, но никак не могу теперь написать процедуру выбора цвета.Мог бы кто-нибудь подсказать, что и как нужно использовать?
Код
unit UnitLucher;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TFormLucher = class(TForm)
BeginButton: TBitBtn;
ExitButton: TBitBtn;
procedure BeginButtonClick(Sender: TObject);
procedure ExitButtonClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TRectangle = class
x,y,dx,dy:integer;
rectcolor:word;
constructor Create(x1,y1,x2,y2:integer;acolor:word);
procedure Draw(acolor:word;IsShow:boolean);virtual;
procedure Show(acolor:word);
procedure Hide(acolor:word);
procedure MoveTo(adx,ady:integer;acolor:word);
end;
Tablica = class
A:array[1..8] of TRectangle;
procedure Create(acolor:word);
procedure ShowAll(acolor:word);
end;
var
FormLucher: TFormLucher;
acolor:word;
implementation
{$R *.dfm}
constructor TRectangle.Create;
begin
x:=x1;
y:=y1;
dx:=x2-x1;
dy:=y2-y1;
rectcolor:=acolor;
end;
procedure TRectangle.Draw;
begin
Rectangle(acolor,x,y,x+dx,y+dy);
FloodFill(acolor,x+1,y+1,acolor);
end;
procedure TRectangle.Show;
begin
Draw(acolor,true);
end;
procedure TRectangle.Hide;
begin
Draw(acolor,false);
end;
procedure TRectangle.MoveTo;
begin
Hide(acolor);
x:=x+adx;
y:=y+ady;
Show(acolor);
end;
procedure Tablica.Create;
var
i:integer;
begin
for i:=1 to 4 do begin
A[i].Create((FormLucher.Width div 9)+(i-1)*(2*FormLucher.Width div 9),
FormLucher.Height div 7,
(2*FormLucher.Width div 9)+(i-1)*(2*FormLucher.Width div 9),
2*FormLucher.Height div 7,acolor);
end;
for i:=5 to 8 do begin
A[i].Create((FormLucher.Width div 9)+(i-5)*(2*FormLucher.Width div 9),
3*FormLucher.Height div 7,
(2*FormLucher.Width div 9)+(i-5)*(2*FormLucher.Width div 9),
4*FormLucher.Height div 7,acolor);
end;
ShowAll(acolor);
end;
procedure Tablica.ShowAll;
var
i:integer;
begin
acolor:=clsilver;
for i:=1 to 8 do begin
A[i].Show(acolor);
acolor:=acolor+1;
end;
end;
var
Table:Tablica;
procedure TFormLucher.BeginButtonClick(Sender: TObject);
begin
with FormLucher.Canvas do begin
Table.Create(acolor);
end;
end;
procedure TFormLucher.ExitButtonClick(Sender: TObject);
begin
Close;
end;
end.
Автор: xds 14.05.2006 12:41
Добавь в класс TRectangle метод (функцию), проверяющий принадлежность указанной точки данному прямоугольнику. В обработчике формы OnMouseDown перебирай все прямоугольники до тех пор, пока точка (x, y) (координаты указателя, переданные в обработчик события) не окажется внутри одного из прямоугольников. Запомни его цвет (из поля TRectangle.rectcolor).
Автор: yngwie-malmsteen 24.05.2006 21:57
Уже несколько раз переписывал эту прогу разными способами.Никак не могу получить должный результат.
Вот я не понимаю, что неправильно в записи Table:=Tablica.Create(acolor);
Именно в этом месте выдает ошибку.
Код
unit UnitLucher;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TFormLucher = class(TForm)
BeginButton: TBitBtn;
ExitButton: TBitBtn;
procedure BeginButtonClick(Sender: TObject);
procedure ExitButtonClick(Sender: TObject);
procedure OnLucherMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
TRectangle = class
x,y,dx,dy:integer;
rectcolor:tcolor;
constructor Create(x1,y1,x2,y2:integer;acolor:tcolor);
procedure Draw(acolor:tcolor;IsShow:boolean);virtual;
procedure Show(acolor:tcolor);
procedure Hide(acolor:tcolor);
procedure MoveTo(adx,ady:integer;acolor:tcolor);
function Change(ax,ay:integer):word;
end;
Tablica = class
A:array[1..8] of TRectangle;
procedure Create(acolor:tcolor);
procedure ShowAll(acolor:tcolor);
end;
var
FormLucher: TFormLucher;
acolor:tcolor;
changecolor1,changecolor2:tcolor;
implementation
{$R *.dfm}
constructor TRectangle.Create(x1,y1,x2,y2:integer;acolor:tcolor);
begin
x:=x1;
y:=y1;
dx:=x2-x1;
dy:=y2-y1;
rectcolor:=acolor;
end;
procedure TRectangle.Draw(acolor:tcolor;IsShow:boolean);
begin
with FormLucher.Canvas do begin
pen.Color:=Ord(acolor);
brush.Color:=Ord(acolor);
Rectangle(x,y,x+dx,y+dy);
end;
end;
procedure TRectangle.Show(acolor:tcolor);
begin
Draw(acolor,true);
rectcolor:=acolor;
end;
procedure TRectangle.Hide(acolor:tcolor);
begin
Draw(acolor,false);
end;
procedure TRectangle.MoveTo(adx,ady:integer;acolor:tcolor);
begin
Hide(acolor);
x:=x+adx;
y:=y+ady;
Show(acolor);
end;
function TRectangle.Change(ax,ay:integer):word;
begin
if (ax>=x) and (ax<=x+dx) and (ay>=y) and (ay<=y+dy) then
Change:=rectcolor;
end;
procedure Tablica.Create(acolor:tcolor);
var
i:integer;
begin
for i:=1 to 4 do begin
A[i]:=TRectangle.Create((FormLucher.Width div 9)+(i-1)*(2*FormLucher.Width div 9),
FormLucher.Height div 7,
(2*FormLucher.Width div 9)+(i-1)*(2*FormLucher.Width div 9),
2*FormLucher.Height div 7,acolor);
end;
for i:=5 to 8 do begin
A[i]:=TRectangle.Create((FormLucher.Width div 9)+(i-5)*(2*FormLucher.Width div 9),
3*FormLucher.Height div 7,
(2*FormLucher.Width div 9)+(i-5)*(2*FormLucher.Width div 9),
4*FormLucher.Height div 7,acolor);
end;
ShowAll(acolor);
end;
procedure Tablica.ShowAll(acolor:tcolor);
var
i:integer;
begin
for i:=1 to 8 do begin
A[i].Show(acolor);
inc(acolor,400);
end;
end;
var
Table:Tablica;
procedure TFormLucher.BeginButtonClick(Sender: TObject);
begin
random(acolor);
changecolor1:=0;
changecolor2:=0;
with FormLucher.Canvas do begin
Table:=Tablica.Create(acolor);
end;
end;
procedure TFormLucher.ExitButtonClick(Sender: TObject);
begin
Close;
end;
procedure TFormLucher.OnLucherMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
i:integer;
begin
with FormLucher.Canvas do begin
for i:=1 to 8 do begin
if changecolor1=0 then begin
changecolor1:=Table.A[i].Change(x,y);
textout(380,30,IntToStr(changecolor1));
FormLucher.BeginButtonClick(Sender);
end
else if changecolor2=0 then begin
changecolor2:=Table.A[i].Change(x,y);
textout(400,30,IntToStr(changecolor2));
end;
end;
end;
end;
end.
Автор: volvo 24.05.2006 22:05
Цитата
Вот я не понимаю, что неправильно в записи Table:=Tablica.Create(acolor);
Ты можешь вызывать функцию, как процедуру, но НАОБОРОТ - никто тебе не разрешит
Как описана Tablica.Create? Процедура? А ты вызываешь как?
Автор: yngwie-malmsteen 24.05.2006 22:23
Ок.Т.е. всегда следует вызывать как Table.Create(acolor);
Теперь компилируется, но прога не работает, останавливаясь на процедуре Tablica.Create, на A[i].Create(...).Здесь дело в том, что я разбил процесс создания массива на 2 цикла?