Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Access Violation в конце процедуры.

247
23 декабря 2011 года
wanja
1.2K / / 03.02.2003
В конце этой процедуры происходит Access Violation. Может, потому что в ней удаляется вызывающий ее объект? И как с этим бороться?
Код:
procedure TForm1.DelButtonClick(Sender: TObject);
var i,n,nn:integer;
    TempBox:TListBox;
    TempName:TEdit;
    TempNLab:TLabel;
    TempPB:TBitBtn;
    TempMB:TBitBtn;
    TempCB:TBitBtn;
    TempDB:TBitBtn;
begin
n:=TBitBtn(Sender).Tag;
TempBox:=Fboxes[n];
TempName:=Names[n];
TempNLab:=NLabs[n];
TempPB:=PlusButtons[n];
TempMB:=MinusButtons[n];
TempCB:=CleanButtons[n];
TempDB:=DelButtons[n];

nn:=Length(FBoxes);
for i:=n+1 to nn-1 do
    begin
    FBoxes.Left:=FBoxes[i-1].Left;
    FBoxes[i-1]:=FBoxes;
    FBoxes[i-1].Tag:=i-1;
    Names.Left:=Names[i-1].Left;
    Names[i-1]:=Names;
    Names[i-1].Tag:=i-1;
    NLabs.Left:=NLabs[i-1].Left;
    NLabs[i-1]:=NLabs;
    NLabs[i-1].Tag:=i-1;
    PlusButtons.Left:=PlusButtons[i-1].Left;
    PlusButtons[i-1]:=PlusButtons;
    PlusButtons[i-1].Tag:=i-1;    
    MinusButtons.Left:=MinusButtons[i-1].Left;
    MinusButtons[i-1]:=MinusButtons;
    MinusButtons[i-1].Tag:=i-1;
    CleanButtons.Left:=CleanButtons[i-1].Left;
    CleanButtons[i-1]:=CleanButtons;
    CleanButtons[i-1].Tag:=i-1;
    DelButtons.Left:=DelButtons[i-1].Left;
    DelButtons[i-1]:=DelButtons;
    DelButtons[i-1].Tag:=i-1;                        
    end;

TempBox.Free;
TempName.Free;
TempNLab.Free;
TempPB.Free;
TempMB.Free;
TempCB.Free;
TempDB.Free;

SetLength(FBoxes,nn-1);
SetLength(Names,nn-1);
SetLength(NLabs,nn-1);
SetLength(PlusButtons,nn-1);
SetLength(MinusButtons,nn-1);
SetLength(CleanButtons,nn-1);
SetLength(DelButtons,nn-1);
end;
14
23 декабря 2011 года
Phodopus
3.3K / / 19.06.2008
В конце - это на end; ?
И можно в общих чертах как это выглядит все хоть...
247
24 декабря 2011 года
wanja
1.2K / / 03.02.2003
"В конце" - это когда доходишь до end;
Создаются динамические объекты, в том числе кнопки удаления, добавляются в массивы.
14
24 декабря 2011 года
Phodopus
3.3K / / 19.06.2008
Тогда и правда похоже на удаление внутри ивент-хендлера. Лучше пропробовать именно субъект события не удалять и, если так все работает, применить одно из 2-х:
1. PostMessage для удаления компонента. Можно сделать несколько аналогично TFrom.Release (если не путаю в названии метода)
2. Пересмотреть архитектуру. Пусть будет, положим, менеджер наборов, который их и удаляет. (я голосую за это).
247
26 декабря 2011 года
wanja
1.2K / / 03.02.2003
PostMessage помогло!
14
26 декабря 2011 года
Phodopus
3.3K / / 19.06.2008
конечно помогло. ибо очередь сила. но и тормоз прогресса. :)

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог