Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка при удалении контролов


Страницы:   1 2

Германн ©   (2011-06-23 02:52:00) 

Вот впервые в моей практике "стабильно" получаю AV в "стабильной" строке кода "стабильно в некотором моменте рантайма" и не могу понять причину.
Строка кода где случается сей AV такова:
 for i:=sPanel1.ControlCount-1 downto 0 do sPanel1.Controls[i].Free;
Сообщение об ошибке такое: Access violation at address 005E6EA3 in module 'ХХХ.exe'. Read of address 00000024

Суть кода - удалить все имеющиеся контролы на панели, чтобы пользователь мог создать другие.
Продолжение задачи http://www.delphimaster.ru/cgi-bin/forum.pl?id=1308354496&n=18


sniknik   (2011-06-23 11:13:00) [21]

> А у меня стабильная ошибка. Перед тем как написать специально несколько раз проверил....
> Delphi 7
sniknik ©   (23.06.11 10:44) [11]


Ega23   (2011-06-23 11:05:00) [22]

Попробую спецом дома D7 поставить и проверить. Но это только вечером.


Ega23   (2011-06-23 11:04:00) [23]


> (это ж как бы 2 контрола - может в этом проблема?


Не должно быть никакой проблемы.


Alex_C   (2011-06-23 11:00:00) [24]


> Код в студию.


А никакого кода нет :)
Я ж написал - просто на панель в Дельфи набросал кучу разных кампонент. И удалял их по нажатию на кнопку. Все компоненты, кроме TLabeledEdit удалялись без проблем. В реал-тайме я их не создавал.


Alex_C   (2011-06-23 10:58:00) [25]

Причем как я уже написал - только на TLabeledEdit (это ж как бы 2 контрола - может в этом проблема?) Сдается мне что может быть это конкретно проблема 7 Дельфи.


Ega23   (2011-06-23 10:57:00) [26]


> А у меня стабильная ошибка. Перед тем как написать специально
> несколько раз проверил....


Код в студию.


Alex_C   (2011-06-23 10:56:00) [27]

А у меня стабильная ошибка. Перед тем как написать специально несколько раз проверил....
Delphi 7


Ega23   (2011-06-23 10:54:00) [28]


> делаете проект с формой и панелью. На нее поочередности
> наносите элементы и удаляете их. Все будет нормально до
> тех пор, пока на форме не появится TLabeledEdit - при попытке
> его удалить возникнет AV.


unit Unit18;

interface

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

type
 TForm18 = class(TForm)
   Panel1: TPanel;
   Button1: TButton;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form18: TForm18;

implementation

{$R *.dfm}

procedure TForm18.Button1Click(Sender: TObject);
var
 i: Integer;
begin
 for i := Panel1.ComponentCount - 1 downto 0 do
   Panel1.Components[i].Free;

end;

procedure TForm18.FormCreate(Sender: TObject);
begin
 with TLabeledEdit.Create(Panel1) do
 begin
   SetBounds(10, 10, 100, 100);
   Parent := Panel1;
 end;
end;

end.


Никаких AV. ЧЯДНТ?


sniknik   (2011-06-23 10:44:00) [29]

> а в чем именно я ошибся?
значения для for вычисляются 1 раз.

а работает?
with sPanel1 do while ControlCount > 0 do Controls[0].Free;

> Ошибка может быть совсем не в этом
а, например в том, что в деструкторе 100 контрола есть Free/дестрой для 17-го...


Alex_C   (2011-06-23 10:42:00) [30]

Ошибка есть :)
Ошибка в том, какие элементы таким способом удадяешь.
Предлагаю все сделать следующий эксперимент и удивиться:
делаете проект с формой и панелью. На нее поочередности наносите элементы и удаляете их. Все будет нормально до тех пор, пока на форме не появится TLabeledEdit - при попытке его удалить возникнет AV.


Ega23   (2011-06-23 10:33:00) [31]


> а в чем именно я ошибся?

в "во-первых".


KilkennyCat   (2011-06-23 10:08:00) [32]


> Ega23 ©   (23.06.11 08:18) [4]

а в чем именно я ошибся?


RWolf   (2011-06-23 09:52:00) [33]

думается мне, что проблема в смешении сущностей Components[] (те компоненты, за чьё удаление отвечает контейнер при собственном удалении) и Controls[] (контролы, которые он должен показывать внутри собственного окна).
а именно, в том, что в приведённом примере что-то из содержимого удаляется автоматом по два раза.


Anatoly Podgoretsky   (2011-06-23 09:34:00) [34]

Похоже, что sPanel1 равно nil
Восспользуйся отладчиком и посмотри значение.


BoB   (2011-06-23 09:14:00) [35]

Хм..
А у меня и [0] и [1] без проблем.
Контролы : три батона и три лабеля, созданы в дезайнтаме (D7)
Так что (ИМХО)
[4] "Ошибка может быть совсем не в этом."


Ega23   (2011-06-23 08:18:00) [36]


> KilkennyCat ©   (23.06.11 05:18) [3]


Костя, не позорься.


> Строка кода где случается сей AV такова:
>  for i:=sPanel1.ControlCount-1 downto 0 do sPanel1.Controls[i].
> Free;


Controls - это то, для чего Parent. Components - для чего Owner.
Создавай контролы с Owner = Panel, очищай -
for i:= panel.ComponentCount - 1 downto 0 do

НУ и эта... Ошибка может быть совсем не в этом. :) Что CallStack говорит?


KilkennyCat   (2011-06-23 05:18:00) [37]

есть некоторая разница.
во-первых, нет постоянного вычисления sPanel1.ControlCount-1.
во-вторых (но тут я могу ошибаться) ав может возникать из-за того, что sPanel1.ControlCount-1 при очередном вычислении может вернуть индекс объекта, находящегося в процессе удаления, а потом ему еще раз фрии...


Германн   (2011-06-23 04:09:00) [38]


> KilkennyCat ©   (23.06.11 03:42) [1]
>
> а:=sPanel1.ControlCount-1;
> for i:=а downto 0 do sPanel1.Controls[i].Free;

Хм. Именно такой код я и привел в вопросе.
Наскоко я вообще знаю и понимаю Дельфи.


KilkennyCat   (2011-06-23 03:42:00) [39]

а:=sPanel1.ControlCount-1;
for i:=а downto 0 do sPanel1.Controls[i].Free;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо