Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Удаление компонентов в Run-Time   Найти похожие ветки 

 
NewGuest   (2010-02-18 15:18) [0]

Столкнулся с проблемой: динамически создаю компоненты на панели, по клику на кнопке предположим панель нужно очищать (удалять кнопки), однако иногда при очищении вылетает "Abstract Error" (при выходе из процедуры обрабатывающей клик на кнопке).

Код:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls;

type
 TForm1 = class(TForm)
   Panel1: TPanel;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   procedure BClick(Sender: TObject);

   procedure CreateButton(tg,k: integer);
 end;

var
 Form1: TForm1;
 btn_mas: array [1..25] of string;

implementation

{$R *.dfm}

procedure TForm1.CreateButton(tg,k: integer);
var
t: TButton;
begin
t:=Tbutton.Create(Self);
t.Left:=k;
t.Top:=8;
t.Caption:=btn_mas[tg];
t.Visible:=true;
t.Parent:=Panel1;
t.OnClick:=BClick;
t.Tag:=tg;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
t: TButton;
i,k: integer;
begin
k:=16;

for i:=1 to high(btn_mas) do
 btn_mas[i]:="index-"+IntToStr(i);

for i:=1 to 2{high(btn_mas)} do
 begin
  CreateButton(i,k);

  k:=k+75+6;
 end;
end;

procedure TForm1.BClick(Sender: TObject);
begin
while Panel1.ControlCount>0 do
 begin
  if Panel1.Controls[0] is TButton
  then Panel1.Controls[0].Free;
 end;
end;

end.


Т.е иногда ошибка вылетает (например при наатии на первую), а ингода нет.
Подскажите, в чем ошибка?


 
DimaBr ©   (2010-02-18 16:50) [1]

Внимание! Здесь обсуждаются вопросы, связанные с разработкой компонентов, редакторов свойств, редакторов компонентов и экспертов IDE.
Вопросы по поиску и использованию готовых компонентов, редакторов или экспертов являются нарушением тематики и могут быть удалены.


 
DimaBr ©   (2010-02-18 16:52) [2]

Нельзя удалять компонент из его же события


 
Игорь Шевченко ©   (2010-02-18 17:07) [3]

http://delphimaster.net/view/1-1266238962/


 
NewGuest   (2010-02-18 17:45) [4]

Спасибо, помолго!


 
Ega23 ©   (2010-02-18 22:34) [5]

while Panel1.ControlCount>0 do
begin
 if Panel1.Controls[0] is TButton
 then Panel1.Controls[0].Free;
end;


Не надо так делать. Удаляй с конца:
for i := List.Count - 1 downto 0 do
 List[i].Free;


Почему нельзя? А ты создай список на 100.000 кнопок. И удали его и так и так, с выключенной оптимизацией.
А потом посмотри в VCL, как ведёт себя TList.Delete(Index)



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.111 c
4-1235851954
Тыщ
2009-02-28 23:12
2010.08.27
Запустил раз — включилось, запустил второй — выключилось


2-1268143587
DROWSY
2010-03-09 17:06
2010.08.27
Font TMenu.


2-1272244377
Ваше имя
2010-04-26 05:12
2010.08.27
Нужен максимально быстрый и оптимизированый код чт/записи в файл


2-1270922444
Evgeney
2010-04-10 22:00
2010.08.27
Процедура для открытия Child форм


15-1273573286
Дмитрий Белькевич
2010-05-11 14:21
2010.08.27
Возможно ли доступиться из JavaScript к OLE интерфейсам?