![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() |
yngwie-malmsteen |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 3 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вот задали прогу..
Нужно создать свой класс "прямоугольник", вывести на канву восемь объектов разных цветов этого класса в 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 |
![]()
Сообщение
#2
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Добавь в класс TRectangle метод (функцию), проверяющий принадлежность указанной точки данному прямоугольнику. В обработчике формы OnMouseDown перебирай все прямоугольники до тех пор, пока точка (x, y) (координаты указателя, переданные в обработчик события) не окажется внутри одного из прямоугольников. Запомни его цвет (из поля TRectangle.rectcolor).
-------------------- The idiots are winning.
|
yngwie-malmsteen |
![]()
Сообщение
#3
|
Группа: Пользователи Сообщений: 3 Пол: Мужской Репутация: ![]() ![]() ![]() |
Уже несколько раз переписывал эту прогу разными способами.Никак не могу получить должный результат.
Вот я не понимаю, что неправильно в записи 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 |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата Вот я не понимаю, что неправильно в записи Table:=Tablica.Create(acolor); Ты можешь вызывать функцию, как процедуру, но НАОБОРОТ - никто тебе не разрешит ![]() Как описана Tablica.Create? Процедура? А ты вызываешь как? |
yngwie-malmsteen |
![]()
Сообщение
#5
|
Группа: Пользователи Сообщений: 3 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ок.Т.е. всегда следует вызывать как Table.Create(acolor);
Теперь компилируется, но прога не работает, останавливаясь на процедуре Tablica.Create, на A[i].Create(...).Здесь дело в том, что я разбил процесс создания массива на 2 цикла? -------------------- И самый мужественный из нас лишь редко обладает мужеством на то, что он собственно знает...
|
![]() ![]() |
![]() |
Текстовая версия | 9.07.2025 11:02 |