![]() |
|
|
Регистрация | << Правила форума >> | 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); |