Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2011, 22:25   #1
Jantar
Пользователь
 
Аватар для Jantar
 
Регистрация: 19.02.2009
Сообщений: 63
По умолчанию Добавление "пакета" компонентов

Всем доброго времени суток!

У меня возникла проблемка. На форме есть четыре компонента: Combobox1, Combobox2 и Edit1 и кнопка

Скажите пожалуйста, как программно сделать, чтобы при нажатии на кнопку ниже появился (добавился) еще один пакет из двух Combobox и Edit. И так до бесконечности: при нажатии снова добавился еще один пакет ниже второго... Надеюсь, понятно объяснил
Jantar вне форума Ответить с цитированием
Старый 24.03.2011, 22:46   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Читай про создание компонентов в Run-time
Человек_Борща вне форума Ответить с цитированием
Старый 24.03.2011, 22:53   #3
Jantar
Пользователь
 
Аватар для Jantar
 
Регистрация: 19.02.2009
Сообщений: 63
По умолчанию

Спасибо. Почитал. Для Edit все понятно. А вот как Combo вставить?
Jantar вне форума Ответить с цитированием
Старый 24.03.2011, 22:55   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Точно так же как и с EDit и с любым другим компонентом.
Человек_Борща вне форума Ответить с цитированием
Старый 24.03.2011, 23:10   #5
Jantar
Пользователь
 
Аватар для Jantar
 
Регистрация: 19.02.2009
Сообщений: 63
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var Combobox1: TCombobox;
begin
Combobox1 := tCombobox.Create(form1);
Combobox1.Parent := form1;
Combobox1.Left:=10;
Combobox1.Top := 30 * offset;
Combobox1.Visible := true;
end;
Получилось. Но если добавлять Комбо и последующие Edit - ы, то они убивают ранее созданные компоненты, то есть один последний только создается. И как сделать,чтобы добавлялось Combobox новое уже с тем же списком, что и Combobox1? А то у меня пустой добавляется. Спасибо за ответы заранее
Jantar вне форума Ответить с цитированием
Старый 24.03.2011, 23:26   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

эмм просто присвайваете итемы основного(настроящего) combobox'аа своему созданному в run-time.

Код:
//Созданному в runtime cb2 присвайваем элементы списка "настоящего" cb1
ComboBox2.Items:=ComboBox1.Items;
Человек_Борща вне форума Ответить с цитированием
Старый 24.03.2011, 23:30   #7
Jantar
Пользователь
 
Аватар для Jantar
 
Регистрация: 19.02.2009
Сообщений: 63
По умолчанию

Ой, точно. Во я балбес Получилось. А что скажете про исчезновение всех компонентов и остатка последнего?
Jantar вне форума Ответить с цитированием
Старый 24.03.2011, 23:58   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Может они есть, но под "новосозданными"?

По пробуйте завести себе массив который будите контролировать..
Человек_Борща вне форума Ответить с цитированием
Старый 25.03.2011, 00:04   #9
Jantar
Пользователь
 
Аватар для Jantar
 
Регистрация: 19.02.2009
Сообщений: 63
По умолчанию

Так. Разобрался. И последний вопросик, если несложно. Как при нажатии на вторую кнопку (например "Очистить" ) оставался только главный "пакет"? А все добавленное - исчезло
Jantar вне форума Ответить с цитированием
Старый 25.03.2011, 01:02   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Ну тут много решений, я бв использовал динам.массив.
Но вот и второй вариант:
Всё что нужно это глобальная переменная и манипуляция с именами rt компонент.

Код:
var
  rtc:integer = -1;
{Где-то там глобальная переменная}

var Cb: TCombobox;
begin
Cb := TCombobox.Create(form1);
Cb.Parent := form1;
Cb.Left:=10;
Cb.Top := 30 * offset;
i:=i+1; //-1+1 = 0 RT_cb0
Cb.Name:='RT_Cb'+i;
Cb.Visible := true;
end;
//Но можно использовать и замечательное свойство TAG вместо NAME

Ну теперь компоненты имеют имена и их кол-во хранится в rtc .
Теперь об очищении:
Всё что надо это пройтись по именам компонент..
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, i1: integer;
//d - это какраз таки наш счётчик rt компонент.. 
  d: Integer;
begin
  d := 4;
  for i := 0 to Form1.ComponentCount -1 do
  begin
//если текущий компонент класса TCombobox
    if Form1.Components[i].ClassType = TComboBox then
    begin
    //От низов до верха
      for d:=4 downto 1 do
      begin 
      //Если есть копонент с именем и цифрой из цикла то 
        if ((Form1.Components[i] as TComboBox).Name = 'RT_Cb' + IntToStr(d)) then
        begin
        //Вешаем , что хотим делаем!
          (Form1.Components[i] as TComboBox).Text := 'Найден!';
        end;
      end;
    end;
  end;
end;
Ну как-то так


если берёте второй способ, то почитайте про реализацию стёка в delphi т.к. всё зависит от имён компонент и значений rtc.

т.е. при удалении компонента 4 из списка(7 элементов), останется 123567 компоненты а rtc будет равно 123456 , и нужно заного переименовать все run-time компоненты. Ну возможно я уже чуток преувеличиваю и перебарщиваю.. пака нужно задумать на сабже темы=)

Последний раз редактировалось Человек_Борща; 25.03.2011 в 01:09.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как на щет "ломаных" компонентов к Visual Studio и вообще ПО..? Premium Свободное общение 6 07.10.2010 22:10
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Добавление компонентов в "мой компьютер" Oleg-vp Общие вопросы Delphi 1 20.11.2007 15:40