Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1139506703
Volf_555
2006-02-09 20:38
2006.03.05
Где достать фотографию листа в клетку? СРОЧНО!


8-1127190665
wizarden
2005-09-20 08:31
2006.03.05
Как масштабировать используя GPU?


3-1137025928
Kromwerk
2006-01-12 03:32
2006.03.05
Преобразование времени


10-1114329246
w_h_i_t_e
2005-04-24 11:54
2006.03.05
Сервер и клиент, передача файла.


15-1139761406
тихий вовочка
2006-02-12 19:23
2006.03.05
Ищу совет по поздравлению





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский