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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2007, 20:47   #1
095
Пользователь
 
Регистрация: 03.10.2007
Сообщений: 19
Печаль Удаление динамических объектов / полная очистка формы

Уважаемые, подскажите:
На форме динамически создаются несколько десятков объектов : кнопки, чекбоксы, мемы всякие и проч
Как этот весь хлам динамически удалить сразу с формы весь одной кнопой??
095 вне форума Ответить с цитированием
Старый 03.10.2007, 23:48   #2
MikelNight
 
Аватар для MikelNight
 
Регистрация: 29.09.2007
Сообщений: 4
По умолчанию

Для этого достаточно следующей процедуры:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
i, repeat_yes: integer;
begin

repeat_yes:=1;
while repeat_yes=1 do
begin
repeat_yes:=0;
  for i:=0 to Form1.ComponentCount-1 do
  //пересматриваем все компоненты Form1
  //обращаю внимание, что компоненты принадлежат форме.
  //при создании компонента что-то вродеL:=TLabel.Create(Form1);
  begin
    if (form1.Components[i].GetParentComponent=Panel1) then
    //если родителем компонента является панель
    {
    if (form1.Components[i].GetParentComponent=Form1) then
    //если родителем компонента является сама форма
    }
      begin
           if (Form1.Components[i].ClassType=TEdit) or
           (Form1.Components[i].ClassType=TLabel) or
           (Form1.Components[i].ClassType=TButton) or
           (Form1.Components[i].ClassType=TMemo) or
           (Form1.Components[i].ClassType=TPanel) or
           (Form1.Components[i].ClassType=TCheckBox) or
           (Form1.Components[i].ClassType=TRadioButton) then
             begin
             form1.Components[i].Free;
             repeat_yes:=1;
             //если компонента на форме больше нет, то
             //индексы будут перенумерованы. Завершаем текущий цикл
             //и повторяем заново.
             break;
             end;
      end;
  end;
end;

end;




Если интересно, то:


Процедура динамического создания компонентов и как
к обращаться к конкретному компоненту.

Код:
procedure TForm1.Button5Click(Sender: TObject);
const k=10;
var
r: TRadioButton;
l: TLabel;
i: integer;
h: array of HWND;
n: array of integer;

{
HWND  0..4294967295

Generic integer types for 32-bit implementations of Delphi  
Type    Range    Format
Integer    -2147483648..2147483647    signed 32-bit
Cardinal    0..4294967295    unsigned 32-bit
Fundamental integer types include Shortint, Smallint, Longint, Int64, Byte, Word, and Longword.

Fundamental integer types  
Type    Range    Format
Shortint    -128..127    signed 8-bit
Smallint    -32768..32767    signed 16-bit
Longint    -2147483648..2147483647    signed 32-bit
Int64    -2^63..2^63-1    signed 64-bit
Byte    0..255    unsigned 8-bit
Word    0..65535    unsigned 16-bit
Longword    0..4294967295    unsigned 32-bit
}

begin

for i:=1 to k do
begin

r:=TRadioButton.Create(Panel1); //*
r.Caption:='My_RadioButton'+inttostr(i);
r.Top:=10+i*30;
r.Left:=20;
//r.Visible:=true;
//r.Visible:=false;
r.Parent:=Panel1;
SetLength(h, i);
h[i-1]:=r.Handle;
//WinAPI и Handle - очень полезные и нужные вещи.

l:=TLabel.Create(Form1); //*
l.Caption:='My_Label'+inttostr(i);
l.Top:=10+i*30;
l.Left:=150;
//r.Visible:=true;
//r.Visible:=false;
l.Parent:=Panel1;

l.Name:='Label'+inttostr(label_id);

SetLength(n, i);
n[i-1]:=label_id;

label_id:=label_id+1;

end;

{
*
Если при динамическом создании компонента указать не Form1,
а Panel1, например, то процедура очищения на RadioButton не будет работать,
поскольку мы просматриваем все компоненты Form1.Components[i]
}



(FindControl(h[4]) as TRadioButton).caption:='123';
//таким способом можно обратиться только к Control
//к такому компоненту как Label обратиться нельзя - у него нет Handle.

//Для меток мы будем обращаться к конкретной метке через Name
(FindComponent('Label'+inttostr(n[4])) as TLabel).Caption:='456';

end;



Глобальная переменная
Код:
var label_id: integer;

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
label_id:=100;
//при создании формы сразу присваиваем.
//Имя любого компонента должно быть уникальным
//и не повторяться, даже если компонент удален.
end;

Последний раз редактировалось artemavd; 08.12.2014 в 04:49.
MikelNight вне форума Ответить с цитированием
Старый 04.10.2007, 21:27   #3
095
Пользователь
 
Регистрация: 03.10.2007
Сообщений: 19
По умолчанию

Слишком заумно, но спасибы сёрано = )))

Резюме простое :

for n := 0 to MainFRM.ComponentCount -1 do
MainFRM.Components[n].Free;

тоесть компонент ищется по тэгам ..
095 вне форума Ответить с цитированием
Старый 23.04.2012, 16:09   #4
Asd54
Новичок
Джуниор
 
Регистрация: 23.04.2012
Сообщений: 2
По умолчанию

procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.DestroyComponents;
end;
Asd54 вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление формы Veiron Общие вопросы Delphi 6 26.05.2012 14:53
Как работать с файлами с помощью динамических массивов Герыч Общие вопросы Delphi 4 10.01.2008 12:22
Создание и использование динамических структур Oksana11 Помощь студентам 5 09.01.2008 19:39
Очистка dbf. Ferro БД в Delphi 8 12.11.2007 17:27
Полная очистка директории с нюансами... Kerk Общие вопросы Delphi 9 13.07.2007 15:49