2015-11-05 77 views
0

我有10個TEdits和10個圖像,我試圖使用此:Delphi的初學者 - 使用循環與TEDIT

procedure TForm1.Button1Click(Sender: TObject; edit: TEdit); 
var i:integer; 
begin 
for i:= 1 to 10 do 
    begin 
    if edit[i].text:='1' then picture[i].Show else picture[i].Hide; 
    end; 
end; 

但是Delphi的返回此錯誤:[錯誤] Unit1.pas(84):類不有一個默認屬性

我也試過這樣:

procedure TForm1.Button1Click(Sender: TObject); 
var i:integer; 
begin 
for i:= 1 to 10 do 
    begin 
    if edit[i].text:='1' then picture[i].Show else picture[i].Hide; 
    end; 
end; 

但同樣,德爾福會返回錯誤:

[Error] Unit1.pas(84): Undeclared identifier: 'edit'.

你能幫我用這段代碼嗎?

+0

很多基本的錯誤在這裏。 ':='是賦值運算符,'='是比較。一定不要混淆這些。看來你還沒有聲明任何名爲'edit'或'picture'的數組。如果要訪問數組中的控件,則需要聲明這些數組,然後將引用放置在其中的控件中。還要注意,你不能改變'TNotifyEvent'的方法簽名 - 它只能有一個參數('Sender:TObject')。 –

+0

另請參見:[使用字符串+整數和調用函數形成變量名稱](http://stackoverflow.com/q/16710189/33732)[如何引用一個名稱在運行時確定的控件?](http ://stackoverflow.com/q/13649250/33732)[如何創建一個控件數組?](http://stackoverflow.com/q/1218041/33732) –

回答

4

您需要聲明並填充自己的陣列,然後就可以在需要的時候通過他們循環,例如:

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    ... 
    Edit1: TEdit; 
    Edit2: TEdit; 
    Edit3: TEdit; 
    // and so on ... 
    Image1: TImage; 
    Image2: TImage; 
    Image3: TImage; 
    // and so on ... 
    procedure FormCreate(Sender: TObject); 
    procedure Button1Click(Sender: TObject); 
    ... 
    private 
    edit: array[1..10] of TEdit; 
    picture: array[1..10] of TImage; 
    ... 
    end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    edit[1] := Edit1; 
    edit[2] := Edit2; 
    edit[3] := Edit3; 
    // and so on... 
    picture[1] := Image1; 
    picture[2] := Image2; 
    picture[3] := Image3; 
    // and so on... 

    { 
    alternatively: 

    for I := 1 to 10 do 
    begin 
    edit[i] := TEdit(FindComponent('Edit' + IntToStr(i))); 
    picture[i] := TImage(FindComponent('Image' + IntToStr(i))); 
    end; 
    } 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    I: integer; 
begin 
    for I := 1 to 10 do 
    begin 
    if edit[i].Text = '1' then 
    picture[i].Show 
    else 
    picture[i].Hide; 
    { 
    alternatively: 
    picture[i].Visible := (edit[i].Text = '1'); 
    } 
    end; 
end; 
4

你可以做兩件事情之一:

  1. 使用形式的Components列表和FindComponent

    procedure TForm1.Button1Click(Sender: TObject); 
    var 
        i: Integer; 
        TempEdit: TEdit; 
    begin 
        for i:= 1 to 10 do 
        begin 
        TempEdit := Self.FindComponent('Edit' + IntToStr[i]) as TEdit; 
        if Assigned(TempEdit) then 
        begin 
         if TempEdit.Text = '1' then 
         Picture[i].Show 
         else 
         Picture[i].Hide; 
        end; 
        end; 
    end; 
    
  2. 維護您的TEdit控件的單獨陣列,並直接引用它們。當您指定Picture[i],加上配套TEditEdits[i],然後

    procedure TForm1.Button1Click(Sender: TObject); 
    var 
        i: Integer; 
    begin 
        for i:= 1 to 10 do 
        begin 
        if Edits[i].Text = '1' then 
         Picture[i].Show 
         else 
         Picture[i].Hide; 
        end; 
        end; 
    end;