![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
динамическое создание/удаление компонент [D7, XP]
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; - это тоже лишнее.