IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

 
 Ответить  Открыть новую тему 
> Объекты и классы
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 3
Пол: Мужской

Репутация: -  0  +


Вот задали прогу..
Нужно создать свой класс "прямоугольник", вывести на канву восемь объектов разных цветов этого класса в 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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Добавь в класс TRectangle метод (функцию), проверяющий принадлежность указанной точки данному прямоугольнику. В обработчике формы OnMouseDown перебирай все прямоугольники до тех пор, пока точка (x, y) (координаты указателя, переданные в обработчик события) не окажется внутри одного из прямоугольников. Запомни его цвет (из поля TRectangle.rectcolor).


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 3
Пол: Мужской

Репутация: -  0  +


Уже несколько раз переписывал эту прогу разными способами.Никак не могу получить должный результат.
Вот я не понимаю, что неправильно в записи 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.


--------------------
И самый мужественный из нас лишь редко обладает мужеством на то, что он собственно знает...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
Вот я не понимаю, что неправильно в записи Table:=Tablica.Create(acolor);

Ты можешь вызывать функцию, как процедуру, но НАОБОРОТ - никто тебе не разрешит smile.gif
Как описана Tablica.Create? Процедура? А ты вызываешь как?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





Группа: Пользователи
Сообщений: 3
Пол: Мужской

Репутация: -  0  +


Ок.Т.е. всегда следует вызывать как Table.Create(acolor);
Теперь компилируется, но прога не работает, останавливаясь на процедуре Tablica.Create, на A[i].Create(...).Здесь дело в том, что я разбил процесс создания массива на 2 цикла?


--------------------
И самый мужественный из нас лишь редко обладает мужеством на то, что он собственно знает...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 18.12.2017 2:39
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"