Форум: "Начинающим";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];
ВнизAbstract Error Найти похожие ветки
← →
2Wish (2006-01-18 18:38) [0]
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. Как от него избавится?
← →
Джо © (2006-01-18 18:45) [1]> 1. Что значит этот Abstarct Error? (В хелпе к Delphi ничего
> про него нет.)
EAbstractError is the exception class for attempts to call an abstract method.
Unit
SysUtils
Description
EAbstractError is raised when an application tries to call an Object Pascal abstract method. It is also raised at design time when a component with an Object Pascal abstract method is placed on a form.
Abstract methods are declared with the abstract directive and must be overridden in descendant classes before an instance object can be created.
(c) Delphi Help.
← →
TUser © (2006-01-18 18:50) [2]
> Что значит этот 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;
← →
2Wish (2006-01-18 19:12) [3]2TUser
За разъяснее спасибо, но вот код жалко не работает, программа зависает =(
← →
begin...end © (2006-01-18 19:18) [4]> 2Wish (18.01.06 18:38)
> это мой код, свою работу он выполнает, но почему-то вызывает
> Abstarct Error.
В каком месте?
← →
2Wish (2006-01-18 19:34) [5]Этого я не знаю, отладчик не заходит - просто Abstarct Error. Наверно когда он первый раз обращается к Image"у, то есть вот тут:
if (Controls[i] as TImage).Left = m.Left then
← →
begin...end © (2006-01-18 19:40) [6]> 2Wish (18.01.06 19:34) [5]
> Этого я не знаю, отладчик не заходит - просто Abstarct Error.
Как это -- "не заходит"? Поставьте контрольную точку, пошагово выполняйте до появления исключения.
Мне, например, не совсем ясно, как этот код может вызвать EAbstractError.
← →
2Wish (2006-01-18 20:11) [7]"не заходит" это очепятка, имелось ввиду не находит.
поставил в коде операторы Showmessage и начал следить за происходящим:
оказалось абстрактная ошибка произходит в самом конце процедуры, после всех операторов, причем ошибка возникает только если в конце кода стоитm.free;
, когда я создавал топиг я не придал значения этому оператору и даже не скопировал его. :( тогда новый вопрос: почему освобождение из памяти переменной M: TImage может вызывать абстракную ошибку.
← →
TUser © (2006-01-18 20:16) [8]inc (i) я там зря написал
← →
Гаврила © (2006-01-18 20:30) [9]В первоначальном варианте везде замени
then (controls[i] as TImage).Free;
наthen
begin
controls[i].Free;
Continue;
end;
← →
2Wish (2006-01-18 20:37) [10]повторяю: "оказалось абстрактная ошибка произходит в самом конце процедуры, после всех операторов, причем ошибка возникает только если в конце кода стоит m.free;, когда я создавал топиг я не придал значения этому оператору и даже не скопировал его. :( тогда новый вопрос: почему освобождение из памяти переменной M: TImage может вызывать абстракную ошибку." В верхнем коде ничего менять не надо.
← →
Плохиш © (2006-01-18 21:11) [11]
> 2Wish (18.01.06 20:37) [10]
Долго смотрел на код, так и не понял, что это за фигня такая "m". Да и по фиг мне, если кто-то отладчиком пользоваться не умеет, то это сугубо его личная проблема. А гадать какое ещё дерьмо из кода здесь не приведено совершенно не интересно.
← →
2Wish (2006-01-18 22:46) [12]2Плохиш
"что это что это за фигня такая "m"" не имеет принципиального значения, хоть какие нить кнопка, хоть название формы.
На один пост выше написанно, "что это что это за фигня такая "m"". Если тебе влом пречитать посты выше, но очень хочется обосрать кого нить - думаю ты выбрал не тот форум.
зы. Вопрос остаётся открытым, выкладываю полный код процедуры:
private
m: TImage;
...
var i:integer
begin
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;
m.free;
end;
Почему строчкаm.free;
вызывает Abstract Error???
← →
Плохиш © (2006-01-18 22:59) [13]
> Почему строчка m.free; вызывает Abstract Error???
Можно увидеть как "m" создаётся? Надоело клещами всё вытягивать.
← →
2Wish (2006-01-18 23:00) [14]
m:=(Sender as TImage);
← →
EvS (2006-01-18 23:07) [15]private
m: TImage;
...
m.free;
Ты процедуре компонент создаешь что-ли?
Если нет зачем .free?
← →
Verg © (2006-01-18 23:10) [16]
> Почему строчка m.free; вызывает Abstract Error???
Варинтов тьма.
Например:
Потому, что к этому моменту m содержит "мусор", уже уничтоженный объект.
Где в коде m := ***.Create ?
Когда тя спрашивают "кто такой m", кроме всего имеется ввиду еще и "откуда он взялся, этот m?"
← →
2Wish (2006-01-18 23:34) [17]Нет, он не пустой и содержит именно тот объект который нужен, вся процедура работает зачетально, но ошибка вылазит все равно. Выберает эту переменную М сам юзер, так что получаем её вот таким образом
m:=(Sender as TImage);
← →
Verg © (2006-01-19 00:38) [18]
> Выберает эту переменную М сам юзер, так что получаем её
> вот таким образом m:=(Sender as TImage);
Что мешает "юзеру выбрать переменную M" дважды?
← →
Германн © (2006-01-19 01:34) [19]Понятия не имею причём тут AbstractError, но лично меня крайне смущает то, что во-первых:
> m:=(Sender as TImage);
, а во-вторых:
> m.free;
> end;
>
> Почему строчка m.free; вызывает Abstract Error???
Имхо, "на лице" попытка уничтожить объект из его собственного обработчика.
:(
← →
TUser © (2006-01-19 07:32) [20]
> Гаврила © (18.01.06 20:30) [9]
+ все-таки for на while
← →
StriderMan © (2006-02-13 18:08) [21]
> правильно сделать так
> i:=COntrols.Count-1;
> while (i > 0) do begin
>.....
> inc(i);
Этот цикл будет крутиться бесконечно! i увеличивается.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.01 c