Ошибка abstract error

← →2Wish   (2006-01-18 18:38) [0]

 
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 увеличивается.


Abstract error что это

kostya04
Дата 18.9.2004, 21:29 (ссылка) | (голосов: ) Загрузка .

bear
Дата 19.9.2004, 06:22 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 28
Регистрация: 15.6.2004

Репутация: нет
Всего: нет

Fedor
Дата 19.9.2004, 08:37 (ссылка) | (нет голосов) Загрузка .

Днепрянин

Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32

[/B], ‘); return false;» title=»Вставить ник в поле ввода»>
Дата 19.9.2004, 10:33 (ссылка) | (нет голосов) Загрузка . ‘, ‘19.9.2004, 10:33’, 217898);»>

Око кары:)

Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64

Illusion Dolphin
Дата 19.9.2004, 11:44 (ссылка) | (нет голосов) Загрузка .

Эксперт

Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63

Цитата
Это сообщение генериться, насколько я знаю, при попытке использовать абстракный метод класса

Если бы только тогда . ПО своему опыту знаю, что эту ошибку получить можно различными путями, и она иногда чем-то схожа по характеру с Acces violation. Morpheus прав — это или ты неправильно где-то с классами работаешь, или что-то с памятью делаешь не очень верное, однозначно тут сказать нельзя, т.к. кода нет. kostya04, так что борись с этой проблемой внимательным анализом всего кода, особенно где создаёшьразрушаештиспользуешь динамически классы и юзаешь память.

Guest
Дата 20.9.2004, 08:50 (ссылка) | (голосов: ) Загрузка .

Rennigth
Дата 20.9.2004, 09:53 (ссылка) | (нет голосов) Загрузка .

Эксперт

Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

Правила форума «Delphi: Общие вопросы»
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »

[ Время генерации скрипта: 0.1034 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Источник

Читайте также:  Prology mpa 700 прошивка

Adblock
detector

Этот java.lang.AbstractMethodError обычно генерируется, когда мы пытаемся вызвать абстрактный метод. Обычно эта ошибка выявляется во время компиляции, если эта ошибка генерируется во время выполнения, класс должен быть несовместим (несовместим с существующими классами). ) Изменено. Но это подкласс ошибки IncompatibleClassChange.

Мы знаем, что абстрактный метод не может быть вызван, и если мы попытаемся это сделать, вы получите ошибку во время компиляции. Так что вы можете подумать, как эта ошибка генерируется во время выполнения ?.

Причина – двоичная несовместимостьчто это значит?

Всякий раз, когда класс изменяется, другие классы, которые ссылаются на этот (измененный) класс, не будут знать об изменениях, сделанных в нем. Поэтому все классы должны быть скомпилированы как единое целое. Если нет, то вы можете столкнуться с одним из подклассов несовместимой ошибки изменения класса.


« Эта ошибка указывает на то, что вызываемый вами метод теперь преобразуется в абстрактный метод».

см. следующий пример, чтобы иметь представление об этой ошибке

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

class B

{

public void display()

{

System.out.println("I am inside B");

}

}

import java.util.*;

public class A extends B

{

public static void main(String args[])

{

A a=new A();

a.display();

}

}

Выход:

1

2

3

4

C:blog>javac A.java

C:blog>java A

I am inside B

Теперь я собираюсь преобразовать метод display () как абстрактный метод и скомпилировать его самостоятельно.

1

2

3

4

abstract class B

{

public abstract void display();

}

Выход:

01

02

03

04

05

06

07

08

09

10

11

C:blog>javac A.java

C:blog>java A

I am inside B

C:blog>javac B.java

C:blog>java A

Exception in thread "main" java.lang.AbstractMethodError: B.display()V

        at A.display(A.java:3)

        at A.main(A.java:8)

Как видите, причина того, что это исключение выдается во время выполнения, состоит в том, что я не скомпилировал классы в целом. Поэтому, когда вы вносите изменения в существующие классы, убедитесь, что вы скомпилировали классы в целом.

Следовательно, не рекомендуется преобразовывать метод в абстрактный метод в классах, которые распространяются. Чаще всего такого рода ошибки возникают, когда вы используете стороннюю библиотеку в своем приложении.

Если эта ошибка не отображается во время компиляции, даже если вы компилируете ее как целый пакет, вам необходимо проверить настройки библиотеки и пути к классам.

Поскольку компилятор обычно ищет классы в системных библиотеках, таких как библиотеки начальной загрузки и библиотеки расширений, также в текущем каталоге, но JVM ищет классы в указанном пути к классам.

Если вы случайно поместили старую версию в системные библиотеки, а новую версию – в путь к классам, вы не будете уведомлены об этой ошибке, даже если вы скомпилируете ее как целый пакет.

Поэтому убедитесь, что настройки, относящиеся к старому пакету, были удалены.


Форум программистов Vingrad

Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> Abstract Error, что это такое и как с ним бороться, как с ним бороться. 

:(

   

Опции темы

kostya04
Дата 18.9.2004, 21:29 (ссылка)
   |    (голосов: 0)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Unregistered

Помогите при закрытия приложения выскакивает Abstract Error, не могу понять почему. И вообще, что такое Abstract Error и как с ним бороться. Может подскажите где по этому вопросу взять литературу. rolleyes.gif

  Вверх
bear
Дата 19.9.2004, 06:22 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 28
Регистрация: 15.6.2004

Репутация: нет
Всего: нет

Посмотрел Делфийский хелп что-то нет такого сообщения об ошибке.

PM MAIL   Вверх
Fedor
Дата 19.9.2004, 08:37 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Днепрянин
****

Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32

Может ты какие-нибудь ручками созданные компоненты не освобождаешь… Или там например базу не закрываешь… В общем, не подчищаешь в памяти следы своей работы…

———————

Мы — Днепряне. Мы всех сильней.

PM ICQ   Вверх
<Spawn>
Дата 19.9.2004, 10:33 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Око кары:)
****

Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64

Это сообщение генериться, насколько я знаю, при попытке использовать абстракный метод класса(с директивой abstract). Так делать нельзя — нужно создать наследника класса и реализовать в нем этот абстрактный метод. Смотри реализацию своих классов.

———————

«Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать» — Николай Безруков.

PM MAIL ICQ   Вверх
Illusion Dolphin
Дата 19.9.2004, 11:44 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
***

Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63

Цитата
Это сообщение генериться, насколько я знаю, при попытке использовать абстракный метод класса

Если бы только тогда sad.gif… ПО своему опыту знаю, что эту ошибку получить можно различными путями, и она иногда чем-то схожа по характеру с Acces violation. Morpheus прав — это или ты неправильно где-то с классами работаешь, или что-то с памятью делаешь не очень верное, однозначно тут сказать нельзя, т.к. кода нет. kostya04, так что борись с этой проблемой внимательным анализом всего кода, особенно где создаёшьразрушаештиспользуешь динамически классы и юзаешь память.

———————

В мире всего две бесконечности: вселенная и человеческая глупость… На счёт вселенной я не уверен.
Шифрование и организация фотографий — Photo Database 4.5

PM MAIL WWW ICQ   Вверх
Guest
Дата 20.9.2004, 08:50 (ссылка)
   |    (голосов: 0)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Unregistered

Сию ошибку можно получить при работе с TStings, TStringList и т.д.

  Вверх
Rennigth
Дата 20.9.2004, 09:53 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
***

Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76

Я такую ошибку получал когда удалял компонент из егоже обработчика , т.е. например на клик label1 ->> label1.free; обойти можно, например удалять в postmessage.

———————

(* Honesta mors turpi vita potior *)

PM MAIL ICQ   Вверх



















Ответ в темуСоздание новой темы
Создание опроса
Правила форума «Delphi: Общие вопросы»
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »

>
Ошибка ‘Abstract Error’
, Возникает при пересылке

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему



Сообщ.
#1

,
13.12.05, 03:55

    Подскажите, плиз, в чем проблема. Вываливается «Абстрактная ошибка»…

    ExpandedWrap disabled

      procedure ListFileDir(Path: string; FileList: TStrings);

       var

         SR: TSearchRec;

       begin

         if FindFirst(Path + ‘*.*’, faAnyFile, SR) = 0 then

         begin

           repeat

             if (SR.Attr <> faDirectory) then

             begin

               if (sr.Attr and faDirectory)<>0 then FileList.Add(‘+ папка ‘+SR.Name)

               else  if (sr.Attr and faHidden)<>0 then FileList.Add(‘ — файл ‘+SR.Name+’ размер: ‘+inttostr(SR.Size)+’байт — скрытый’)

               else  if (sr.Attr and faSysFile)<>0 then FileList.Add(‘ — файл ‘+SR.Name+’ размер: ‘+inttostr(SR.Size)+’байт — системный’)

               else  FileList.Add(‘ — файл ‘+SR.Name+’ — ‘+inttostr(SR.Size));

             end;

           until FindNext(SR) <> 0;

           FindClose(SR);

         end;

       end;

      var

        subdirs: TStrings;

        separ: ‘#10’;

      if copy(sub_str,1,i-1)=’dirlist’ then

      begin

        sub_str:=copy(s,i+3,length(s)-i+3); // здесь идет значение, например ‘C:’

        subdirs:= TStrings.Create;

        ListFileDir(sub_str, subdirs);

        subdirs.Insert(0,’dirlist’+separ);  // #10 — разделитель в строке

       memStr:=  TMemoryStream.Create;

       memStr.Position:=0;

       subdirs.SaveToStream(memStr);

       memStr.Position:=0;

       Socket.SendStream(memStr);  // здесь отправляется на клиент …

      end

    … но почему то происходит ошибка ‘Abstract Error’ на стороне сервера.
    думаю, что контент не подходит для отправки…. Либо как то не так отправлять надо…


    Яичница



    Сообщ.
    #2

    ,
    13.12.05, 05:36

      Full Member

      ***

      Рейтинг (т): 43

      Замените TStrings на TStringList.

      ExpandedWrap disabled

        var

        subdirs: TStringList;

        ……………………

        subdirs:= TStringList.Create;

        ……………………………

        end

      Цитата

      … но почему то происходит ошибка ‘Abstract Error’ на стороне сервера.

      …. дык…» TStrings contains abstract methods and should not be directly instantiated.»(с)

      Сообщение отредактировано: Тестировщица — 13.12.05, 05:38

      Guru

      Rouse_



      Сообщ.
      #3

      ,
      13.12.05, 06:22

        Moderator

        *******

        Рейтинг (т): 320

        Достаточно вот этой строчки: subdirs:= TStringList.Create;

        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

        0 пользователей:

        • Предыдущая тема
        • Delphi: Сетевое программирование
        • Следующая тема

        [ Script execution time: 0,0260 ]   [ 16 queries used ]   [ Generated: 12.02.23, 22:01 GMT ]  

        Понравилась статья? Поделить с друзьями:
      • Ошибка b1022 infiniti
      • Ошибка abs ступичный подшипник
      • Ошибка b101e opel astra j
      • Ошибка autoit error line 25408
      • Ошибка abs приора 16 клапанов