Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Динамическое создание Edita


Автор: Teran 25.5.2006, 18:24
Этим кодом я создаю 10 Edit-ов на форме
Код

         for k:=0 to 10 do
          begin
           Edit:=TEdit.Create(nil);
           Edit.Top:=3;
           Edit.Left:=200;
           Edit.Width:=50;    
           Edit.Text:='Test';
           Edit.Parent:=Form1;
          ShowMessage( Edit.Name);



этим убиваю
Код

 while Form1.ControlCount>0 do
  Form1.Controls[0].Destroy;


но у созданных edit-ах я не могу получить имена Edit.Name?

Кто-нибудь знает как можно получить имя каждого чтобы потом можно было к нему обращаться?
 smile  smile  smile  

Автор: Snowy 25.5.2006, 18:25
Сначала их присвой.
Код

Edit.Name := 'Edit' + IntToStr(k);
 

Автор: Yanis 25.5.2006, 18:27
При создании присваивай ему имя. Что бы помнить заведи массив с индексами или постоянно пробегай по форме в поисках своих TEdit. Где-нибудь после Edit:=TEdit.Create(nil); напиши Edit.Name := 'желаемое имя'; 

Автор: Teran 25.5.2006, 18:39
Цитата(Snowy @  25.5.2006,  18:25 Найти цитируемый пост)
Edit.Name := 'Edit' + IntToStr(k);

а как потом получить его

если в прграме напишу 'Edit5.Text; - программа не откомпилируется потому что такого edit -а на форме нет?

Добавлено @ 18:50 
Почему-то и так не помогает:
Код

 ShowMessage(TEdit(FindComponent('Edit_1')).Text);

выводит ''  - пусто (Хотя текст я туда задаю) 

Автор: skyboy 25.5.2006, 18:57
а символ "_" зачем? ты точно имя с этим подчёркиванием формируешь? ;) 

Автор: Teran 25.5.2006, 19:03
да 
содаю так:
Код

           Edit:=TEdit.Create(nil);
           Edit.Name:='Edit_'+IntToStr(k);
           Edit.Top:=TopLabel-3;
           Edit.Left:=200;
................
 

Автор: Yanis 25.5.2006, 19:08
Цитата(Teran @  25.5.2006,  19:39 Найти цитируемый пост)
если в прграме напишу 'Edit5.Text; - программа не откомпилируется потому что такого edit -а на форме нет?
Так его действительно нету! Создаешь динамечески, то и обращайся "динамически". 

Автор: McDevil 25.5.2006, 20:26
Teran, а зачем динамически их создавать...
Может имеет смысл накидать их на форму и не мучиться...
При моем раскладе размер .exe увеличиться незначительно, а при твоем скушаешь немного лишней памяти...
 

Автор: Dimannn 25.5.2006, 20:41
Наверное, надо TEdit.Create(Form1);
 

Автор: Foley 25.5.2006, 23:45
Цитата(McDevil @  25.5.2006,  20:26 Найти цитируемый пост)
Может имеет смысл накидать их на форму и не мучиться...

да и потом обращаться к ним удобней, если тебе не все эдиты нужны, то можно и Visible у них поюзать... 

Автор: Teran 26.5.2006, 08:31
 нет мне нужно создавать их именно - динамически из-за того что я заранее низнаю их колличества 

Автор: ElMichael 26.5.2006, 08:45
Попробуй воспользоваться динамической структурой типа:
Код

type
     pEditS = ^tEditS;
     tEdits = record
        Edit: TEdit;
        Next: pEditS
     end;


P.S.: Извини, если обидел кодом ;) 

Автор: Teran 26.5.2006, 08:45
Уррра!  smile 
Цитата(Dimannn @  25.5.2006,  20:41 Найти цитируемый пост)
Наверное, надо TEdit.Create(Form1);


Совершенно верно.
Все заработало. 

Автор: Yanis 26.5.2006, 09:01
А я хотел пример настрочить... smile  

Автор: Sunr1se 26.5.2006, 09:19
Можно создать глобальную переменную, динамический массив:
Код

var Edits: array of TEdit;

При создании Edit'а увеличивать размер массива на 1:
Код

SetLength(Edits, High(Edits)+2);

И затем вставляем в массив динамически созданный Edit:
Код

Edits[High(Edits)] := Edit;  //Edit - это динамически созданный объект

После можно обращаться к Edit'ам как к элементам массива. 

Автор: Rennigth 26.5.2006, 09:36
Цитата(Teran @  26.5.2006,  08:45 Найти цитируемый пост)
Уррра!   
Цитата(Dimannn @  25.5.2006,  20:41 )
Наверное, надо TEdit.Create(Form1);
Совершенно верно.
Все заработало.  

это как?... при чем тут Owner? объясните если я чего не понимаю  smile 

хм, если честно не понял вообще смысл всей дисскусии... 
при чем тут вообще Name компонента и то как к нему обращаться?
Name у компонента используеться восновном только в Design-Time для создания переменной с таким названием, ну и в некоторых исключительных ситуация. А юзать это для поика...
 

Автор: Yanis 26.5.2006, 10:28
Цитата(Rennigth @  26.5.2006,  10:36 Найти цитируемый пост)
объясните если я чего не понимаю

Как я понял smile, то автор создавал Edit динамически и имя ему присваивал, а в программе пытался обратиться к этому Edit'у. Естественно такой код даже не компилится... Собсвенно проблема была в том как потом обращаться к созданным Edit'ам. 

Автор: Mechanic 26.5.2006, 23:31
Цитата(Yanis @  26.5.2006,  10:28 Найти цитируемый пост)
Собсвенно проблема была в том как потом обращаться к созданным Edit'ам

Помимо этого, если указан Ovner, то и дестроить их в деструкторе не нужно, об этом позаботится VCL сама.  smile  

Автор: Yanis 27.5.2006, 07:47
Цитата(Mechanic @  27.5.2006,  00:31 Найти цитируемый пост)
Помимо этого, если указан Ovner, то и дестроить их в деструкторе не нужно, об этом позаботится VCL сама. 
Знаю smile smile
Для тех, кто не знает, справка гласит:
Цитата
AOwner is another component, typically the form, that is responsible for freeing the edit control.
 

Автор: Dimannn 28.5.2006, 15:01
При обращениик эдтитам использовалось TEdit(FindComponent('Edit_1')) 

FindComponent - это метод формы. Но ведь ей даже не сказали, что на неё добавили эдит.
А в TEdit.Create как раз и вызывают AOwner.Components.Add(NewEdit).
Поэтому, когджа туда посылали nil, ссылка на новый эдит в форму не догбавлялась, и она не могла его найти. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)