Конференция "Начинающим" » Удаление компонентов в Run-Time [D7, WinXP]
 
  • NewGuest (18.02.10 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 © (18.02.10 16:50) [1]
    Внимание! Здесь обсуждаются вопросы, связанные с разработкой компонентов, редакторов свойств, редакторов компонентов и экспертов IDE.
    Вопросы по поиску и использованию готовых компонентов, редакторов или экспертов являются нарушением тематики и могут быть удалены.
  • DimaBr © (18.02.10 16:52) [2]
    Нельзя удалять компонент из его же события
  • Игорь Шевченко © (18.02.10 17:07) [3]
  • NewGuest (18.02.10 17:45) [4]
    Спасибо, помолго!
  • Ega23 © (18.02.10 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)
 
Конференция "Начинающим" » Удаление компонентов в Run-Time [D7, WinXP]
Есть новые Нет новых   [134467   +7][b:0][p:0.002]