Можно ли использовать атрибуты формы в отдельном блоке? - PullRequest
0 голосов
/ 21 января 2019

Я создаю игру с использованием delphi и хочу переместить часть моего кода в отдельный модуль, однако этот код использует атрибуты формы.Возможно ли это?

Я создаю игру, используя приложение формы VCL, и в настоящее время весь мой код для игрового алгоритма находится в модуле формы.В этом нет ничего плохого, поскольку моя программа работает хорошо, за исключением того, что она выглядит грязной, и мне посоветовали поместить код алгоритма в отдельный модуль.Я попытался переместить код в новый модуль, однако, что бы я ни пытался, появляются синтаксические ошибки.

Это код в моем основном модуле, где Grid - это TStringGrid из формы, а GridSize - процедура из моего второго попытки:

procedure TGame.NewGame;
begin
  Grid.Width:=GridSize(Grid.ColCount);
  Grid.Height:=GridSize(Grid.RowCount);
end;

Это второй код устройства:

unit UGameGenerator;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.Menus, 
  Vcl.StdCtrls;

implementation

function GridSize(size: integer): integer;
begin
  result:=291+36*(size-8);
end;

end.

РЕДАКТИРОВАТЬ:

Это код из второго устройства:

procedure ClearGrid;
var
  i,j: integer;
begin
  for i := 0 to Grid.ColCount-1 do
  begin
    for j := 0 to Grid.RowCount-1 do
    begin
      Grid.Cells[i,j]:='';
    end;
  end;
end;

1 Ответ

0 голосов
/ 21 января 2019

Компилятору нужно как-то найти объявление GridSize.Для этого следуйте этому руководству:

  1. В основной форме добавьте UGameGenerator в список использованных:

    unit MainForm;
    
    interface
    
    uses
      ...,UGameGenerator; // Add here or in the implementation section
    
    ...
    implementation
    
    ...
    
    end.
    
  2. Inваш UGameGenerator модуль, предоставьте доступ ко всем типам / функциям / процедурам, которые используются в других частях программы в интерфейсе:

    unit UGameGenerator;  
    
    interface
    
    uses
      ...,...;
    
    function GridSize(size: integer): integer;  
    
    implementation
    
    function GridSize(size: integer): integer;
    begin
      result:=291+36*(size-8);
    end;        
    
    end.
    

Подсказка при проектировании отдельного блока,Избегайте использования переменных напрямую из других модулей.Вместо этого передайте их как параметры в вызовах процедур / функций.

В противном случае вы рискуете получить много проблем с циклическими ссылками.

В вашем обновленном вопросе объявите procedure ClearGrid( aGrid : TStringGrid); и передайте сетку в качестве параметра..

...