![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Подскажите пожалуйста.....
При выборе в комбобоксе элемента1 на форме должно создаться 2 едита, а при выборе элемента2 должно создаться 2 комбобокса. Создание их я сделала, а как их удалить, при выборе элемента2 |
|
#2
|
||||
|
||||
|
Метод Free обычно для этого используется.
|
|
#3
|
|||
|
|||
|
Я пробовала, у меня либо ошибку выдает, либо че попало делает
Не подскажите куда в этом коде его поставить.... Код:
procedure TForm6.ComboBox1Change(Sender: TObject);
var
ComboBox3:TComboBox;
ComboBox4:TComboBox;
Label1:Tlabel;
Label2:Tlabel;
Edit1:TEdit;
Edit2:TEdit;
i:integer;
begin
Label1:=Tlabel.create(self);
Label1.Parent:=Form6;
Label1.Left:=304;
Label1.Top:=30;
Label2:=Tlabel.create(self);
Label2.Parent:=Form6;
Label2.Left:=304;
Label2.Top:=70;
ComboBox2.Items.Clear;
if ComboBox1.Text='Пластинчатый' then
begin
ComboBox3:=TComboBox.create(self);
ComboBox3.Parent:=Form6;
ComboBox3.Left:=304;
ComboBox3.Top:=54;
ComboBox4:=TComboBox.create(self);
ComboBox4.Parent:=Form6;
ComboBox4.Left:=304;
ComboBox4.Top:=104;
ComboBox2.Items.Add('ЭГА-1-10-6-4-2');
ComboBox2.Items.Add('ЭГА-1-10-6-6-3');
ComboBox2.Items.Add('ЭГА-20-9-6-2');
ComboBox3.Items.Add('4');
ComboBox3.Items.Add('6');
ComboBox3.Items.Add('8');
ComboBox4.Items.Add('2');
ComboBox4.Items.Add('3');
ComboBox4.Items.Add('4');
Label1.Caption:='Число электродов';
Label2.Caption:='Число электрополей';
end
else
if ComboBox1.Text='Трубчатый' then
begin
Edit1:=TEdit.create(self);
Edit1.Parent:=Form6;
Edit2:=TEdit.create(self);
Edit2.Parent:=Form6;
ComboBox2.Items.Add('С-5');
ComboBox2.Items.Add('ПГ-8');
ComboBox2.Items.Add('ДМ-316');
Label1.Caption:='Длина труб';
Label2.Caption:='Диаметр труб';
end;
end;
end. |
|
#4
|
|||
|
|||
|
Вообще, мне кажется, вместо динамического создания здесь можно менять свойство Visible и не мучиться.
Во-вторых, у вас в этой процедуре объекты TLabel создаются каждый раз одни и те же, поэтому их, я думаю, логичнее тоже создать лишь однажды (design time)... Но если я вас не убедила, то в целом можно переделать ваш код так: Код:
procedure TForm6.ComboBox1Change(Sender: TObject);
var
ComboBox3:TComboBox;
ComboBox4:TComboBox;
Edit1:TEdit;
Edit2:TEdit;
i:integer;
begin
// если компоненты присутствуют — удаляем
Edit1 := TEdit(FindComponent('Edit1'));
Edit2 := TEdit(FindComponent('Edit2'));
ComboBox3 := TComboBox(FindComponent('ComboBox3'));
ComboBox4 := TComboBox(FindComponent('ComboBox4'));
if Edit1 <> nil then Edit1.Free;
if Edit2 <> nil then Edit2.Free;
if ComboBox3 <> nil then ComboBox3.Free;
if ComboBox4 <> nil then ComboBox4.Free;
ComboBox2.Items.Clear;
if ComboBox1.Text='Пластинчатый' then
begin
ComboBox3:=TComboBox.create(self);
ComboBox3.Parent:=Form6;
ComboBox3.Name := 'ComboBox3'; // присваиваем имя, чтобы найти потом
ComboBox3.Left:=304;
ComboBox3.Top:=54;
ComboBox4:=TComboBox.create(self);
ComboBox4.Parent:=Form6;
ComboBox4.Name := 'ComboBox4';
ComboBox4.Left:=304;
ComboBox4.Top:=104;
ComboBox2.Items.Add('ЭГА-1-10-6-4-2');
ComboBox2.Items.Add('ЭГА-1-10-6-6-3');
ComboBox2.Items.Add('ЭГА-20-9-6-2');
ComboBox3.Items.Add('4');
ComboBox3.Items.Add('6');
ComboBox3.Items.Add('8');
ComboBox4.Items.Add('2');
ComboBox4.Items.Add('3');
ComboBox4.Items.Add('4');
Label1.Caption:='Число электродов';
Label2.Caption:='Число электрополей';
end
else
if ComboBox1.Text='Трубчатый' then
begin
Edit1:=TEdit.create(self);
Edit1.Parent:=Form6;
Edit1.Name := 'Edit1';
Edit2:=TEdit.create(self);
Edit2.Parent:=Form6;
Edit2.Name := 'Edit2';
ComboBox2.Items.Add('С-5');
ComboBox2.Items.Add('ПГ-8');
ComboBox2.Items.Add('ДМ-316');
Label1.Caption:='Длина труб';
Label2.Caption:='Диаметр труб';
end;
end; |
|
#5
|
||||
|
||||
|
Оригинально. Вы же в контексте проседуры создаете объекты и по выходе из нее они автоматом уничтожаются. Смысл их создания сводится к 0.
![]() |
|
#6
|
|||
|
|||
|
Страдалецъ, это вы мне? o_O
|
|
#7
|
||||
|
||||
|
Цитата:
![]() |
|
#8
|
|||
|
|||
|
Спасибо Nyctos Kasignete, все работает))))
А как мне к этим компонентам потом обращаться, если с ними действия проходят в другом юните..... |
|
#9
|
|||
|
|||
|
Ну, мы же присвоили имя этим компонентам:
Цитата:
Теперь они полноценные объекты формы (хоть и созданные динамически). Так что можно обращаться как обычно. Код:
{ Тут ошибка была. Исправлено }А, нет, прошу прощения, так не откомпилируется. Можно так: Код:
TComboBox(Form6.FindComponent('ComboBox3')).ItemIndex := 2;Последний раз редактировалось Nyctos Kasignete, 16.05.2009 в 14:22. |
|
#10
|
|||
|
|||
|
А если такая ситуация:
Код:
Npol:=StrToFloat(ComboBox4.Text ); |
|
#11
|
|||
|
|||
|
Так можно обращаться только в пределах процедуры TForm6.ComboBox1Change, да и то лишь будучи в уверенности, что ComboBox4 предварительно создан с помощью конструктора. В любом месте вне этой процедуры лучше всего действовать так:
Код:
if Form6.FindComponent('ComboBox4') <> nil then
Npol:=StrToFloat(TComboBox(Form6.FindComponent('ComboBox4')).Text); |