![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Abstract Error
2Wish © (2006-01-18 18:38:00)
for i:= ControlCount - 1 downto 0 do
if controls[i] is TImage then
if (controls[i] as TImage).tag <> 0 then
begin
if (Controls[i] as TImage).Left = m.Left then
if (Controls[i] as TImage).Top = m.Top + 64 then (controls[i] as TImage).Free;
if (Controls[i] as TImage).Left = m.Left then
if (Controls[i] as TImage).Top = m.Top - 64 then (controls[i] as TImage).Free;
if (Controls[i] as TImage).Left = m.Left - 64 then
if (Controls[i] as TImage).Top = m.Top then (controls[i] as TImage).Free;
if (Controls[i] as TImage).Left = m.Left + 64 then
if (Controls[i] as TImage).Top = m.Top then (controls[i] as TImage).Free;
end;
Здаствуйте, подскажите пожалуйста, что мне делать, это мой код, свою работу он выполнает, но почему-то вызывает Abstarct Error. У меня собственно два вопроса:
1. Что значит этот Abstarct Error? (В хелпе к Delphi ничего про него нет.)
2. Как от него избавится?
StriderMan (2006-02-13 18:08:00) [1]
> правильно сделать так
> i:=COntrols.Count-1;
> while (i > 0) do begin
>.....
> inc(i);
Этот цикл будет крутиться бесконечно! i увеличивается.
TUser (2006-01-19 07:32:00) [2]
> Гаврила © (18.01.06 20:30) [9]
+ все-таки for на while
Германн (2006-01-19 01:34:00) [3]Понятия не имею причём тут AbstractError, но лично меня крайне смущает то, что во-первых:
> m:=(Sender as TImage);
, а во-вторых:
> m.free;
> end;
>
> Почему строчка m.free; вызывает Abstract Error???
Имхо, "на лице" попытка уничтожить объект из его собственного обработчика.
:(
Verg (2006-01-19 00:38:00) [4]
> Выберает эту переменную М сам юзер, так что получаем её
> вот таким образом m:=(Sender as TImage);
Что мешает "юзеру выбрать переменную M" дважды?
2Wish (2006-01-18 23:34:00) [5]Нет, он не пустой и содержит именно тот объект который нужен, вся процедура работает зачетально, но ошибка вылазит все равно. Выберает эту переменную М сам юзер, так что получаем её вот таким образом
m:=(Sender as TImage);
Verg (2006-01-18 23:10:00) [6]
> Почему строчка m.free; вызывает Abstract Error???
Варинтов тьма.
Например:
Потому, что к этому моменту m содержит "мусор", уже уничтоженный объект.
Где в коде m := ***.Create ?
Когда тя спрашивают "кто такой m", кроме всего имеется ввиду еще и "откуда он взялся, этот m?"
EvS (2006-01-18 23:07:00) [7]private
m: TImage;
...
m.free;
Ты процедуре компонент создаешь что-ли?
Если нет зачем .free?
2Wish (2006-01-18 23:00:00) [8]
m:=(Sender as TImage);
Плохиш (2006-01-18 22:59:00) [9]
> Почему строчка m.free; вызывает Abstract Error???
Можно увидеть как "m" создаётся? Надоело клещами всё вытягивать.
2Wish (2006-01-18 22:46:00) [10]2Плохиш
"что это что это за фигня такая "m"" не имеет принципиального значения, хоть какие нить кнопка, хоть название формы.
На один пост выше написанно, "что это что это за фигня такая "m"". Если тебе влом пречитать посты выше, но очень хочется обосрать кого нить - думаю ты выбрал не тот форум.
зы. Вопрос остаётся открытым, выкладываю полный код процедуры:
private
m: TImage;
...
vari:integer
begin
fori:= ControlCount - 1 downto0 do
ifcontrols[i] isTImage then
if(controls[i] asTImage).tag <> 0 then
begin
if(Controls[i] asTImage).Left = m.Left then
if(Controls[i] asTImage).Top = m.Top + 64 then(controls[i] asTImage).Free;
if(Controls[i] asTImage).Left = m.Left then
if(Controls[i] asTImage).Top = m.Top - 64 then(controls[i] asTImage).Free;
if(Controls[i] asTImage).Left = m.Left - 64 then
if(Controls[i] asTImage).Top = m.Top then (controls[i] asTImage).Free;
if(Controls[i] asTImage).Left = m.Left + 64 then
if(Controls[i] asTImage).Top = m.Top then(controls[i] asTImage).Free;
end;
m.free;
end;
Почему строчкаm.free;вызывает Abstract Error???
Плохиш (2006-01-18 21:11:00) [11]
> 2Wish (18.01.06 20:37) [10]
Долго смотрел на код, так и не понял, что это за фигня такая "m". Да и по фиг мне, если кто-то отладчиком пользоваться не умеет, то это сугубо его личная проблема. А гадать какое ещё дерьмо из кода здесь не приведено совершенно не интересно.
2Wish (2006-01-18 20:37:00) [12]повторяю: "оказалось абстрактная ошибка произходит в самом конце процедуры, после всех операторов, причем ошибка возникает только если в конце кода стоит m.free;, когда я создавал топиг я не придал значения этому оператору и даже не скопировал его. :( тогда новый вопрос: почему освобождение из памяти переменной M: TImage может вызывать абстракную ошибку." В верхнем коде ничего менять не надо.
Гаврила (2006-01-18 20:30:00) [13]В первоначальном варианте везде замени
then (controls[i] as TImage).Free;
на
then
begin
controls[i].Free;
Continue;
end;
TUser (2006-01-18 20:16:00) [14]inc (i) я там зря написал
2Wish (2006-01-18 20:11:00) [15]"не заходит" это очепятка, имелось ввиду не находит.
поставил в коде операторы Showmessage и начал следить за происходящим:
оказалось абстрактная ошибка произходит в самом конце процедуры, после всех операторов, причем ошибка возникает только если в конце кода стоитm.free;, когда я создавал топиг я не придал значения этому оператору и даже не скопировал его. :( тогда новый вопрос: почему освобождение из памяти переменной M: TImage может вызывать абстракную ошибку.
begin...end (2006-01-18 19:40:00) [16]> 2Wish (18.01.06 19:34) [5]
> Этого я не знаю, отладчик не заходит - просто Abstarct Error.
Как это -- "не заходит"? Поставьте контрольную точку, пошагово выполняйте до появления исключения.
Мне, например, не совсем ясно, как этот код может вызвать EAbstractError.
2Wish (2006-01-18 19:34:00) [17]Этого я не знаю, отладчик не заходит - просто Abstarct Error. Наверно когда он первый раз обращается к Image'у, то есть вот тут:
if (Controls[i] as TImage).Left = m.Left then
begin...end (2006-01-18 19:18:00) [18]> 2Wish (18.01.06 18:38)
> это мой код, свою работу он выполнает, но почему-то вызывает
> Abstarct Error.
В каком месте?
2Wish (2006-01-18 19:12:00) [19]2TUser
За разъяснее спасибо, но вот код жалко не работает, программа зависает =(
TUser (2006-01-18 18:50:00) [20]
> Что значит этот Abstarct Error?
Вызов абстрактного метода.
Твой код будет делать следующее - как только первый раз вызовется Free имедж будет удален из списка контролов и контрол i - это бцудет уже другой контрол. А ты обратишся уже к нему, как к TImage. Точнее, as сначала проверит, а потом уже обратится.
правильно сделать так
i:=COntrols.Count-1;
while (i > 0) do begin
Image:=TImage(Constrols[i]);
// теперь можно работать с интересующим тебя контролом
if Image.Left = ... then
if Image.Top = ... then begin
Image.Free;
inc (i);
Continue;
end;
....
dec (i);
end;