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

Ваш аккаунт

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

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

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

ошибка в TSpeedButton.OnClick

15K
10 ноября 2006 года
zyablik
14 / / 29.06.2006
одна переменная integer
 
Код:
var r:integer;
begin
r:=Rind[Length(Rind)-1].Tind;
SetLength(Rind,Length(Rind)+1);
Rind[Length(Rind)-1].Tind:=Rasd[r][TButton(Sender).Tag].Ext;
Rind[Length(Rind)-1].TCapt:=Rasd[r][TButton(Sender).Tag].Caption;
Form1.Caption:=Rasd[r][TButton(Sender).Tag].Caption;
Rset();
end;

после еnd вилетает окно "Access violation...." но програма выполняется дальше нормально.

тожесамое в TButton.OnClick работает без ошибок. в чем тут дело?
547
10 ноября 2006 года
Hydra
488 / / 20.06.2006
Скорее всего что-то с индексами массивов.
309
10 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
Ответ лежит в простой фразе:
Цитата:
тожесамое в TButton.OnClick работает без ошибок.


А знаете почему?
А потому что объект, на который ссылается Sender, имеет тип TSpeedButton, а его пытаются привести к ссылке на совершенно другой тип TButton :D
Ну и классическая алгоритмическая ошибка: использование в коде класса внешнего имени объекта (Forml) вместо "указателя на самого себя" (Self) :D
А вообще, троекратное приведение - очень не хорошо, лучше создать временный объект

 
Код:
var TSpeedButton lSender; // копия ссылки с переопределённым типом
begin
lSender := (Sender as TSpeedButton);
// дальше используем уже lSender
end;

Точно также, лучше выделить отдельную переменную для четырёхкратно определяемой длины массива.
Других косяков я в коде не наблюдаю.
15K
10 ноября 2006 года
zyablik
14 / / 29.06.2006
изменил все как посоветовали - не помогло. тот же глюк. проверяю пока масивы. глюк как-то спонтанно появляеться.
3.2K
10 ноября 2006 года
Sania
186 / / 28.10.2006
Глюк может содержаться и в самом обьекте.
У меня был глюк с TValueListEditor, вылетал access на clear, долбался долго, снес обьект, стала вылетать на другой TValueListEditor.
Пришлось обходится без clear.
15K
10 ноября 2006 года
zyablik
14 / / 29.06.2006
Нашел причину: по идее в окошке около каждой кнопки ставиться текст (в TLabel) так вот если текст не задавать ошибка не происходит. Можно ли убрать влияние текста на работу кнопок?

Ошибка всегда в одном и том же месте TSpeedButton.UpdateTracking
вот кусок проги где все назаначается

Код:
var i,h,s:integer;
btn:TSpeedButton;
lb:TLabel;
const l=5;

for i:=ScrollBox1.ComponentCount-1 downto 0 do
ScrollBox1.Components.Free;

h:=5;
s:=ss;

for i:=0 to Length(Section)-1 do begin
btn:=TSpeedButton.Create(ScrollBox1);
btn.Top:=h;
btn.Left:=l;
ScrollBox1.InsertControl(btn);
if Section.Ext>0 then btn.OnClick:=btncl2
else btn.OnClick:=btncl1;
btn.Tag:=i;
lb:=TLabel.Create(ScrollBox1);
lb.Top:=h;
lb.Left:=l+5;
lb.Caption:=Section.Caption;
ScrollBox1.InsertControl(lb);
h:=h+25
end;
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог