Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.05.2009, 11:14
Ksully Ksully вне форума
Прохожий
 
Регистрация: 17.04.2009
Сообщения: 23
Репутация: 10
По умолчанию Удалить динамически созданые объекты

Подскажите пожалуйста.....
При выборе в комбобоксе элемента1 на форме должно создаться 2 едита, а при выборе элемента2 должно создаться 2 комбобокса.
Создание их я сделала, а как их удалить, при выборе элемента2
Ответить с цитированием
  #2  
Старый 16.05.2009, 11:21
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Метод Free обычно для этого используется.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 16.05.2009, 12:34
Ksully Ksully вне форума
Прохожий
 
Регистрация: 17.04.2009
Сообщения: 23
Репутация: 10
По умолчанию

Я пробовала, у меня либо ошибку выдает, либо че попало делает

Не подскажите куда в этом коде его поставить....
Код:
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  
Старый 16.05.2009, 13:39
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Вообще, мне кажется, вместо динамического создания здесь можно менять свойство 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;
Объекты Label1 и Label2 я поставила на форму статически at design time. Ибо смысла создавать всякий раз одни и те же абсолютно одинаковые компоненты я не вижу.
Ответить с цитированием
  #5  
Старый 16.05.2009, 13:39
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Оригинально. Вы же в контексте проседуры создаете объекты и по выходе из нее они автоматом уничтожаются. Смысл их создания сводится к 0.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 16.05.2009, 13:44
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Страдалецъ, это вы мне? o_O
Ответить с цитированием
  #7  
Старый 16.05.2009, 13:59
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Цитата:
Сообщение от Nyctos Kasignete
Страдалецъ, это вы мне? o_O
Нет, это мы синхронно ответили.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #8  
Старый 16.05.2009, 14:04
Ksully Ksully вне форума
Прохожий
 
Регистрация: 17.04.2009
Сообщения: 23
Репутация: 10
По умолчанию

Спасибо Nyctos Kasignete, все работает))))
А как мне к этим компонентам потом обращаться, если с ними действия проходят в другом юните.....
Ответить с цитированием
  #9  
Старый 16.05.2009, 14:11
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Ну, мы же присвоили имя этим компонентам:
Цитата:
Код:
ComboBox3.Name := 'ComboBox3'; // присваиваем имя, чтобы найти потом

Теперь они полноценные объекты формы (хоть и созданные динамически). Так что можно обращаться как обычно.
Код:
{ Тут ошибка была. Исправлено }

А, нет, прошу прощения, так не откомпилируется.
Можно так:
Код:
TComboBox(Form6.FindComponent('ComboBox3')).ItemIndex := 2;

Последний раз редактировалось Nyctos Kasignete, 16.05.2009 в 14:22.
Ответить с цитированием
  #10  
Старый 16.05.2009, 14:52
Ksully Ksully вне форума
Прохожий
 
Регистрация: 17.04.2009
Сообщения: 23
Репутация: 10
По умолчанию

А если такая ситуация:
Код:
Npol:=StrToFloat(ComboBox4.Text );
Запускается, но при выборе выдает ошибку....
Ответить с цитированием
  #11  
Старый 16.05.2009, 15:05
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Так можно обращаться только в пределах процедуры TForm6.ComboBox1Change, да и то лишь будучи в уверенности, что ComboBox4 предварительно создан с помощью конструктора. В любом месте вне этой процедуры лучше всего действовать так:
Код:
if Form6.FindComponent('ComboBox4') <> nil then
  Npol:=StrToFloat(TComboBox(Form6.FindComponent('ComboBox4')).Text);
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:49.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025