![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка при удалении контролов
Германн © (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;