2017-01-31 4 views
1

Я хочу отредактировать свойство формы внутри процедуры. Однако, если я создаю свою собственную процедуру, я получаю ошибку «undefinded identifier».Delphi: необъявленный идентификатор в процедуре

Я попытался изменить свойство в процедуре события OnCreate моей формы, и это работает нормально.

Почему это так и как я могу это исправить?

unit Unit1; 

interface 

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

type 
    Tfrm_main = class(TForm)    
    shp_wheelLeftInside: TShape; 
    shp_wheelRightInside: TShape; 
    procedure FormCreate(Sender: TObject); 
    private 
    { Private declarations } 

    public 
    { Public declarations } 
    end; 

var 
    frm_main: Tfrm_main; 

implementation 

{$R *.dfm} 

procedure addWheelInsides(); 
begin 

    shp_wheelRightInside.Height := 42;   //this is where the error occurs 

end; 

procedure Tfrm_main.FormCreate(Sender: TObject); 
begin 

    shp_wheelLeftInside.Height := 42; 
    shp_wheelRightInside.Height := 42; 

    addWheelInsides(); 

end; 

end. 
+0

Почему вы не передать 'TShape' на вашем прок? – Sami

+0

Форма ничего не знает о вашей процедуре ... add it: var frm_main: Tfrm_main; процедура addWheelInsides; реализация Да, и вам может понравиться, что Сами добавил TShape к вашей процедуре. – user763539

ответ

4

Проблема заключается в том, что shp_wheelRightInside является полем, принадлежащим вашему классу Tfrm_main, тогда как метод addWheelInsides(), который вы объявили как голый, обычный метод, который ни к чему. Поэтому метод не имеет доступа к полям, которые принадлежат форме.

Одним из решений является перемещение метода, который намеревается использовать объекты, принадлежащие форме, в самой форме.

Tfrm_main = class(TForm)    
    shp_wheelLeftInside: TShape; 
    shp_wheelRightInside: TShape; 
    procedure FormCreate(Sender: TObject); 
    private 
    procedure addWheelInsides(); {declare it here}  
    public 
    { Public declarations } 
    end; 

который затем реализовать как метод класса формы, как:

procedure Tfrm_main.addWheelInsides(); 
begin  
    shp_wheelRightInside.Height := 42; 
end; 
2

Поле shp_wheelRightInside не отображается в вашей процедуре. Объявите процедуру addWheelInsides() внутри формы вместо метода shp_wheelRightInside.

type 
    Tfrm_main = class(TForm)    
    shp_wheelLeftInside: TShape; 
    shp_wheelRightInside: TShape; 
    procedure FormCreate(Sender: TObject); 
    private 
    { Private declarations } 
    procedure addWheelInsides; 

    public 
    { Public declarations } 
    end; 

Если вы хотите продлить процедуру через несколько единиц, проходят TShape в качестве параметра вместо этого.

Смежные вопросы