Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

динамическое создание/удаление компонент [D7, XP]


Страницы:   1 2

Alexandr Malygin ©   (2007-12-04 13:23:00) 

Здравствуйте! ситуация такая, создаю на pagecontrol'е эдиты в количестве равном выбранному числу из комбобокса, код:

procedure TForm1.ComboBox1Change(Sender: TObject);
var i,n: integer;
ed: TEdit;

begin
   try
     n:=StrToInt(ComboBox1.Text);
    except
     ShowMessage('Ошибка в заданном числе');
   exit;
   end;
   for i:=1 to n do
    begin
    ed:=TEdit.Create(Self);
    (ed as TEdit).Name:='Edit'+IntToStr(i);
    (ed as TEdit).Parent:=PageControl1.Pages[0];
    (ed as TEdit).Enabled:=True;
    Application.ProcessMessages;
    end;
end;  

к примеру из комбо я выбрал число 5, создалось 5 эдитов, но заметив что я ошибся, выбираю число 6 и тут выходит ошибка... вопрос: как правильно удалить старые 5 компонент, чтобы создались новые 6? и как сделать правильнее? добавить 1 компоненту к пяти существующим или удалить 5, чтобы создать новые 6?
Заранее благодарю за ответ!


Dennis I. Komarov   (2007-12-04 13:47:00) [21]

> а вот куда ее впихнуть

Перед тем как создать новые шесть :)


Dennis I. Komarov   (2007-12-04 13:46:00) [22]

> [3] Ega23 ©   (04.12.07 13:39)

 Лучше так:
   if ts.controls[i] is TEdit then ts.controls[i].Free;
 Tag имеет право на сущществование и быть уже использующимся в др. целях


Alexandr Malygin   (2007-12-04 13:43:00) [23]

to Dennis I. Komarov >>> я убрал строчки которые координируют их

to Ega23 >>> вот не пойму что с процедурой этой делать... :) понял как работает, а вот куда ее впихнуть чтобы в run-time все сработало... чтобы отработало если я после 5-ки шестерку поставлю


Ega23   (2007-12-04 13:39:00) [24]


> А если там кроме эдитов еще полно всего?


Тогда так:
procedure ClearTabSheet(ts : TTabSheet; const : TagValue : Integer);
var
i : Integer;
begin
for i:=ts.ControlCount-1 downto 0 do
  if ts.controls[i].Tag=TagValue then
    ts.controls[i].Free;
end;


Ну и при создании прописывать нужный Tag


Dennis I. Komarov   (2007-12-04 13:31:00) [25]

> [1] Ega23 ©   (04.12.07 13:27)

А если там кроме эдитов еще полно всего?

ИМХО лучше хранить число созданный, да и ссылки на созданные тоже можно хранить. Зачем убивать 5 и потом создавать 6?

Да,
>    ed:=TEdit.Create(Self);
>    (ed as TEdit).Name:='Edit'+IntToStr(i);
>    (ed as TEdit).Parent:=PageControl1.Pages[0];
>    (ed as TEdit).Enabled:=True;

Они у тебя друг на друге будут?


Ega23   (2007-12-04 13:27:00) [26]

procedure ClearTabSheet(ts : TTabSheet);
var
 i : Integer;
begin
 for i:=ts.ControlCount-1 downto 0 do
   ts.controls[i].Free;
end;


Ну и создавать:
ed:=TEdit.Create(PageControl1.Pages[0]);

(ed as TEdit) - это лишнее. просто ed.Name ....

Application.ProcessMessages; - это тоже лишнее.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо