2015-11-05 2 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; 

Но Дельфы возвращает эту ошибку: [Error] 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; 

Но, опять же, Delphi возвращает ошибку:

[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], добавьте соответствующий TEdit к Edits[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; 
    

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

  • Нет связанных вопросов^_^