Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2019, 19:53   #1
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию Работа с классами

Я уже создал тему по работе с клеточным автоматом. но этот вопрос там явно потеряется, постоянные пользователи просто перестают следить за темой, как видно по просмотрам. так что ответвление сделаю. тем боле что админ мне раньше не ответил. что делать в таких случаях.
Программа до ошибки и после ошибки отличается цифрой 1 в конце. спасибо.
тема материнская вот тут
http://programmersforum.ru/showthrea...=326513&page=5

Назрел вопрос.
Сначала введу в курс дела:
есть класс TField,в нём двумерный массив ( таблица) FArea. При нажатии на кнопку старт создается Farea через конструктор Create. Потом массив FArea заполняется с помощью fillField случайными FArea надо скопировать в стрингГрид. СтрингГрид находиться в TForm2. Из из таблицы-массива класса TFiield , мне нужно отправить числа в таблицу Стринг грид класса Tform2.

Я пытаюсь поменять procedure TForm2.fillStiringGrid, что бы все это сделать. Туда раньше подавалось:
(var sg: TStringGrid; rowCount, colCount, maxValue: integer);

А теперь я внутрь заголовка добавляю еще var field:Tfield:

procedure TForm2.fillStiringGrid(var field:Tfield; var sg: TStringGrid;
rowCount, colCount, maxValue: integer);

при вызове процедуры подаю я в сюда эту переменную через procedure TForm2.Button1Click.:
fillStiringGrid(field, StringGrid1, i, j, 10);

Что бы это сделать, я в var процедуры добавил переменную класса Field:
procedure TForm2.Button1Click(Sender: TObject {ACol, ARow: Integer; Rect: TRect; State: TGridDrawState});
var
i, j: Integer;
res:integer;
field: TField;

Все эти сделанные мною перемены кода привели меня к работающей программе, её можно скачать по ссылке дропбокс или она прикрепелена:
https://www.dropbox.com/s/sk77ptjo6n..._step.rar?dl=0

Для того. что бы у меня стринг грид заполнялся случайными числами не внутри стринг грида класса Tform2, а что бы он заполнялся теми случайными числами. которые были сгенерированы внутри класса Tfield...

Я меняю процедуру TForm2.fillStiringGrid, а именно:
sg.Cells[i, j]:=inttostr(Random(maxValue));Вопрос в том. что вот тут возникают проблемы в строчке :
Вместо Random(maxValue я пытаюсь вставать field[i,j]

sg.Cells[i, j]:=inttostr(field[i,j]);

и получаю ошибку

[dcc32 Error] Unit2.pas(113): E2149 Class does not have a default property
Прикрепляю файл.
https://www.dropbox.com/s/e8aeobqn10...step1.rar?dl=0
Изображения
Тип файла: jpg Снимок.jpg (83.7 Кб, 115 просмотров)
Вложения
Тип файла: rar 4. создаем do_step.rar (1.67 Мб, 6 просмотров)
Тип файла: rar 4. создаем do_step1.rar (1.67 Мб, 7 просмотров)
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками
anaschu вне форума Ответить с цитированием
Старый 20.02.2019, 20:17   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Ругается он на то что не знает что надо к FArea обращаться.
1. Вариант первый.
field[i,j] замените field.FArea[i,j]
2. Вариант второй и добавьте то что компилятор просит. А именно поле по умолчанию.
Код:
TField=
    private
    ...
    function GetPixel(X, Y: Integer): Integer;
    procedure SetPixel(X, Y: Integer; Value: Integer);
    public
    ...
    property Pixels[X, Y: Integer]: Integer read GetPixel write SetPixel;  default;
    ...
    end;

...

function TField.GetPixel(X, Y: Integer): Integer;
begin
result:=FArea[X,Y];
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 20.02.2019, 21:29   #3
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

поле по муолчанию через проперти мне пока сложновато...попробую по первому варианту. спасибо!
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками
anaschu вне форума Ответить с цитированием
Старый 20.02.2019, 21:31   #4
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
field[i,j] замените field.FArea[i,j]
сработало. а я думал наобороте, надо делать Ffield.Area[]
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками
anaschu вне форума Ответить с цитированием
Старый 20.02.2019, 22:24   #5
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

дальше у меня точно такие же проблемы пошли. но с другим классом...создам видео и выложу. как я их решил
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками
anaschu вне форума Ответить с цитированием
Старый 01.03.2019, 16:49   #6
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

не решил.
Ошибка
[dcc32 Error] Unit2.pas(265): E2096 Method identifier expected

Из FArea
-массива класса TFiield , я отправляю числа в таблицу Стринг грид класса Tform2 , с помощью procedure TForm2.fillStiringGrid.

После заполнения стрингГрид я окрашиваю стринг грид, Окрашиваю те ячейки, в которых есть пометка Fiield[i,j].exist=true
Вот код процедуры . Ошибка подсвечена

Код:
procedure TForm2.StringGrid1DrawCell(Field:Tfield; Sender: TObject; ACol, ARow: integer;
  Rect: TRect; State: TGridDrawState);
var
  text: string;  //для пуша
begin
  Field:= Tfield.Farea ;
  StringGrid1.Canvas.Brush.Color := clRed;
  if ((ACol = 4) and (ARow = 4) and (StringGrid1.Cells[ACol, ARow] <> '')) then
    StringGrid1.Canvas.FillRect(Rect);
  if StringGrid1.Cells[ACol, ARow] = '' then    //для пуша
    exit;

  if (abs(ACol - 4) <= 1) and (abs(ARow - 4) <= 1) and
    ((ACol <> 4) or (ARow <> 4)) and
    (FArea[ACol, ARow].exist = true) then
  begin
    StringGrid1.Canvas.Brush.Color := clGreen;
    StringGrid1.Canvas.Font.Color := clWhite;
    StringGrid1.Canvas.FillRect(Rect);
    text := StringGrid1.Cells[ACol, ARow];
    DrawText(StringGrid1.Canvas.Handle, PChar(text), Length(text), Rect,
      DT_CENTER or DT_VCENTER or DT_SINGLELINE);
  end;
видать, до меня какие то элементарные основы никак не дойдут...Стыдоба!

вот файл проекта
https://www.dropbox.com/s/y3b7cf36dw..._step.rar?dl=0
Вложения
Тип файла: rar 6. создаем do_step.rar (173.8 Кб, 9 просмотров)
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками

Последний раз редактировалось anaschu; 01.03.2019 в 17:26.
anaschu вне форума Ответить с цитированием
Старый 01.03.2019, 17:30   #7
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

На всякий случай даю весь код.
подсвечено оранжевым то, о чём я говорил в предыдущем сообщении

Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type

  Tcell = class
  public
    exist: boolean;
    Resource: integer;
    Constructor Create();
  end;

  TField = class // это будет передавать параметры в стринггрид1
  private
    FWidth: integer; // Ширина поля в клетках
    FHeight: integer; // Высота поля в клетках
    maxRes: integer; //максимум ресурсов вокруг этой клетки

    Fstep: integer;
    //procedure GrowAllCells;
    function findMaxResource(startX, startY: integer): integer;
    function IsInside(X, Y: Integer): Boolean;

    procedure makeCellExist(X, Y: integer; Resource: integer);

  public

    // Конструктор.
    FArea: array of array of Tcell; // Массив клеток поля
    procedure GrowAllCells;
    constructor Create(Width, Height: integer);
    // Деструктор.

    procedure fillField(rowCount, colCount, maxValue: integer);
    procedure DoStep(Fstep: integer);
    // procedure fill(var sg: TStringGrid);
  end;

  TForm2 = class(TForm)
    StringGrid1: TStringGrid;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    // ; ACol, ARow: Integer;   Rect: TRect; State: TGridDrawState);
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: integer;
      var CanSelect: boolean);
    procedure StringGrid1DrawCell(Field:Tfield; Sender: TObject; ACol, ARow: integer;
      Rect: TRect; State: TGridDrawState);

  private
    { Private declarations }


    procedure fillStiringGrid(var field: TField; var sg: TStringGrid;
      rowCount, colCount, maxValue: integer);
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}
function TField.IsInside(X, Y: Integer): Boolean;
begin
  Result := (X >= 0) and (X < FWidth) and (Y >= 0) and (Y < FHeight);
end;



Constructor Tcell.Create();
begin
  exist := False;
  Resource := -1;
end;

constructor TField.Create(Width, Height: integer);
var
  i, j: integer;
  cell: Tcell;
begin
  // Запоминаем ширину и высоту поля.
  FWidth := Width;
  FHeight := Height;

  // Задаем размер массива FCells.
  SetLength(FArea, FWidth);
  // Создаем объекты клеток.
  for i := 0 to FWidth - 1 do
  begin
    SetLength(FArea[i], FHeight); // без конструктора, просто выделяется память
    for j := 0 to FHeight - 1 do
    begin
      cell := Tcell.Create;
      FArea[i, j] := cell;
    end;
  end;
end;

procedure TForm2.fillStiringGrid(var field: TField; var sg: TStringGrid;
  rowCount, colCount, maxValue: integer);
var
  i, j: integer;
begin
  sg.rowCount := rowCount;
  sg.colCount := colCount;
  rowCount := 10;
  // Создаем объекты клеток.
  Randomize;
  for i := 0 to StringGrid1.rowCount - 1 do
  begin
    for j := 0 to StringGrid1.colCount - 1 do
    begin
      sg.Cells[i, j] := inttostr(field.FArea[i, j].Resource);
    end;
  end;

end;

procedure TField.fillField(rowCount, colCount, maxValue: integer);
var
  i, j: integer;
begin
  // Создаем объекты клеток.
  Randomize;
  for i := 0 to rowCount - 1 do
  begin
    for j := 0 to colCount - 1 do
    begin
      FArea[i, j].Resource := Random(maxValue);
    end;
  end;

end;

function TField.findMaxResource(startX, startY: integer ): integer;
var
  i, j, res: integer;
begin
  begin
    i := 0;
    j := 0;
    res := FArea[startX, startY].Resource;
    for i := startX - 1 to startX + 1 do
      for j := startY - 1 to startY + 1 do
      begin
        if IsInside(i, j) then begin
          if (res < (FArea[i, j].Resource)) and ((i <> startX) and (j <> startY))
          then
            res := FArea[i, j].Resource;
        end;
      end;
    maxRes := res;
  end
end;

procedure TField.makeCellExist(X, Y: integer; Resource: integer);
var i,j,res:integer;
begin

   begin
    i := 0;
    j := 0;

    for i := X - 1 to X + 1 do
      for j := Y - 1 to Y + 1 do
      begin
        if isInside(i, j) then begin
          if ((FArea[i, j].Resource)=Resource) and ((i <> X) and (j <> Y))
          then
            FArea[i, j].exist:=true;
        end;
      end;
    maxRes := res;
  end
end;

procedure TField.GrowAllCells;
var
  X, Y: integer;
begin
  for X := 0 to FWidth - 1 do
  begin
    for Y := 0 to FHeight - 1 do
    begin
      if FArea[X, Y].exist then
      begin // Проверяем, что в клетке есть гриб.
        MaxRes := findMaxResource(X, Y );
        makeCellExist(X,Y, maxRes);
      end;
    end;
  end;




  //maxRes == findMaxResource(FWidth, FHeight)
end;

procedure TField.DoStep(Fstep: integer);
var
  i, j: integer;
  res: integer;
begin

  if Fstep = 0 then
  begin
    i := 0;
    j := 0;
    FArea[4, 4].exist:=true;
    res := FArea[4, 4].Resource;
    for i := 3 to 5 do
      for j := 3 to 5 do
      begin
        if (res < (FArea[i, j].Resource)) and ((i <> 4) and (j <> 4)) then
          res := FArea[i, j].Resource;
      end;
    maxRes := res;
  end
  else
  begin
    GrowAllCells();
  end;
end;

procedure TForm2.Button1Click
  (Sender: TObject { ACol, ARow: Integer;   Rect: TRect; State: TGridDrawState } );
var
  i, j: integer;
  // step:Integer;
  field: TField;
begin
  i := 10;
  j := 10;

  field := TField.Create(i, j);
  field.fillField(i, j, 10);
  fillStiringGrid(field, StringGrid1, i, j, 10);

  // закрашиваем ячейку

  // находим максимальное значение

  field.Fstep := 0;
  field.DoStep(field.Fstep);
  inc(field.Fstep);

end;

procedure TForm2.StringGrid1DrawCell(Field:Tfield; Sender: TObject; ACol, ARow: integer;
  Rect: TRect; State: TGridDrawState);
var
  text: string;  //для пуша
begin
  Field:= Tfield.Farea ;
  StringGrid1.Canvas.Brush.Color := clRed;
  if ((ACol = 4) and (ARow = 4) and (StringGrid1.Cells[ACol, ARow] <> '')) then
    StringGrid1.Canvas.FillRect(Rect);
  if StringGrid1.Cells[ACol, ARow] = '' then    //для пуша
    exit;

  if (abs(ACol - 4) <= 1) and (abs(ARow - 4) <= 1) and
    ((ACol <> 4) or (ARow <> 4)) and
    (FArea[ACol, ARow].exist = true) then
  begin
    StringGrid1.Canvas.Brush.Color := clGreen;
    StringGrid1.Canvas.Font.Color := clWhite;
    StringGrid1.Canvas.FillRect(Rect);
    text := StringGrid1.Cells[ACol, ARow];
    DrawText(StringGrid1.Canvas.Handle, PChar(text), Length(text), Rect,
      DT_CENTER or DT_VCENTER or DT_SINGLELINE);
  end;

end;

procedure TForm2.StringGrid1SelectCell(Sender: TObject; ACol, ARow: integer;
  var CanSelect: boolean);
var

  Resources: String;
begin
  Resources := StringGrid1.Cells[ACol, ARow];
  Label1.Caption := 'Число ресурсов: ' + Resources;

end;

end.
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками
anaschu вне форума Ответить с цитированием
Старый 07.03.2019, 16:25   #8
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

Новый вопрос этого же класса был создан мною по запарке в другом месте. Почти этот вопрос решается в теме
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками
anaschu вне форума Ответить с цитированием
Старый 07.03.2019, 18:50   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от anaschu Посмотреть сообщение
Почти этот вопрос решается в теме
а объясните, зачем Вы одновременно несколько тем ведёте про одни и то же?
Мало того, что это дублирование называется кросспостинг и запрещено правилами форума, так это же банально неудобно - один и тот же вопрос/код публиковать в разных темах, отслеживать разные темы, отвечать то там, то там...
Вас это не напрягает?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.03.2019, 13:03   #10
anaschu
Форумчанин
 
Регистрация: 21.09.2012
Сообщений: 372
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Вы одновременно несколько тем ведёте
да, неудобно получилось...тогда в основной теме буду оставлять ссылку на побочную
Занимаюсь:1.зверьком- покемончиком для компьютерного затончика. 2 IT-грибами,что бы скушать потом их с вами.3. цифровым обезьянками, как куны ударяют за тянками
anaschu вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с классами doss Помощь студентам 26 05.10.2014 17:45
Работа с классами Fadey001 Microsoft Office Excel 7 15.08.2014 15:25
Работа с классами cooper30 C# (си шарп) 9 05.11.2013 16:57
Работа с классами RomiKon Помощь студентам 4 26.03.2013 21:21
Работа с классами и STL Blad47 Помощь студентам 3 31.03.2011 01:07