0

我正在使用 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;
4

1 回答 1

2

编译器需要以GridSize某种方式找到声明。为此,请遵循本指南:

  1. 在主窗体中,添加UGameGenerator到使用列表:

    unit MainForm;
    
    interface
    
    uses
      ...,UGameGenerator; // Add here or in the implementation section
    
    ...
    implementation
    
    ...
    
    end.
    
  2. 在您的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);网格并将其作为参数传递。

于 2019-01-21T20:58:19.650 回答