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;
ошибка в TSpeedButton.OnClick
Код:
после еnd вилетает окно "Access violation...." но програма выполняется дальше нормально.
тожесамое в TButton.OnClick работает без ошибок. в чем тут дело?
Скорее всего что-то с индексами массивов.
Цитата:
тожесамое в TButton.OnClick работает без ошибок.
А знаете почему?
А потому что объект, на который ссылается Sender, имеет тип TSpeedButton, а его пытаются привести к ссылке на совершенно другой тип TButton :D
Ну и классическая алгоритмическая ошибка: использование в коде класса внешнего имени объекта (Forml) вместо "указателя на самого себя" (Self) :D
А вообще, троекратное приведение - очень не хорошо, лучше создать временный объект
Код:
var TSpeedButton lSender; // копия ссылки с переопределённым типом
begin
lSender := (Sender as TSpeedButton);
// дальше используем уже lSender
end;
begin
lSender := (Sender as TSpeedButton);
// дальше используем уже lSender
end;
Точно также, лучше выделить отдельную переменную для четырёхкратно определяемой длины массива.
Других косяков я в коде не наблюдаю.
изменил все как посоветовали - не помогло. тот же глюк. проверяю пока масивы. глюк как-то спонтанно появляеться.
У меня был глюк с TValueListEditor, вылетал access на clear, долбался долго, снес обьект, стала вылетать на другой TValueListEditor.
Пришлось обходится без clear.
Ошибка всегда в одном и том же месте 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;
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;